[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80254":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":23,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":28,"readmeContent":29,"aiSummary":30,"trendingCount":16,"starSnapshotCount":16,"syncStatus":31,"lastSyncTime":32,"discoverSource":33},80254,"tday","unbug\u002Ftday","unbug","All-in-One Harness Agent Terminal","https:\u002F\u002Funbug.github.io\u002Ftday\u002F",null,"TypeScript",108,11,98,72,0,3,10,3.24,"Other",false,"main",true,[25,26,27],"codeagents","harness","harness-ci","2026-06-12 02:04:00","# Tday — All-in-One Harness Agent Terminal\n\n> One terminal for every coding-agent harness — Claude Code, Codex, Copilot CLI, OpenCode, Pi, and more. Browser-style tabs, unified provider config, auto-detected local inference, long-term memory, cross-agent token analytics, and **cross-platform Computer Use** (macOS · Windows · Linux).\n\n[![latest](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Frelease-latest-blue)](https:\u002F\u002Fgithub.com\u002Funbug\u002Ftday\u002Freleases)\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fx.com\u002Fi\u002Fstatus\u002F2049935301808935356\">\n    \u003Cimg\n      width=\"1200\"\n      height=\"800\"\n      alt=\"Tday Demo Video on X\"\n      src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fba6c8041-173f-44bb-90d6-cd72071260df\"\n    \u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg\n    width=\"49%\"\n    alt=\"Tday Screenshot 1\"\n    src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fc196629b-5ee4-46dd-b1e3-d0ba86ab66b9\"\n  \u002F>\n  \u003Cimg\n    width=\"49%\"\n    alt=\"Tday Screenshot 2\"\n    src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F27bf23af-a5f6-4457-8cc7-7f6085829733\"\n  \u002F>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg\n    width=\"49%\"\n    alt=\"Tday Screenshot 3\"\n    src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F9dc6b149-80d4-4175-839a-3102960f2457\"\n  \u002F>\n  \u003Cimg\n    width=\"49%\"\n    alt=\"Tday Screenshot 4\"\n    src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F4990e941-0b65-4d25-9d3e-b46e3dd1f67e\"\n  \u002F>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg\n    width=\"49%\"\n    alt=\"Tday Screenshot 5\"\n    src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F2512a05f-e373-469f-859c-16b745da82a4\"\n  \u002F>\n  \u003Cimg\n    width=\"49%\"\n    alt=\"Tday Screenshot 6\"\n    src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F01c3ef52-3080-4d73-811d-0cb7759d275d\"\n  \u002F>\n\u003C\u002Fp>\n\n---\n## Installation\n\nDownload the latest release for your platform from [Releases](https:\u002F\u002Fgithub.com\u002Funbug\u002Ftday\u002Freleases):\n\n| Platform | Artifact |\n|---|---|\n| macOS (arm64 + x64) | `.dmg` |\n| Windows x64 | `.exe` (NSIS installer) or `.zip` |\n| Linux x64 | `.AppImage` or `.tar.gz` |\n\n### macOS — \"unverified developer\" warning\n\nThe distributed build is **not code-signed** with an Apple Developer certificate. macOS will block the app on first launch. To bypass:\n\n```bash\nxattr -rd com.apple.quarantine \u002FApplications\u002FTday.app\n```\n\nOr: right-click the `.app` → **Open** → click **Open** in the dialog.\n\nOr:\n\n\u003Cimg width=\"968\" height=\"716\" alt=\"Image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F116d2b64-23e6-4a35-8409-1310fe8ecfcd\" \u002F>\n\n### Windows — \"Windows protected your PC\" warning\n\nThe build is **not code-signed** with a Microsoft Authenticode certificate. Windows SmartScreen may show a warning. To bypass:\n\n1. Click **More info** in the SmartScreen dialog.\n2. Click **Run anyway**.\n\n> **Prerequisites:** Tday requires **Node.js (LTS, >=20)** to install and run AI coding agents. Download it from [nodejs.org](https:\u002F\u002Fnodejs.org\u002Fen\u002Fdownload). After installation, make sure `npm` is on your PATH by running `npm --version` in a new terminal — if it works, Tday will also find it.\n\n> **PATH setup:** If you installed agents via `npm install -g \u003Cpackage>`, their `.cmd` wrapper scripts live in `%APPDATA%\\npm`. The Tday installer does not modify your system PATH — the app detects this directory automatically at startup. If Tday can't find an agent, run:\n> ```cmd\n> npm install -g \u003Cagent-package>\n> ```\n> then restart Tday.\n\n### Linux — AppImage\n\nMake the downloaded `.AppImage` executable and run it:\n\n```bash\nchmod +x Tday-*.AppImage\n.\u002FTday-*.AppImage\n```\n\n> **Computer Use on Linux** requires `xdotool`, `wmctrl`, `scrot`, and `tesseract-ocr`:\n> ```bash\n> sudo apt install xdotool wmctrl scrot tesseract-ocr\n> ```\n\n---\n\n## 1. Vision\n\nToday, every coding-agent harness ships with its own CLI, its own provider config, its own memory format, and its own token accounting. Power users juggle Claude Code in one tab, Codex in another, Copilot CLI in a third, OpenCode in a fourth — each a separate terminal, each re-keyed, each forgetful.\n\n**Tday** is the missing meta-layer:\n\n- **Open agents in tabs** the way you open URLs in a browser. `Cmd+T` for a new agent, drag-to-reorder, persistent sessions.\n- **One provider config** (DeepSeek, OpenRouter, Anthropic, OpenAI, …) injected into whichever agent you launch.\n- **Auto-discover local inference** servers (Ollama, LM Studio, llama.cpp, vLLM) on your LAN\u002Floopback and surface them as first-class providers.\n- **Unified long-term memory** shared across agents (with per-agent scoping when you want it).\n- **Cross-agent token analytics** — finally know what each harness actually costs.\n- **Buttery UX** with `border-beam` accents, native PTY performance, and a Rust core for the hot paths.\n\n---\n\n## 2. Key Features\n\n| # | Feature | Description |\n|---|---|---|\n| 1 | **Computer Use** (macOS · Windows · Linux) | Give any agent hands on your desktop — **no vision model required**. Uses native Accessibility APIs to read and control any app directly, without screenshots. One-click enable for **Claude Code, Codex, Gemini, OpenCode, and Pi**. Agents can click UI elements, type, scroll, open apps, control Chrome via CDP, and fall back to OCR when needed. Built-in **Computer Operator** CoWorker + one-click permission setup. Runs natively on **macOS (arm64 + x64)**, **Windows x64**, and **Linux x64**. |\n| 2 | **Multi-tab workspace** | Open any agent in browser-style tabs, drag to reorder, multi-row wrap, per-tab working directory with cwd commit and last-cwd persistence. |\n| 3 | **10 AI agent adapters** | Pi, Claude Code, Codex CLI, GitHub Copilot CLI, OpenCode, Gemini CLI, Qwen-Code, Crush, Hermes, DeepSeekTUI — each with auto-detect, one-click install, and per-agent accent color. |\n| 4 | **CoWorker system** | Reusable role personas injected as system prompts — selected per tab from the CwdBar. 35 built-in presets across 7 categories sourced from [`CoWorkers.md`](.\u002FCoWorkers.md), or your own custom\u002Fonline CoWorkers. Community contributions welcome. |\n| 5 | **Cron job scheduler** | Schedule automated agent tasks with Interval \u002F At Time \u002F Custom cron modes. Human-readable preview, enable\u002Fdisable, clone, delete, and a live dashboard with next-run countdown and last-status. |\n| 6 | **28-provider settings panel** | CRUD UI for DeepSeek, OpenAI, Anthropic, Gemini, xAI, Groq, Mistral, Ollama, LM Studio, OpenRouter, and 18 more — supports both OpenAI-compatible and Anthropic-compatible base URLs. |\n| 7 | **Per-agent provider & model binding** | Each agent tab runs on a different provider and model. Model flags are projected to CLI arguments at spawn time. Shared-config \"all agents one provider\" toggle also available. |\n| 8 | **Local inference auto-discovery** | TCP + HTTP fingerprint scan for Ollama, LM Studio, vLLM, llama.cpp, SGLang, LocalAI, Jan. Discovered models appear as chips in the provider UI. Manual base-URL probe available. |\n| 9 | **Cross-agent usage analytics** | Complete token and cost tracking for every agent and every session. Daily bar chart, by-model and by-agent breakdown tables, 30+ model pricing — all stored locally in SQLite. |\n| 10 | **Unified agent history** | Every session across all agents is automatically indexed. Browse, search, and restore any past conversation — including working directory and session ID — with one click. |\n| 11 | **Agent-native session resume** | Claude Code (`--resume`), Codex (`resume \u003Cid>`), OpenCode (`--session`), DeepSeekTUI (`resume \u003Cid>`) — session IDs are captured automatically and offered on tab restore. |\n| 12 | **Reliable prompt delivery** | Task prompts reach the agent at spawn time even when the screen is locked: CLI arg for Codex \u002F Claude Code \u002F Gemini \u002F Qwen-Code \u002F DeepSeekTUI; bracketed-paste PTY write for Pi \u002F Copilot \u002F Crush \u002F Hermes. |\n| 13 | **DeepSeek Anthropic gateway proxy** | In-process HTTP server translating OpenAI Responses API → Anthropic Messages API: streaming, extended thinking, tool use, multi-turn — no harness patching required. |\n| 14 | **Keep Awake** | One-click toggle to block system sleep during long agent jobs, without affecting screen dimming. |\n| 15 | **In-app update checker** | Green dot badge and download link when a new version is available — checked 10 s after launch then every 30 min. |\n| 16 | **Cross-platform** | macOS (arm64 + x64), Windows, Linux. PATH augmentation for nvm-windows, Volta, fnm. Correct PTY dimensions on all platforms. |\n\n---\n\n## 3. Architecture\n\n```mermaid\nflowchart TB\n    subgraph Presentation[\"🖥  Presentation Layer · React · Vite · TypeScript\"]\n        direction LR\n        TM[\"Tab Manager\\nbrowser-style tabs\"]\n        TV[\"Terminal View\\nxterm.js + WebGL\"]\n        UI[\"Agent Picker · Settings\\nUsage Dashboard · Cron\"]\n        KIT[\"Tailwind · shadcn\u002Fui\\nborder-beam\"]\n    end\n\n    subgraph Application[\"⚡  Application Layer · Electron Main · Node.js\"]\n        direction LR\n        SS[\"Session Service\\nnode-pty · one PTY \u002F tab\"]\n        AA[\"Agent Adapters\\n10 harnesses\"]\n        PS[\"Provider Service\\nenv-var injection · 28 providers\"]\n        IB[\"IPC Bridge\\ntyped contextBridge channels\"]\n        GW[\"Gateway\\nOpenAI Responses API → Anthropic\"]\n    end\n\n    subgraph Infrastructure[\"🦀  Infrastructure Layer · Rust\"]\n        direction LR\n        subgraph CORE[\"tday-core · static binary · JSON-RPC \u002F stdio\"]\n            direction TB\n            SC[\"Inference Scanner\\nOllama · LM Studio · vLLM · llama.cpp · SGLang\"]\n            TC[\"Token Counter · Memory Store\\ntiktoken-rs · SQLite + sqlite-vec\"]\n            UL[\"Usage Logger · Config & Secrets\\nper-agent \u002F per-provider · OS keychain\"]\n        end\n        subgraph NC[\"tday-nativecore · MCP server · Streamable HTTP\"]\n            direction TB\n            AX[\"AX Tree · OCR · Mouse · Keyboard · Screenshot\\nmacOS (Vision) · Windows (WinRT) · Linux (Tesseract)\"]\n            CDP[\"CDP · Android ADB · Launcher · System\\nprobe_app · cdp_click · adb_tap · execute_command · clipboard\"]\n        end\n    end\n\n    Presentation \u003C-->|\"IPC · contextBridge\"| Application\n    Application -->|\"JSON-RPC \u002F stdio\"| CORE\n    Application -->|\"Streamable HTTP \u002F MCP\"| NC\n```\n\n### Why this split\n\n| Concern | Where | Why |\n|---|---|---|\n| Window, tabs, UI | Electron + React | Mature, fast iteration, rich ecosystem. |\n| PTY spawning | Electron main (node-pty) | Battle-tested, full TTY semantics, integrates cleanly with xterm.js. |\n| Detection \u002F tokenization \u002F memory | Rust (`tday-core`) | CPU-bound, must not block UI. Static binary, easy to ship & cross-compile. |\n| Computer Use tools (AX, OCR, mouse, CDP) | Rust (`tday-nativecore`) | macOS: Accessibility + Vision + CGEvent. Windows: UIA + SendInput + GDI + WinRT OCR. Linux: X11\u002FXTest + XRandR + scrot + Tesseract. Zero overhead on the Node event loop. |\n| Provider secrets | OS keychain via Rust | Avoid plaintext in app data; cross-platform. |\n\n### Gateway — OpenAI Responses API → Anthropic proxy\n\nSome harnesses (e.g. Codex) only speak the **OpenAI Responses API**. Tday ships a lightweight in-process HTTP gateway that transparently translates those calls to the **Anthropic Messages API**, enabling DeepSeek and any other Anthropic-compatible provider to be used with every harness without patching the harness.\n\n```\nHarness (Codex)              Main Process\n       │  POST \u002Fv1\u002Fresponses      │\n       │ ─────────────────────▶  │\n       │                   bridge\u002Finput   (OpenAI Responses → Anthropic Messages)\n       │                   bridge\u002Ftools   (tool \u002F tool-choice conversion)\n       │                   deepseek\u002F      (thinking-block encode\u002Fdecode, V4 mutations)\n       │                   anthropic\u002F     (HTTP POST + SSE stream from provider)\n       │                   bridge\u002Fstream  (Anthropic SSE → OpenAI SSE events)\n       │  SSE stream              │\n       │ ◀─────────────────────  │\n```\n\n**Module map** (`apps\u002Fdesktop\u002Fsrc\u002Fmain\u002Fgateway\u002F`):\n\n| Module | Responsibility |\n|---|---|\n| `adapter.ts` | Express server, request dispatch, error handling |\n| `types.ts` | Shared gateway interfaces (Request, Response, …) |\n| `anthropic\u002Ftypes.ts` | Anthropic Messages API type definitions |\n| `anthropic\u002Fclient.ts` | HTTP client, SSE tokeniser |\n| `openai\u002Ftypes.ts` | OpenAI Responses API type definitions |\n| `bridge\u002Finput.ts` | Convert OpenAI input items → Anthropic messages array |\n| `bridge\u002Ftools.ts` | Convert OpenAI tools → Anthropic ATool[], apply DeepSeek mutations |\n| `bridge\u002Fresponse.ts` | Convert Anthropic non-streaming response → OpenAI output |\n| `bridge\u002Fstream.ts` | Convert Anthropic SSE events → OpenAI Responses API SSE |\n| `deepseek\u002Fthinking.ts` | Encode \u002F decode extended thinking blocks (prefix-based) |\n| `deepseek\u002Fstate.ts` | Per-session LRU cache for (thinking, signature) pairs |\n\n\n\nEvery harness is a thin adapter:\n\n```ts\ninterface AgentAdapter {\n  id: string;                          \u002F\u002F \"pi\" | \"claude-code\" | \"codex\" | \"opencode\"\n  displayName: string;\n  detect(): Promise\u003CDetectResult>;     \u002F\u002F is the binary on PATH? version?\n  buildLaunch(ctx: LaunchContext): {   \u002F\u002F how to start it in a PTY\n    cmd: string;\n    args: string[];\n    env: Record\u003Cstring, string>;       \u002F\u002F provider keys, base URLs, etc.\n    cwd: string;\n  };\n  parseUsage?(stream: string): UsageDelta | null; \u002F\u002F optional: scrape token usage\n}\n```\n\n### Tab = Session\n\nA **Tab** owns one **Session** = one PTY process bound to one agent adapter, one provider profile, and one working directory. Tabs persist across app restarts (process state does not; transcript does).\n\n---\n\n## 4. Long-term Roadmap\n\n| Version | Theme | Highlights |\n|---|---|---|\n| ~~**v0.1.0**~~ ✅ | _Walk_ — Pi end-to-end | Single-tab MVP. Spawn the `pi` agent in a PTY tab. Static provider config from a JSON file. Border-beam shell. |\n| ~~**v0.2.0**~~ ✅ | Multi-agent, multi-tab | Adapters for Claude Code, Codex, Copilot CLI, OpenCode. Tab manager (open\u002Fclose\u002Freorder\u002Fduplicate). Per-tab cwd picker. |\n| ~~**v0.3.0**~~ ✅ | Providers UI + Gateway | Settings panel for 28+ cloud\u002Flocal providers. DeepSeek Anthropic gateway proxy (OpenAI Responses API → Anthropic). Per-agent model override. |\n| ~~**v0.3.x**~~ ✅ | Multi-agent UI overhaul + Tab History | 9 agent adapters (Crush, Hermes, Qwen-Code added). Per-agent accent colors. Logo dropdown (History, Keep Awake, Usage, Settings). Closed-tab history with one-click restore. Agent-native session resume (claude-code `--resume`, codex `resume`, opencode `--session`). Conversation history replayed on restore. Windows PATH augmentation (nvm-windows, volta, fnm). |\n| ~~**v0.4.x**~~ ✅ | Local-inference + UX Polish | Local service discovery (Ollama, LM Studio, vLLM, llama.cpp, SGLang). Usage analytics dashboard (SQLite store, 30+ model pricing, summary cards, daily chart, by-model\u002Fagent tables). Settings redesign: History tab, resizable dialog, lazy-mount. Tab title smart clip + hover tooltip, last-active restore on restart. In-app update checker with green-dot badge. claude-code width + double-SIGWINCH fix. Windows menu fix. Electron drag-region fix. |\n| ~~**v0.5.x**~~ ✅ | Cron & Automation | **Settings → Cron** tab: job list with enable\u002Fclone\u002Fdelete, ScheduleWidget (Interval \u002F At time \u002F Custom cron with datetime picker), human-readable schedule preview. Cron scheduler in main process (node-cron, persistent JSON store, per-job stats). `initialPrompt` delivered reliably at spawn time: CLI positional arg for codex \u002F claude-code \u002F opencode \u002F gemini \u002F qwen-code; bracketed-paste PTY write (XTerm `ESC[200~`) for pi \u002F copilot \u002F hermes \u002F crush — works even when screen is locked. OpenCode `run` subcommand fix. Job dashboard with next-run countdown, run count, last-status. |\n| ~~**v0.6.0**~~ ✅ | Token usage analytics | Dashboard UI: summary cards, daily bar chart, by-model and by-agent breakdown (SQLite store, 30+ model pricing). |\n| ~~**v0.6.x**~~ ✅ | CoWorker system | **Settings → CoWorkers** tab: create\u002Fedit\u002Fdelete role personas injected as system prompts. Three source types: built-in (`builtin:*` from AGENT.md), online (`online:*` URL-cached from GitHub), custom (inline text \u002F local file \u002F URL). Three curated presets (Karpathy Code Guidelines, Devin-style Planner, Earnings Call Analyst). CoWorker dropdown in CwdBar — select per tab, prompt injected immediately into the running PTY. CoWorker binding in Cron jobs. Settings dialog tabs now top-tab style; backdrop `no-drag` fix so tabs are always clickable even when TabBar wraps to multiple rows. |\n| ~~**v0.7.x**~~ ✅ | CoWorker Registry + Data Freshness | CoWorker registry expanded to **35 built-in presets across 7 categories** (Mental Models, Startup & Business, Coding & Engineering, Writing & Content, Research & Analysis, Security & Privacy, Productivity). GitHub ★ stars on cards and detail view (24 h TTL cache). Unique ID derivation per entry (`deriveRegistrySlug`). Online refresh button with spinner + error state. **App-level state lifting**: agents \u002F coworkers \u002F providers owned by App root, passed as props to Settings — eliminates IPC stutter on every Settings open. `requestIdleCallback` background refresh after Settings closes (5 s timeout fallback). New-tab provider submenu now includes all preset models alongside discovered & user-added models. |\n| ~~**v0.8.x**~~ ✅ | Computer Use | **Settings → Computer Use** tab: one-click enable per agent. `tday-nativecore` Rust binary injected as MCP server (stdio). **20+ tools**: AX tree (`take_ax_snapshot`, `ax_click`, `ax_set_value`, `ax_perform_action`), OCR (`find_text` with multi-display CGDirectDisplayID, `ocr_screenshot`), mouse\u002Fkeyboard (`click`, `double_click`, `right_click`, `type_text`, `shortcut`, `scroll`, `drag`), screenshot (`take_screenshot`), CDP (`probe_app`, `cdp_connect`, `cdp_find_elements`, `cdp_click`, `cdp_fill`), Android ADB (`adb_tap`, `adb_key`), app launcher (`open_app`). Decision-tree skill: AX first → visual fallback → CDP last resort. **Computer Operator** built-in CoWorker preset. Permissions panel (Accessibility + Screen Recording) with always-visible Grant buttons + manual path instructions. macOS arm64 + x64. |\n| ~~**v0.9.x**~~ ✅ | Cross-platform Computer Use + Web Tools | **Windows**: UIA (IUIAutomation) AX tree, SendInput mouse\u002Fkeyboard, BitBlt\u002FGDI screenshots, WinRT OCR. **Linux**: X11\u002FXTest input, XRandR display, scrot + XGetImage screenshots, Tesseract OCR, wmctrl window management. Same 20+ MCP tools on all 3 platforms. GitHub Actions CI now builds and packages **macOS arm64 + Windows x64 + Linux x64** on every tag push. |\n| **v0.10.0** | MCP Management | MCP server registry in Settings (add\u002Fedit\u002Fremove, stdio & SSE transports). Auto-discover running local MCP processes. Per-agent MCP binding. Bundled quick-add servers: filesystem, memory, fetch, git. |\n| **v0.11.0** | Skills & Custom Instructions | Per-agent, per-project skill files (`AGENTS.md`, `SKILL.md`, `.instructions.md`). Global skills library in Settings. Skill injection at spawn time. Skill marketplace (import from URL \u002F GitHub). |\n| **v0.12.0** | Channels Management | Named I\u002FO channels in Settings: pipe agent stdout to files, webhooks, or other agents. Fan-out (broadcast one agent's output to multiple sinks). Fan-in (merge streams from multiple agents into one tab). |\n| **v0.13.0** | Custom Agents | `AgentAdapter` public package. Register third-party agents via manifest URL or local path. Agents tab shows community adapters with one-click install. Custom system-prompt per agent. |\n| **v0.14.0** | Unified long-term memory | SQLite + `sqlite-vec` embedding store. Background embed worker (Rust). MCP server `tday-memory` (`recall` \u002F `remember` \u002F `forget`). Per-project + global scopes. Memory browser + prune UI. |\n| **v0.15.0** | Performance & polish | xterm WebGL renderer. Lazy-render inactive tabs. Session snapshot\u002Frestore. Memory budget warnings. Profiling page (CPU\u002FRSS\u002Fhandles). |\n| **v1.0.0** | GA | Auto-update (Squirrel), signed & notarised builds for macOS\u002FWindows\u002FLinux, full docs site, telemetry opt-in. |\n\n---\n\n## 5. Detailed Task Breakdown\n\n### v0.1.0 — Pi end-to-end ✅\n\nThe acceptance criterion: **`npm run dev` opens a window with one tab running the `pi` agent in a real PTY; typing works, output streams, resizing works, closing the tab kills the process cleanly.**\n\n- [x] Repo scaffold\n  - [x] Decide stack & layout\n  - [x] Write this README\n- [x] **App skeleton** (`apps\u002Fdesktop`)\n  - [x] Electron main + preload + renderer in TypeScript\n  - [x] Vite for renderer dev\u002Fbuild\n  - [x] Tailwind + shadcn\u002Fui base\n  - [x] `border-beam` component (magicui-port) on app frame\n- [x] **PTY + terminal**\n  - [x] `node-pty` integration in main\n  - [x] `xterm.js` in renderer with fit + web-links addons\n  - [x] Bidirectional IPC: `pty:spawn`, `pty:write`, `pty:resize`, `pty:data`, `pty:exit`\n- [x] **Tab shell** (multi-tab from the start)\n  - [x] `Tab` and `Session` data model\n  - [x] `Cmd+W` \u002F close button kills the PTY\n- [x] **Pi adapter** (`packages\u002Fadapters\u002Fpi`)\n  - [x] `detect()` — `which pi` + `pi --version`\n  - [x] `buildLaunch()` — reads provider profile, sets env, args\n  - [x] Configurable binary path\n- [x] **Provider profile (static JSON)**\n  - [x] `~\u002F.tday\u002Fproviders.json` seeded on first launch\n  - [x] Loaded at launch, injected via env\n- [ ] **Rust core stub** (`crates\u002Ftday-core`)\n  - [ ] `cargo new --bin`, prints version on `--version`\n  - [ ] `tday-core detect` — JSON-RPC stub for v0.4.0\n  - [ ] Wired into the Electron build so the binary ships next to the app\n- [x] **DX**\n  - [x] `pnpm dev` launches everything\n  - [x] `pnpm build` produces signed-null `.dmg` + `.zip` for arm64 and x64\n  - [ ] CI: lint + typecheck + `cargo check`\n\n### v0.2.0 — Multi-agent, multi-tab ✅\n- [x] Adapters: `pi`, `claude-code`, `codex`, `copilot`, `opencode` (install \u002F update \u002F uninstall via `npm i -g`)\n- [x] Tab bar with drag-reorder + multi-row wrap\n- [x] Split new-tab button: default agent on click, dropdown chevron picker for any installed harness\n- [x] Configurable default agent in Settings → Agents\n- [x] Per-tab cwd staging + commit (Enter \u002F Apply ↵ \u002F Browse), restart-on-commit, last-cwd persistence\n- [x] **Persist open tabs across restart** (id, title, agent, cwd)\n- [ ] Transcript snapshots (carry scrollback across restart)\n- [ ] `Cmd+T` \u002F `Cmd+Shift+T` keyboard shortcuts\n\n### v0.3.0 — Providers UI + Gateway ✅\n- [x] CRUD UI for provider profiles (sidebar list + \"+ Add provider\" picker, default-expanded)\n- [x] Built-in templates for **28 vendors** (OpenClaw mirror): DeepSeek, OpenAI, Anthropic, Google Gemini, xAI, Groq, Mistral, Moonshot, Cerebras, Together, Fireworks, Z.AI, Qwen, Volcengine, MiniMax, StepFun, OpenRouter, NVIDIA NIM, Hugging Face, Perplexity, Amazon Bedrock, SGLang, vLLM, Ollama, LM Studio, Vercel AI Gateway, LiteLLM, Custom\n- [x] Dual base-URL selector (OpenAI-compatible vs Anthropic-compatible) for **every** provider\n- [x] Latest-models dropdown per provider (freeform input still allowed)\n- [x] Per-agent provider binding + per-agent model override (CLI flag projection — Codex \u002F Claude \u002F OpenCode honour Tday's model setting)\n- [x] \"Use one provider\u002Fmodel for all agents\" shared-config toggle\n- [x] **DeepSeek Anthropic gateway proxy** — in-process HTTP server translating OpenAI Responses API → Anthropic Messages API; supports streaming, extended thinking, tool use, multi-turn (113 unit tests, 12 modules)\n- [ ] Secrets via Rust `keyring` crate (currently plaintext `~\u002F.tday\u002Fproviders.json`)\n- [ ] Per-tab provider override + \"last-used\" memory\n\n### v0.4.0 — Local-inference autodetect + UX Polish ✅\n- [x] TypeScript probe system (`discovery\u002Fprobe.ts`, `specs.ts`, `index.ts`)\n  - [x] TCP pre-filter then HTTP fingerprint for each service\n  - [x] Ollama: `GET \u002Fapi\u002Ftags` → `models[].name`\n  - [x] LM Studio: `GET \u002Fv1\u002Fmodels` → `data[].id` (port 1234)\n  - [x] vLLM: `GET \u002Fv1\u002Fmodels` (port 8000)\n  - [x] llama.cpp \u002F LocalAI \u002F Jan: `GET \u002Fv1\u002Fmodels` (port 8080 \u002F 8080 \u002F 1337)\n  - [x] SGLang: `GET \u002Fv1\u002Fmodels` (port 30000)\n  - [x] LAN host probe: configurable extra hosts + optional \u002F24 subnet sweep\n- [x] `probeBaseUrl` for manual base-URL scan (tries `\u002Fmodels`, `\u002Fv1\u002Fmodels`, `\u002Fapi\u002Ftags`)\n- [x] IPC channel `discovery:probe-url` wired in main process\n- [x] Settings UI: Scan button + latency badge + discovered-model chips + `discoveredModels` persistence\n- [x] Usage analytics backend + **full dashboard UI**\n  - [x] `usage\u002Fstore.ts` — SQLite-backed append + query\n  - [x] `usage\u002Fpricing.ts` — per-model cost table for 30+ providers\n  - [x] IPC channels `usage:append` \u002F `usage:query`\n  - [x] Left sidebar (period filter: today\u002F7d\u002F30d\u002F90d\u002Fcustom, agent filter, refresh)\n  - [x] Right panel: 3-column summary cards, daily bar chart, by-model table, by-agent table\n- [x] **Settings redesign**\n  - [x] History tab: agent sidebar, full-text search, time-based grouping, restore \u002F hide entries\n  - [x] Resizable dialog (drag handle)\n  - [x] Lazy-mount (first open only) + `startTransition` for low-priority render\n  - [x] Provider list fills remaining height; Add provider pinned at bottom, default expanded\n- [x] **Tab UX**\n  - [x] Tab title CSS-clip (`max-w`) with full title on hover tooltip\n  - [x] Last-active tab persisted and restored on restart; active tab sorted first in DOM\n- [x] **Terminal fixes**\n  - [x] claude-code terminal width: RAF before spawn ensures font metrics; `COLUMNS`\u002F`LINES` env vars as fallback\n  - [x] Double-SIGWINCH bug fixed: removed duplicate resize from active-tab effect; `ResizeObserver` guard for hidden containers\n- [x] **In-app update checker** — GitHub releases API after 10 s then every 30 min; green dot badge on gear button; GitHub + releases links in menu\n- [x] **Platform \u002F UX fixes**\n  - [x] Windows: keep full menu, hide Logo only on win32\n  - [x] All dropdowns marked `no-drag` to prevent Electron drag-region swallowing hover events\n  - [x] Menu close delay 500 ms + padding bridge to keep submenus reachable\n  - [x] Keep Awake uses `prevent-app-suspension` only (no screen-dim side-effect)\n  - [x] History entries show full `year · month · day · HH:MM`\n  - [x] `openExternal` IPC (https-only) for in-app browser links\n- [ ] Rust scanner (`tday-core`) — TCP probe + HTTP fingerprint in native binary\n- [ ] mDNS\u002FBonjour discovery for LAN servers\n- [ ] Toast notification “Found Ollama with N models — add as provider?”\n- [ ] Background watch loop with exponential back-off\n\n### ~~v0.5.x — Cron & Automation~~ ✅\n- [x] **Settings → Cron** tab — job list sidebar with enable toggle, edit, clone, delete\n- [x] **ScheduleWidget** — three modes: Interval (every N min\u002Fhour\u002Fday), At time (H:M + Daily\u002FWeekdays\u002FWeekly\u002FMonthly), Custom (datetime-local picker auto-fills expr + raw cron input)\n- [x] Human-readable schedule preview (`Every weekday at 09:00  0 9 * * 1-5`)\n- [x] **`cron.ts`** main-process scheduler — `node-cron`, persistent JSON store, per-job run stats (lastRunAt, nextRunAt, runCount, lastStatus)\n- [x] **Job dashboard** — summary cards per job, next-run countdown, last-status badge, manual ▶ Run, Refresh\n- [x] `initialPrompt` on `SpawnRequest` — prompt flows renderer → main without any renderer-side setTimeout\n  - [x] CLI positional arg for `codex` \u002F `claude-code` \u002F `opencode run` \u002F `gemini` \u002F `qwen-code`\n  - [x] Bracketed-paste PTY write (`ESC[200~…ESC[201~`) for `pi` \u002F `copilot` \u002F `crush` \u002F `hermes` — works even when screen is locked\n- [x] OpenCode `run` subcommand fix (positional was misinterpreted as project path)\n- [x] Clone cron job (Copy of X, enabled:false, opens in editor)\n- [x] Cron UI theme: `datetime-local` input uses `input-date` class (dark `color-scheme` + fuchsia calendar icon)\n\n### v0.6.0 — Token usage analytics ✅\n- [x] Dashboard UI: summary cards, daily chart, by-model and by-agent breakdown\n- [ ] Per-tab usage mini-badge (tokens \u002F estimated cost)\n- [ ] Adapter `parseUsage()` hooks scraping token counts from agent output\n- [ ] Live cost estimation using pricing table\n- [ ] CSV \u002F JSON export\n- [ ] Budget alerts (configurable per-agent \u002F global cap)\n\n### ~~v0.6.x — CoWorker system~~ ✅\n- [x] **CoWorker data model** — three kinds: `builtin:*` (AGENT.md), `online:*` (URL-cached from GitHub), `custom:*` (inline \u002F file \u002F URL)\n- [x] **Settings → CoWorkers** tab — full CRUD: create, edit, delete, preview system prompt\n- [x] **Three curated presets** (non-deletable, English names):\n  - [x] 🧠 Karpathy Code Guidelines (`online:karpathy`)\n  - [x] 🤖 Devin-style Planner (`online:devin-planner`)\n  - [x] 📈 Earnings Call Analyst (`online:earnings-analyst`)\n- [x] **CoWorker dropdown in CwdBar** — per-tab single-select; selecting a CoWorker immediately writes its system prompt into the running PTY (`window.tday.write`)\n- [x] **CoWorker binding in Cron jobs** — system prompt prepended to task prompt at spawn (`buildEffectivePrompt`)\n- [x] **CoWorker binding at spawn** — `coworkerId` on `SpawnRequest`; main process calls `buildEffectivePrompt` before PTY launch\n- [x] Settings tab bar: top-tab style (`rounded-t`) replacing pill-style tabs\n- [x] Settings dialog backdrop: `no-drag` fix — tabs always clickable even when TabBar wraps to multiple rows\n- [x] Settings dialog: lazy `dialogSize` init capped to viewport + `overflow-y-auto` so tabs are never pushed above visible area\n\n### ~~v0.7.x — CoWorker Registry + Data Freshness~~ ✅\n- [x] **CoWorker registry** expanded to 35 built-in presets across 7 categories:\n  - [x] 🧠 Mental Models (5 presets)\n  - [x] 🚀 Startup & Business (5 presets)\n  - [x] 💻 Coding & Engineering (6 presets)\n  - [x] ✍️ Writing & Content (5 presets)\n  - [x] 🔍 Research & Analysis (5 presets)\n  - [x] 🔒 Security & Privacy (4 presets)\n  - [x] ⚡ Productivity (5 presets)\n- [x] **GitHub ★ stars** displayed on CoWorker cards and detail view (24 h TTL cache, `refreshGitHubStars`)\n- [x] **Unique ID derivation** (`deriveRegistrySlug`) — path-based discriminator prevents ID collisions for repos with generic filenames (system.md, index.md)\n- [x] **Online registry refresh** button with spinner and error display; `loadRegistryPresets()` prefers the source with more entries (bundled vs cache)\n- [x] **CronSection Refresh button** moved to sidebar footer — same row as \"Add cron job\" (icon-only)\n- [x] **App-level state lifting** — agents \u002F coworkers \u002F providers owned by App root, passed as props to Settings\n  - [x] Eliminates slow `listAgents()` IPC call on every Settings open (subprocess spawns for tool detection)\n  - [x] `useEffect([open])` in Settings now only fetches fast\u002Ftime-sensitive data (cron + `getAllSettings`)\n  - [x] Prop → local state sync effects for `agentsProp` \u002F `cfgProp` to receive background updates\n- [x] **`requestIdleCallback` background refresh** after Settings closes — silently re-fetches agents + coworkers + providers during browser idle time (5 s forced timeout fallback)\n- [x] **New-tab provider submenu** now includes all preset models (`presetForKind(p.kind)?.models`) alongside `discoveredModels` and `extraModels`\n\n### v0.7.0 — MCP Management\nMCP (Model Context Protocol) lets agents use tools, access resources, and receive prompts from external servers. Tday becomes the central registry for all MCP connections — configure once, available everywhere.\n\n- [ ] **Settings → MCP Servers** tab\n  - [ ] Add \u002F edit \u002F remove MCP server entries (name, transport, command \u002F URL, args, env)\n  - [ ] Transport types: `stdio` (local process), `SSE` (remote HTTP), `streamable-http`\n  - [ ] Per-server connection test + status badge\n- [ ] **Auto-discovery** of running local MCP processes (scan well-known ports, inspect `mcp.json`)\n- [ ] **Per-agent MCP binding** — choose which MCP servers each agent starts with\n- [ ] **Bundled quick-add server cards** in Settings:\n  - [ ] `@modelcontextprotocol\u002Fserver-filesystem` — local file access\n  - [ ] `@modelcontextprotocol\u002Fserver-memory` — persistent key-value memory\n  - [ ] `@modelcontextprotocol\u002Fserver-fetch` — HTTP fetch \u002F web page reader\n  - [ ] `@modelcontextprotocol\u002Fserver-git` — Git log \u002F diff \u002F blame\n- [ ] Inject `--mcp-config \u003Cjson>` into Claude Code \u002F `opencode` \u002F `gemini` at spawn time\n- [ ] MCP server log viewer inside the app\n\n### v0.7.1 — Channels Management\nNamed I\u002FO channels let you wire agent outputs to external sinks or other agents — turning Tday into a lightweight multi-agent orchestrator.\n\n- [ ] **Settings → Channels** tab\n  - [ ] Create \u002F edit \u002F delete named channel definitions\n  - [ ] Channel types: `file` (append to log), `webhook` (HTTP POST), `agent` (pipe to another tab)\n  - [ ] Per-channel filter: regex \u002F glob on stdout lines\n  - [ ] Channel enable\u002Fdisable toggle\n- [ ] **Fan-out** — one agent’s output broadcast to multiple sinks simultaneously\n- [ ] **Fan-in** — merge stdout from multiple agents\u002Ftabs into a single virtual tab\n- [ ] **Live channel inspector** — real-time stream preview in a side panel\n- [ ] Per-tab channel binding (drag-and-drop tab onto channel)\n- [ ] Persist channel config to `~\u002F.tday\u002Fchannels.json`\n\n### v0.7.2 — Custom Agents\nMake `AgentAdapter` a public package so the community can ship their own agent integrations.\n\n- [ ] Publish `@tday\u002Fadapter-sdk` (TypeScript types + test harness)\n- [ ] Agent manifest format (`tday-adapter.json`): id, displayName, detect, launch, parseUsage\n- [ ] **Settings → Agents** → “Community adapters” section\n  - [ ] Install from npm package name\n  - [ ] Install from local path \u002F manifest URL\n  - [ ] Update \u002F remove installed community adapters\n- [ ] Custom system-prompt per agent (injected before every session)\n- [ ] Adapter sandbox: run with `--no-asar` + restricted IPC subset\n\n### ~~v0.8.x — Computer Use~~ ✅\n- [x] **Settings → Computer Use** tab — enable\u002Fdisable per agent; shows supported agents (Claude Code, Codex, Gemini, OpenCode, Pi)\n- [x] **`tday-nativecore`** Rust MCP stdio server injected into agent configs at spawn:\n  - [x] claude-code: per-session temp settings file (`mcpServers`)\n  - [x] gemini: `~\u002F.gemini\u002Fsettings.json` (ref-counted, safe concurrent sessions)\n  - [x] opencode: `opencode.json` `mcp.servers` (ref-counted)\n  - [x] codex: `~\u002F.codex\u002Fconfig.json` `mcpServers` (ref-counted)\n  - [x] pi: `~\u002F.pi\u002Fagent\u002Fconfig.json` `mcpServers` + skill file at `~\u002F.pi\u002Fagent\u002Fskills\u002Ftday-computer-use\u002FSKILL.md`\n- [x] **AX tools**: `take_ax_snapshot`, `ax_click`, `ax_set_value`, `ax_select`, `ax_perform_action`\n- [x] **OCR tools**: `find_text` (Apple Vision, multi-display via CGDirectDisplayID), `ocr_screenshot`\n- [x] **Mouse\u002Fkeyboard**: `click`, `double_click`, `right_click`, `type_text`, `shortcut`, `scroll`, `drag`\n- [x] **Screenshot**: `take_screenshot` (per display, stable CGDirectDisplayID — fixes external monitor detection)\n- [x] **CDP tools**: `probe_app`, `cdp_connect`, `cdp_find_elements`, `cdp_click`, `cdp_fill`\n- [x] **Android ADB**: `adb_tap`, `adb_key`, `adb_screenshot`\n- [x] **Launcher**: `open_app`\n- [x] **`COMPUTER_USE_SKILL`** injected as system prompt: decision tree (AX → visual → CDP), tool descriptions, reliability rules — **no `take_screenshot` as default first step**\n- [x] **Computer Operator** built-in CoWorker preset (`builtin:computer-use-operator`)\n- [x] **Permissions panel** — Accessibility + Screen Recording with always-visible Grant buttons, manual path instructions (\"System Settings → Privacy & Security → …\"), `checkPermissions` IPC, `requestPermission` IPC\n- [x] Self-signed cert for CI signing (hardcoded in `release.yml`) — prevents macOS TCC re-prompting on every update\n\n### ~~v0.9.x — Cross-platform Computer Use~~ ✅\nWindows and Linux now have full feature parity with macOS Computer Use — same 20+ MCP tools, same API surface.\n\n- [x] **Windows platform** (`crates\u002Ftday-nativecore\u002Fsrc\u002Fplatform\u002Fwindows\u002F`)\n  - [x] `uia.rs` — IUIAutomation AX tree (`take_ax_snapshot`), coordinate-based `AXRef`, `ax_click \u002F ax_set_value \u002F ax_perform_action`\n  - [x] `input.rs` — `SendInput` mouse\u002Fkeyboard; Unicode text input; all modifier keys and function keys\n  - [x] `display.rs` — `EnumDisplayMonitors` multi-monitor, DPI-aware coordinate mapping (Per-Monitor V2)\n  - [x] `screenshot.rs` — BitBlt\u002FGDI capture (full screen \u002F region \u002F window), `image` crate PNG+JPEG encoding\n  - [x] `ocr.rs` — WinRT `Windows.Media.Ocr` (Windows 10 1903+), word-level bounding boxes\n  - [x] `window.rs` — `EnumWindows`, DWM extended frame bounds, per-window PID\n  - [x] `app.rs` — `EnumProcesses` app list, `cmd \u002Fc start` launcher, `TerminateProcess`, wmctrl-style `SetWindowPos`\n- [x] **Linux platform** (`crates\u002Ftday-nativecore\u002Fsrc\u002Fplatform\u002Flinux\u002F`)\n  - [x] `input.rs` — X11 XTest (`XTestFakeButtonEvent`, `XTestFakeKeyEvent`, `XTestFakeMotionEvent`); `xdotool type` for Unicode\n  - [x] `display.rs` — XRandR CRTC enumeration; `GDK_SCALE` fractional scale support\n  - [x] `screenshot.rs` — `scrot` \u002F `import` \u002F `xwd+convert` with X11 `XGetImage` fallback; BGRA→RGBA conversion\n  - [x] `ocr.rs` — Tesseract subprocess, TSV output parsing, word-level bounding boxes\n  - [x] `window.rs` — `wmctrl -l -G` window list, `\u002Fproc\u002F\u003Cpid>\u002Fcomm` process name\n  - [x] `app.rs` — `\u002Fproc` process enumeration, `wmctrl` \u002F `xdotool` activation, `kill -TERM\u002F-KILL`, `xdg-open` launcher\n  - [x] `atspi.rs` — coordinate-based `AXRef` stub; `xdotool`\u002F`xprop` for `element_at_point` and `frontmost_pid`\n- [x] **`platform\u002Fmod.rs`** — Windows + Linux cfg blocks + `pub use` re-exports\n- [x] **`session\u002Fax_session.rs`** — `#[cfg(target_os = \"macos\")]` → `#[cfg(any(macos, windows, linux))]`\n- [x] **`handlers\u002Fprobe_app.rs`**, **`tracking\u002Fhover_tracker.rs`**, **`tracking\u002Fscreen_recorder.rs`** — same cfg expansion\n- [x] **CI** — `.github\u002Fworkflows\u002Frelease.yml` re-enables `windows-2022` and `ubuntu-22.04` matrix; Linux apt installs `libgtk-3-dev libx11-dev libxrandr-dev libxtst-dev` and packaging tools\n- [x] **Shared `tday-nativecore` HTTP MCP server** (`NativecoreService`) — single long-lived process shared across all Computer Use sessions:\n  - [x] `nativecore-service.ts` — ref-counted singleton; lazy 60 s kill after last release; `NATIVECORE_PORT:N` stdout parsing\n  - [x] `parent_watch.rs` — Rust watchdog: SIGTERM self when parent PID exits (prevents zombie nativecore on crash)\n  - [x] `singleton.rs` — port-file locking prevents duplicate nativecore processes\n- [x] **MCP session proxy** (`startMcpSessionProxy`) — per-session Node.js HTTP proxy managing `Mcp-Session-Id`:\n  - [x] Transparent `initialize` \u002F `notifications\u002Finitialized` handshake with nativecore (rmcp 0.2.1 Streamable HTTP)\n  - [x] Auto re-initialize on HTTP 401 (session expired) or 422 (no session context) and replay original request\n  - [x] Caches `initialize` + `notifications\u002Finitialized` bodies for re-init replay\n  - [x] Correct `content-length` header for HTTP keep-alive compatibility\n- [x] **Codex namespace-tool proxy fix** (`startCodexApiProxy`):\n  - [x] `expandNamespaceTools` builds `shortToFlatMcpName` map while expanding `type:\"namespace\"` → flat `type:\"function\"` tools\n  - [x] `splitFlatMcpName` resolves bare tool names (e.g. `list_apps`) the model calls from SKILL text back to `{namespace, name}` for codex router\n  - [x] Fixes `error=unsupported call: list_apps` for all 76 nativecore tools\n- [x] **76-tool nativecore** — expanded from 20+ to 76 MCP tools covering CDP (30+ tools), Android ADB (12 tools), App Protocol (WebSocket), hover tracking, screen recording, extended AX (`ax_find`, `ax_focused`, `click_text`, `element_at_point`), window management (`resize_window`, `quit_app`), system tools (`sys_process`, `sys_wait`, `execute_command`, `filesystem`, `clipboard`, `scrape`)\n\n### v0.10.x — Web Search & Web Tools\nGive every agent instant access to the live web — configure search providers in Settings and inject them as MCP tools per agent.\n\n- [ ] **Settings → Web Search** sub-panel\n  - [ ] Provider cards: Brave Search, Tavily, Jina, Perplexity, SearXNG (self-hosted)\n  - [ ] API key input per provider (stored in OS keychain)\n  - [ ] Per-agent enable\u002Fdisable toggle\n- [ ] **One-click MCP install** for each provider’s official MCP server\n- [ ] **Web page reader \u002F URL fetcher** shared tool (via Jina Reader or `@modelcontextprotocol\u002Fserver-fetch`)\n- [ ] Show active search provider badge on tab header\n\n### v0.10.0 — Skills & Custom Instructions\nDefine reusable instruction files that are automatically injected into agent sessions.\n\n- [ ] **Skill file formats supported**: `AGENTS.md`, `SKILL.md`, `.instructions.md`, `CLAUDE.md`, `copilot-instructions.md`\n- [ ] **Project-level auto-discovery**: scan project root + `.github\u002F` on each PTY spawn\n- [ ] **Global skills library** in Settings → Skills\n  - [ ] Create \u002F edit \u002F delete named skills (Markdown editor)\n  - [ ] Tag skills (language, framework, style, domain)\n  - [ ] Enable\u002Fdisable per agent-kind\n- [ ] **Skill injection** at spawn time (`--system-prompt` \u002F `--instructions` \u002F temp context file)\n- [ ] **Skill marketplace** — import from GitHub URL or gist\n\n### v0.11.0 — Unified long-term memory\n- [ ] `sqlite-vec` embedding store (Rust)\n- [ ] Background embed-on-write worker\n- [ ] MCP server `tday-memory` exposing `recall`, `remember`, `forget`\n- [ ] Per-project + global memory scopes\n- [ ] Memory browser UI (search, edit, prune, export)\n\n### v0.12.0 — Performance & polish\n- [ ] xterm WebGL renderer; benchmark vs canvas\n- [ ] Lazy-render inactive tabs\n- [ ] Session snapshot\u002Frestore (carry scrollback across restart)\n- [ ] Memory budget per tab; warn on leak\n- [ ] Profiling page (CPU\u002FRSS\u002Fhandles)\n\n### v0.13.0+ — see Roadmap table\n\n---\n\n## 6. Repository Layout\n\n```\ntday\u002F\n├── apps\u002F\n│   └── desktop\u002F                  # Electron app (main + preload + renderer)\n│       ├── src\u002Fmain\u002F             # main process\n│       ├── src\u002Fpreload\u002F          # contextBridge\n│       ├── src\u002Frenderer\u002F         # React app\n│       ├── electron.vite.config.ts\n│       └── package.json\n├── packages\u002F\n│   ├── shared\u002F                   # shared types (IPC contracts, AgentAdapter, …)\n│   ├── adapters\u002F\n│   │   ├── pi\u002F                   # v0.1.0\n│   │   ├── claude-code\u002F          # v0.2.0\n│   │   ├── codex\u002F                # v0.2.0\n│   │   └── opencode\u002F             # v0.2.0\n│   └── ui\u002F                       # shared components (border-beam, …)\n├── crates\u002F\n│   └── tday-core\u002F             # Rust binary (detect, tokens, memory)\n├── pnpm-workspace.yaml\n├── package.json\n└── README.md\n```\n\n---\n\n## 7. Quickstart\n\n```bash\n# prerequisites\nnode -v        # ≥ 20\npnpm -v        # ≥ 9\nrustc --version  # ≥ 1.78\n\n# install + run\npnpm install\npnpm build:core      # builds tday-core (Rust)\npnpm dev             # launches the desktop app\n\n# point Tday at your `pi` binary if it isn't on PATH\necho '{ \"agents\": { \"pi\": { \"bin\": \"\u002Fabsolute\u002Fpath\u002Fto\u002Fpi\" } } }' \\\n  > ~\u002F.tday\u002Fagents.json\n```\n\nThe first window opens with a single tab running `pi` inside a real PTY.\n\n---\n\n## 8. Build and Release\n\n### Local build\n\n```bash\n# typecheck the workspace\npnpm -r typecheck\n\n# build the desktop app\npnpm --filter @tday\u002Fdesktop build\n\n# create macOS packages locally (.dmg + .zip for x64 and arm64)\npnpm --filter @tday\u002Fdesktop package:mac\n\n# create Windows and Linux packages locally on their native hosts\npnpm --filter @tday\u002Fdesktop package:win\npnpm --filter @tday\u002Fdesktop package:linux\n```\n\nLocal packaging writes artifacts to `apps\u002Fdesktop\u002Frelease\u002F\u003Cversion>\u002F`.\nThose generated files are ignored by git and are not meant to be committed.\n\n### GitHub Actions\n\nThe repository ships with `.github\u002Fworkflows\u002Frelease.yml`.\n\n- Push to `main`: no build (avoids noise on every commit).\n- Push a tag like `v0.9.17`: builds **macOS arm64**, **Windows x64**, and **Linux x64** artifacts in parallel and publishes them to a GitHub Release automatically.\n- Run the workflow manually: builds artifacts on demand; if `publish` is enabled, it creates a draft GitHub Release.\n\nThe CI packaging step uses `electron-builder --publish never`, so the build pipeline uploads release assets to GitHub Releases only and does not push packaged binaries back to the repository.\n\n### Recommended release flow\n\n```bash\n# 1. commit your code changes\ngit push origin main\n\n# 2. create a version tag to trigger a GitHub Release\ngit tag v0.9.17\ngit push origin v0.9.17\n```\n\n---\n\n## 9. Design principles\n\n1. **Native where it matters.** PTY, tokenization, memory, scanners — all in Rust or `node-pty`. Electron is the chrome, never the bottleneck.\n2. **Adapter-first.** Adding a new harness must be ≤ 100 LOC.\n3. **Provider-agnostic.** No harness should be locked to a vendor; we own env injection.\n4. **Local-first.** Everything works offline with Ollama\u002FLM Studio\u002Fllama.cpp\u002FvLLM.\n5. **Don’t hide the terminal.** It’s a terminal. Keystrokes, escape codes, colors, mouse — all forwarded faithfully.\n\n---\n## 10. Supported Harness Agents\n\n| Agent | Install | Notes |\n|---|---|---|\n| **Pi** (`pi`) | `npm i -g @mariozechner\u002Fpi-coding-agent` | |\n| **Claude Code** (`claude-code`) | `npm i -g @anthropic-ai\u002Fclaude-code` | Session resume via `--resume \u003Cuuid>`; conversation history from `~\u002F.claude\u002Fprojects\u002F` replayed on restore |\n| **Codex** (`codex`) | `npm i -g @openai\u002Fcodex` | Session resume via `codex resume \u003Cuuid>`; conversation history from `~\u002F.codex\u002Fsessions\u002F` replayed on restore |\n| **Copilot CLI** (`copilot`) | `npm i -g @github\u002Fcopilot-cli` | |\n| **OpenCode** (`opencode`) | `npm i -g opencode-ai` | Session resume via `--session \u003Cid>`; conversation history from SQLite `~\u002F.local\u002Fshare\u002Fopencode\u002F` replayed on restore |\n| **Gemini** (`gemini`) | `npm i -g @google\u002Fgemini-cli` | |\n| **Qwen Code** (`qwen-code`) | `npm i -g qwen-code` | |\n| **Crush** (`crush`) | `npm i -g crush-cli` | |\n| **Hermes** (`hermes`) | install manually, ensure `hermes` is on PATH | |\n\n---\n## 10. Supported Model Providers\n\n| Provider | API Style | Notes |\n|---|---|---|\n| **DeepSeek** | OpenAI · Anthropic | DeepSeek V4 Pro \u002F V4 Flash (Apr 2026), DeepSeek V3.2 via in-process Anthropic gateway |\n| **OpenAI** | OpenAI | GPT-5.5, GPT-5.5 Pro, GPT-5.4, GPT-5.4-mini, GPT-5.4-nano |\n| **Anthropic** | Anthropic | Claude Opus 4.7, Claude Sonnet 4.6, Claude Sonnet 4.5, Claude Haiku 4.5 |\n| **Google Gemini** | OpenAI | Gemini 2.5 Pro \u002F Flash (stable); Gemini 3.1 Pro \u002F 3 Flash (preview) |\n| **xAI (Grok)** | OpenAI | Grok-4.3, Grok-4.20 (reasoning \u002F non-reasoning) |\n| **Groq** | OpenAI | Llama 4 Scout \u002F Maverick, Llama 3.3-70B via Groq LPU |\n| **Mistral** | OpenAI | Mistral Large 3, Codestral 2501, Mistral Small 3.1 |\n| **Moonshot (Kimi)** | OpenAI · Anthropic | Kimi k2, Kimi-VL-A3B |\n| **Cerebras** | OpenAI | Llama on Cerebras WSE |\n| **Together AI** | OpenAI | 200+ open models |\n| **Fireworks AI** | OpenAI | Fast open-model inference |\n| **Z.AI** | OpenAI · Anthropic | GLM-4 series |\n| **Qwen (Alibaba)** | OpenAI | Qwen3.6-Max-Preview, Qwen3.6-Plus, Qwen3-Coder-480B-A35B |\n| **Volcengine (Doubao)** | OpenAI | Doubao-1.5-Pro, Doubao-Pro-32K |\n| **MiniMax** | OpenAI | MiniMax-Text-01, MiniMax-M1 |\n| **StepFun** | OpenAI | Step-3, Step-2-16K |\n| **OpenRouter** | OpenAI | Unified gateway to 300+ models |\n| **NVIDIA NIM** | OpenAI | Llama 4, Qwen3.6, Mistral on NVIDIA NIM |\n| **Hugging Face** | OpenAI | Serverless inference API |\n| **Perplexity** | OpenAI | Sonar Pro, Sonar Reasoning Pro |\n| **Amazon Bedrock** | Anthropic | Claude, Llama, Mistral via Bedrock |\n| **SGLang** | OpenAI | Self-hosted high-throughput server |\n| **vLLM** | OpenAI | Self-hosted PagedAttention server |\n| **Ollama** | OpenAI | Local models (auto-detected on LAN) |\n| **LM Studio** | OpenAI | Local GUI inference server (auto-detected) |\n| **Vercel AI Gateway** | OpenAI | Vercel-hosted unified gateway |\n| **LiteLLM** | OpenAI | Self-hosted proxy for 100+ models |\n| **Custom** | OpenAI · Anthropic | Any OpenAI-compatible or Anthropic-compatible endpoint |\n\n> **Local-inference auto-discovery** — Tday scans `localhost` and your LAN for running Ollama, LM Studio, vLLM, llama.cpp, SGLang, and LocalAI instances and surfaces them as providers automatically (Settings → Scan).\n\n---\n\n## 11. Renderer Modularity Rules\n\nThe renderer follows **architectural constraints** enforced by ESLint (`eslint.config.mjs`) — the same philosophy as VS Code: prevent wrong structure from being possible, rather than capping line counts.\n\n### Layer rules (enforced)\n\n| Rule | What it prevents |\n|---|---|\n| Orchestrators (`Settings.tsx`, `App.tsx`) contain **no inline JSX UI logic** | State + prop wiring only; UI goes in Section\u002FWidget files |\n| `*-helpers.ts` \u002F `hooks\u002F` contain **no JSX** | Pure logic stays pure |\n| `Settings\u002F` sub-files import only from `@tday\u002Fshared`, `.\u002Ftypes`, `.\u002Fshared`, `.\u002Fcron-helpers`, `.\u002Fhistory-helpers`, or React — **never from `..\u002F..\u002FApp`** | No upward coupling |\n| New visually distinct panels get their own `*Section.tsx` — **never added inline** to an existing file | Forces isolation at creation time |\n| Shared utilities used by 3+ components live in `shared.tsx` or a dedicated `*-helpers.ts` — **not copy-pasted** | Single source of truth |\n\n> ESLint rules: `no-restricted-imports` (no upward coupling), `@typescript-eslint\u002Fno-explicit-any` (warn), `prefer-const`. The CI `typecheck` + `test` scripts must stay green before merging.\n\n### Split triggers\n\nApply these rules when adding or editing code:\n\n| Condition | Action |\n|---|---|\n| File approaches the line limit | Split: extract pure logic into `*-helpers.ts`, extract hook state into `hooks\u002Fuse*.ts`, extract UI into a new `*Section.tsx` or `*Widget.tsx` |\n| 3+ components share the same utility | Move it to `shared.tsx` or a dedicated `*-helpers.ts` |\n| A hook exceeds ~100 lines | Extract sub-hooks |\n| Business logic lands in an orchestrator (`Settings.tsx`, `App.tsx`) | Move it down to the owning Section or hook |\n| A new visually distinct panel is added | It always gets its own `*Section.tsx` |\n\n### Settings module map\n\n```\nsrc\u002Frenderer\u002Fsrc\u002F\n  Settings.tsx              ← orchestrator (~200 lines, state + props only)\n  Settings\u002F\n    types.ts                ← Section \u002F SchedMode \u002F etc. — no JSX\n    shared.tsx              ← MiniMarkdown, SectionTab, Field, StatCard, DailyBarChart\n    cron-helpers.ts         ← parseCronSchedule, buildCronExpr, describeCronExpr\n    history-helpers.ts      ← histTimeGroup, histRelative, etc.\n    ProvidersSection.tsx    ← provider profiles, URL probe, model discovery\n    AgentsSection.tsx       ← agent list, per-agent config, shared settings\n    CronSection.tsx         ← cron job list + editor\n    UsageSection.tsx        ← token analytics dashboard\n    HistorySection.tsx      ← closed-tab history\n    ScheduleWidget.tsx      ← interval \u002F at-time \u002F custom cron picker\n    __tests__\u002F\n      cron-helpers.test.ts\n      history-helpers.test.ts\n```\n\n---\n\n## 12. Contributing CoWorkers\n\nThe [`CoWorkers.md`](.\u002FCoWorkers.md) file in this repository is the community-curated source of **preset Online CoWorkers** — GitHub-hosted prompt\u002Fskill files that Tday fetches and injects as agent system prompts.\n\n### How to contribute\n\n1. **Fork** this repository\n2. **Add your entry** to the appropriate category table in [`CoWorkers.md`](.\u002FCoWorkers.md):\n\n   | Field | Description |\n   |-------|-------------|\n   | Name | Short display name, e.g. `Feynman.skill` |\n   | Description | One sentence describing the thinking style or skill |\n   | GitHub | Direct link to the repo or the prompt file (GitHub blob URL) |\n\n3. **Submit a Pull Request** — please verify the URL is publicly accessible and the content is a valid Markdown prompt\n\n> New categories are welcome. Keep descriptions concise (one sentence). Point to a specific file blob URL for pinned versions, or a repo root for the latest `main`.\n\n---\n\n## 13. License\n\n[SAY NO TO SUICIDE PUBLIC LICENSE](https:\u002F\u002Fgithub.com\u002Funbug\u002Fsnts)\n\n`tday-nativecore` (the Computer Use Rust binary) is licensed under the **Business Source License 1.1** — see [`crates\u002Ftday-nativecore\u002FLICENSE`](crates\u002Ftday-nativecore\u002FLICENSE).\n","Tday 是一个集成了多种编码助手的全能终端工具。它支持Claude Code、Codex、Copilot CLI等多款代码生成助手，具备浏览器风格标签页、统一的服务提供商配置、自动检测本地推理等功能，并提供长期记忆和跨助手令牌分析。Tday 采用TypeScript开发，支持macOS、Windows及Linux平台，适合需要频繁切换不同编码辅助工具或希望在一个界面内管理多个AI助手的开发者使用。通过简单的安装步骤（包括Node.js环境准备），用户可以快速上手并利用其强大的功能提高编码效率。",2,"2026-06-11 03:59:51","CREATED_QUERY"]