agent-decoder 0.3.2__py3-none-any.whl
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.
- agent_decoder-0.3.2.dist-info/METADATA +387 -0
- agent_decoder-0.3.2.dist-info/RECORD +89 -0
- agent_decoder-0.3.2.dist-info/WHEEL +4 -0
- agent_decoder-0.3.2.dist-info/entry_points.txt +2 -0
- agent_decoder-0.3.2.dist-info/licenses/LICENSE +111 -0
- clau_decode/__init__.py +8 -0
- clau_decode/__main__.py +11 -0
- clau_decode/_auth_env.py +118 -0
- clau_decode/_pty_preexec.py +42 -0
- clau_decode/analytics/__init__.py +0 -0
- clau_decode/analytics/aggregator.py +55 -0
- clau_decode/analytics/cost.py +76 -0
- clau_decode/analytics/extractor.py +32 -0
- clau_decode/analytics/fast.py +289 -0
- clau_decode/analytics/models.py +49 -0
- clau_decode/analytics/pricing.py +162 -0
- clau_decode/analytics/prompt.py +34 -0
- clau_decode/analytics/service.py +23 -0
- clau_decode/analytics/stats.py +117 -0
- clau_decode/analytics/tips.py +176 -0
- clau_decode/btw_capture.py +290 -0
- clau_decode/cli.py +504 -0
- clau_decode/config.py +144 -0
- clau_decode/db.py +2054 -0
- clau_decode/driver_manager.py +387 -0
- clau_decode/drivers/__init__.py +27 -0
- clau_decode/drivers/base.py +170 -0
- clau_decode/drivers/registry.py +113 -0
- clau_decode/drivers/tmux_driver.py +488 -0
- clau_decode/editor.py +182 -0
- clau_decode/events_bus.py +69 -0
- clau_decode/locks.py +388 -0
- clau_decode/migrate.py +1313 -0
- clau_decode/models.py +285 -0
- clau_decode/parser.py +466 -0
- clau_decode/providers/__init__.py +30 -0
- clau_decode/providers/base.py +132 -0
- clau_decode/providers/claude.py +81 -0
- clau_decode/providers/codex.py +441 -0
- clau_decode/providers/registry.py +89 -0
- clau_decode/pty_native.py +39 -0
- clau_decode/pty_runner.py +2406 -0
- clau_decode/pty_screen_state.py +65 -0
- clau_decode/recap_runner.py +230 -0
- clau_decode/reporter.py +305 -0
- clau_decode/scanner.py +125 -0
- clau_decode/server.py +2841 -0
- clau_decode/static/android-chrome-192x192.png +0 -0
- clau_decode/static/android-chrome-512x512.png +0 -0
- clau_decode/static/app-icon.png +0 -0
- clau_decode/static/apple-touch-icon.png +0 -0
- clau_decode/static/assets/ChatView-BBVXuITs.js +79 -0
- clau_decode/static/assets/ChatView-BrP-ENHg.css +1 -0
- clau_decode/static/assets/Dashboard-3CYO4HQw.js +1 -0
- clau_decode/static/assets/FileViewer-BwbDc3ky.js +1 -0
- clau_decode/static/assets/HelpPopup-CPtECjYw.js +1 -0
- clau_decode/static/assets/ScrollContainer-BT_Dzxah.js +1 -0
- clau_decode/static/assets/SearchOverlay-DqI7aZaC.js +1 -0
- clau_decode/static/assets/SessionItem-DlyKg80u.js +1 -0
- clau_decode/static/assets/SettingsModal-CZBfMqx7.js +1 -0
- clau_decode/static/assets/ShortcutsPopup-W7CPdCzW.js +1 -0
- clau_decode/static/assets/Sidebar-BBswhEua.js +1 -0
- clau_decode/static/assets/client-DTSXvAb8.js +1 -0
- clau_decode/static/assets/fira-code-DGosTW8U.woff2 +0 -0
- clau_decode/static/assets/formatRelative-j86webkr.js +1 -0
- clau_decode/static/assets/hljs-B3O74O7Z.js +35 -0
- clau_decode/static/assets/index-BHdCOIkq.css +10 -0
- clau_decode/static/assets/index-DfKltZ6z.js +5 -0
- clau_decode/static/assets/ioskeley-mono-C7VR2-sL.woff2 +0 -0
- clau_decode/static/assets/jetbrains-mono-V6pRDFza.woff2 +0 -0
- clau_decode/static/assets/julia-mono-Cbvba6sW.woff2 +0 -0
- clau_decode/static/assets/libertinus-mono-Coz17E-O.woff2 +0 -0
- clau_decode/static/assets/monaspace-argon-RS-2TGNg.woff2 +0 -0
- clau_decode/static/assets/nativePtyFonts-BaXKtUsn.js +1 -0
- clau_decode/static/assets/react-Bi_azaFt.js +9 -0
- clau_decode/static/assets/renderSnippet-CqpQQugH.js +1 -0
- clau_decode/static/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
- clau_decode/static/assets/shared-DdVGprvF.js +1 -0
- clau_decode/static/assets/source-code-pro-DEXWLoHG.woff2 +0 -0
- clau_decode/static/assets/spline-sans-mono-mUpA6Mve.woff2 +0 -0
- clau_decode/static/assets/ui-BcGPjpYn.js +1 -0
- clau_decode/static/assets/xanh-mono-Dsg19vWS.woff2 +0 -0
- clau_decode/static/favicon-16x16.png +0 -0
- clau_decode/static/favicon-32x32.png +0 -0
- clau_decode/static/favicon.ico +0 -0
- clau_decode/static/index.html +24 -0
- clau_decode/static/site.webmanifest +1 -0
- clau_decode/update_check.py +51 -0
- clau_decode/watcher.py +63 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: agent-decoder
|
|
3
|
+
Version: 0.3.2
|
|
4
|
+
Summary: A local web UI for browsing and analyzing AI coding assistant chat history
|
|
5
|
+
Project-URL: Homepage, https://github.com/Comradery64/Clau-Decode
|
|
6
|
+
Project-URL: Repository, https://github.com/Comradery64/Clau-Decode
|
|
7
|
+
Project-URL: Issues, https://github.com/Comradery64/Clau-Decode/issues
|
|
8
|
+
License: FSL-1.1-Apache-2.0
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: ai-chat,analytics,chat-history,viewer
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Web Environment
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
19
|
+
Classifier: Topic :: Utilities
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Requires-Dist: aiosqlite>=0.20.0
|
|
22
|
+
Requires-Dist: anyio>=4.0.0
|
|
23
|
+
Requires-Dist: fastapi>=0.110.0
|
|
24
|
+
Requires-Dist: httpx>=0.27.0
|
|
25
|
+
Requires-Dist: packaging>=23.0
|
|
26
|
+
Requires-Dist: pydantic>=2.0.0
|
|
27
|
+
Requires-Dist: uvicorn[standard]>=0.28.0
|
|
28
|
+
Requires-Dist: watchfiles>=0.21.0
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: httpx>=0.27.0; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
34
|
+
Description-Content-Type: text/markdown
|
|
35
|
+
|
|
36
|
+
<h1 align="center">Clau-Decode</h1>
|
|
37
|
+
|
|
38
|
+
<p align="center">
|
|
39
|
+
<em>Browse, search, and analyze your AI coding assistant chat history — entirely local, entirely private.</em>
|
|
40
|
+
</p>
|
|
41
|
+
|
|
42
|
+
<p align="center">
|
|
43
|
+
<a href="https://github.com/Comradery64/Clau-Decode/actions/workflows/ci.yml">
|
|
44
|
+
<img alt="CI" src="https://img.shields.io/github/actions/workflow/status/Comradery64/Clau-Decode/ci.yml?branch=main&label=CI&style=flat-square">
|
|
45
|
+
</a>
|
|
46
|
+
<a href="LICENSE">
|
|
47
|
+
<img alt="License" src="https://img.shields.io/badge/license-FSL--1.1--Apache--2.0-blue?style=flat-square">
|
|
48
|
+
</a>
|
|
49
|
+
<a href="pyproject.toml">
|
|
50
|
+
<img alt="Python" src="https://img.shields.io/badge/python-3.10%2B-blue?style=flat-square">
|
|
51
|
+
</a>
|
|
52
|
+
<a href="https://github.com/Comradery64/Clau-Decode/blob/main/CHANGELOG.md">
|
|
53
|
+
<img alt="Changelog" src="https://img.shields.io/badge/changelog-keep--a--changelog-orange?style=flat-square">
|
|
54
|
+
</a>
|
|
55
|
+
</p>
|
|
56
|
+
|
|
57
|
+
<p align="center">
|
|
58
|
+
<video
|
|
59
|
+
src="https://github.com/user-attachments/assets/6f5a9a09-fbab-467f-82b1-c2e642dc8726"
|
|
60
|
+
poster="https://github.com/Comradery64/Clau-Decode/raw/main/docs/demo-poster.jpg"
|
|
61
|
+
controls
|
|
62
|
+
muted
|
|
63
|
+
playsinline
|
|
64
|
+
width="820">
|
|
65
|
+
<a href="https://github.com/user-attachments/assets/6f5a9a09-fbab-467f-82b1-c2e642dc8726">
|
|
66
|
+
<img src="https://github.com/Comradery64/Clau-Decode/raw/main/docs/demo-poster.jpg" alt="Clau-Decode demo — click to play" width="820">
|
|
67
|
+
</a>
|
|
68
|
+
</video>
|
|
69
|
+
</p>
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Why Clau-Decode?
|
|
74
|
+
|
|
75
|
+
Your AI coding assistant writes a small mountain of JSONL session files into
|
|
76
|
+
`~/.claude/projects/` — useful, but unreadable and impossible to search by hand.
|
|
77
|
+
Clau-Decode reads those files locally, indexes them into SQLite, and serves a
|
|
78
|
+
fast browser UI with full-text search, conversation rendering, analytics, and a
|
|
79
|
+
recap engine.
|
|
80
|
+
|
|
81
|
+
## Quickstart
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Install as an isolated tool — its own virtualenv, on your PATH, nothing
|
|
85
|
+
# touches your system Python. Use whichever you already have:
|
|
86
|
+
uv tool install git+https://github.com/Comradery64/Clau-Decode.git
|
|
87
|
+
# or:
|
|
88
|
+
pipx install git+https://github.com/Comradery64/Clau-Decode.git
|
|
89
|
+
|
|
90
|
+
clau-decode # opens http://localhost:4242
|
|
91
|
+
|
|
92
|
+
# update later — re-pull the latest from main (git installs need --force;
|
|
93
|
+
# plain `upgrade`/`reinstall` won't fetch new commits):
|
|
94
|
+
uv tool install --force git+https://github.com/Comradery64/Clau-Decode.git
|
|
95
|
+
# or:
|
|
96
|
+
pipx install --force git+https://github.com/Comradery64/Clau-Decode.git
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Requires Python 3.10+. The wheel ships the pre-built frontend, so **no Node.js is needed** — only for development. All data stays on your machine — no telemetry.
|
|
100
|
+
|
|
101
|
+
> Just trying it out? Run without installing: `uvx --from git+https://github.com/Comradery64/Clau-Decode.git clau-decode`
|
|
102
|
+
> Prefer not to install? Run it straight from a clone — see [Development](#development).
|
|
103
|
+
> Advanced: `pip install` works too, but only **inside an activated virtualenv** — never your system/Homebrew Python (PEP 668 will block it, and a global install can shadow other checkouts).
|
|
104
|
+
|
|
105
|
+
### Troubleshooting: existing clone won't pull
|
|
106
|
+
|
|
107
|
+
This repo's history has been rewritten. If an old clone fails to update (e.g. `fatal: refusing to merge unrelated histories`, or diverged-branch errors), reset it to the new history:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
git fetch origin && git reset --hard origin/main
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Features
|
|
114
|
+
|
|
115
|
+
### Session browser
|
|
116
|
+
- Conversations grouped by project, with star and archive
|
|
117
|
+
- Sort by recent, oldest, or alphabetical
|
|
118
|
+
- Hover preview before opening a session
|
|
119
|
+
|
|
120
|
+
### Search
|
|
121
|
+
- `Cmd+K` global search across every session — content, tool use, file paths, thinking blocks
|
|
122
|
+
- Inline live-search bar on the home page for quick lookups
|
|
123
|
+
- Results show highlighted excerpts and jump directly to the matching message
|
|
124
|
+
|
|
125
|
+
### Conversation viewer
|
|
126
|
+
- Rendered markdown with code syntax highlighting
|
|
127
|
+
- Tool-use blocks showing files read, commands run, edits made
|
|
128
|
+
- Thinking blocks revealing the model's reasoning
|
|
129
|
+
- Sidechain branches for sub-agent conversations
|
|
130
|
+
- `Cmd+O` expand/collapse all tool + thinking blocks
|
|
131
|
+
- `Cmd+E` toggle full tool output without truncation
|
|
132
|
+
|
|
133
|
+
### Native terminal view
|
|
134
|
+
- Decoded / Native / Split modes — read the rendered conversation, watch the live `claude` terminal, or both side by side
|
|
135
|
+
- Live terminal powered by xterm.js with full scrollback — scroll all the way back to the first prompt, just like a real terminal
|
|
136
|
+
- Correct wide-character and emoji widths (Unicode 11), with the in-app font picker
|
|
137
|
+
- Intent-based spawn — a terminal starts only when you open Native/Split or focus the composer; browsing or switching sessions starts nothing
|
|
138
|
+
- The most-recent terminal is kept alive across navigation for instant return, and per-session view memory preserves your scroll position when flipping Decoded↔Native
|
|
139
|
+
- PTY ownership detection with a take-over banner when another `claude` already owns the session
|
|
140
|
+
|
|
141
|
+
### Home dashboard
|
|
142
|
+
- One headline insight banner when something surprising happens (a big week, a major model shift, a heavily-used tool)
|
|
143
|
+
- 30-day activity heatmap and 7-day sparklines next to top-line counts
|
|
144
|
+
- Featured "Pick up where you left off" card, with an "awaiting you" marker on threads waiting for your reply
|
|
145
|
+
- Most-touched files (click to open in the file viewer)
|
|
146
|
+
- Clickable project strip filters the sidebar
|
|
147
|
+
|
|
148
|
+
### File viewer
|
|
149
|
+
- Slides in as a resizable split pane on the right; the sidebar collapses automatically and restores when you close it
|
|
150
|
+
- Drag the left edge to resize — the width persists across sessions
|
|
151
|
+
- Word-wrapped source — no horizontal scrolling for long lines
|
|
152
|
+
- Markdown files render formatted by default, with a one-click toggle to raw source
|
|
153
|
+
- In-place editing with `Cmd+S` to save, dirty-state indicator, and confirm-on-discard
|
|
154
|
+
- Sandboxed to session-related directories; refuses binary or oversized writes
|
|
155
|
+
|
|
156
|
+
### Analytics
|
|
157
|
+
- Daily, weekly, and per-session token + cost breakdowns
|
|
158
|
+
- Cost estimation with live pricing data
|
|
159
|
+
- Model usage breakdown and trends
|
|
160
|
+
- Tool usage statistics
|
|
161
|
+
- File touch analysis
|
|
162
|
+
- Optimization tips (repeated reads, oversized results, cache hit rates)
|
|
163
|
+
|
|
164
|
+
### Live updates
|
|
165
|
+
- File watcher tails session files in real time
|
|
166
|
+
- UI auto-refreshes when new messages arrive
|
|
167
|
+
- Notification bell for unread updates
|
|
168
|
+
|
|
169
|
+
### Sending messages
|
|
170
|
+
- Send messages to any session directly from the web UI
|
|
171
|
+
- Drives the local `claude` CLI in interactive TUI mode through a hidden PTY,
|
|
172
|
+
so messages use subscription-backed interactive behavior
|
|
173
|
+
- Lazy spawn on chat-input focus; idle PTYs auto-kill after 5 minutes
|
|
174
|
+
- Login required on the host (the web UI doesn't surface OAuth)
|
|
175
|
+
|
|
176
|
+
### Export
|
|
177
|
+
- Export any conversation as JSON or Markdown — includes token counts and cost estimates
|
|
178
|
+
|
|
179
|
+
### Multi-profile support
|
|
180
|
+
- Switch between separate config directories (e.g. multiple Claude installations or sandboxes)
|
|
181
|
+
- Each profile has its own data paths and color
|
|
182
|
+
- Click the avatar in the bottom-left to switch
|
|
183
|
+
|
|
184
|
+
### Themes
|
|
185
|
+
- Light, dark, and system theme
|
|
186
|
+
- Dark mode is tuned for long sessions — neutral surfaces, accent reserved for primary actions and live signals
|
|
187
|
+
|
|
188
|
+
## Usage
|
|
189
|
+
|
|
190
|
+
### CLI
|
|
191
|
+
|
|
192
|
+
| Flag | Description | Default |
|
|
193
|
+
|------|-------------|---------|
|
|
194
|
+
| `--path PATH` | Add a scan path (repeatable) | auto-detected |
|
|
195
|
+
| `--port PORT` | Override the listening port | `4242` |
|
|
196
|
+
| `--host HOST` | Bind host | `127.0.0.1` |
|
|
197
|
+
| `--expose` | Bind to `0.0.0.0` (accessible on the local network) | off |
|
|
198
|
+
| `--no-open` | Don't open the browser on startup | opens browser |
|
|
199
|
+
| `--enable-edit` | Enable message editing + deletion (creates a backup before every write) | off |
|
|
200
|
+
| `--force-refresh` | Clear the cache and force a full rescan | off |
|
|
201
|
+
| `--since YYYYMMDD` | Only include sessions on or after this date | all |
|
|
202
|
+
| `--version` | Print version and exit | |
|
|
203
|
+
|
|
204
|
+
> `--expose` makes your chat history visible to anyone on the same network. Use it on trusted networks only.
|
|
205
|
+
|
|
206
|
+
**Subcommands:**
|
|
207
|
+
|
|
208
|
+
| Command | Description |
|
|
209
|
+
|---------|-------------|
|
|
210
|
+
| `clau-decode` | Launch the web UI (default) |
|
|
211
|
+
| `clau-decode scan` | Rescan and print summary |
|
|
212
|
+
| `clau-decode today` | Show today's token usage and cost |
|
|
213
|
+
| `clau-decode stats` | Print statistical metrics |
|
|
214
|
+
| `clau-decode tips` | Print optimization tips |
|
|
215
|
+
|
|
216
|
+
### Keyboard shortcuts
|
|
217
|
+
|
|
218
|
+
| Shortcut | Action |
|
|
219
|
+
|----------|--------|
|
|
220
|
+
| `Cmd+K` | Open global search |
|
|
221
|
+
| `Cmd+O` | Expand/collapse all tool + thinking blocks |
|
|
222
|
+
| `Cmd+E` | Toggle full tool results |
|
|
223
|
+
| `Cmd+S` | Save (in file editor) |
|
|
224
|
+
| `Cmd+I` | Toggle chat panel |
|
|
225
|
+
| `Cmd+B` | Toggle sidebar |
|
|
226
|
+
| `Cmd+,` / `Shift+Cmd+,` | Open settings |
|
|
227
|
+
| `Cmd+/` | Open keyboard-shortcuts menu |
|
|
228
|
+
| `Esc` | Close dialog / search |
|
|
229
|
+
|
|
230
|
+
## Configuration
|
|
231
|
+
|
|
232
|
+
Settings are saved to `~/.config/clau-decode/config.json`. Edit them in the UI,
|
|
233
|
+
or directly:
|
|
234
|
+
|
|
235
|
+
```json
|
|
236
|
+
{
|
|
237
|
+
"data_paths": ["~/.claude"],
|
|
238
|
+
"theme": "system",
|
|
239
|
+
"auto_open_browser": true,
|
|
240
|
+
"port": 4242,
|
|
241
|
+
"edit_enabled": false
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
The session index lives at `~/.local/share/clau-decode/index.db` (durable, so it
|
|
246
|
+
survives cache clears). To force a full rescan, run `clau-decode --force-refresh` —
|
|
247
|
+
prefer this over deleting the DB, which also discards stars, archives, and custom
|
|
248
|
+
titles.
|
|
249
|
+
|
|
250
|
+
## Architecture
|
|
251
|
+
|
|
252
|
+
Clau-Decode is a local-first FastAPI server that scans your AI coding
|
|
253
|
+
assistant's JSONL session files into a SQLite index, serves a React +
|
|
254
|
+
TypeScript SPA, and drives the Claude CLI through a hidden PTY for in-app
|
|
255
|
+
sessions.
|
|
256
|
+
|
|
257
|
+
See [`ARCHITECTURE.md`](ARCHITECTURE.md) for a system diagram and deeper notes.
|
|
258
|
+
|
|
259
|
+
## Development
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
git clone https://github.com/Comradery64/Clau-Decode
|
|
263
|
+
cd Clau-Decode
|
|
264
|
+
|
|
265
|
+
# Install backend deps (into an isolated .venv) + build the frontend
|
|
266
|
+
make dev # = uv sync && build frontend
|
|
267
|
+
|
|
268
|
+
# Run the app from source — in the project venv, so it always runs THIS
|
|
269
|
+
# checkout (no global install, no shadowing):
|
|
270
|
+
uv run clau-decode --no-open
|
|
271
|
+
# equivalently, as a module from the checkout root:
|
|
272
|
+
uv run python -m clau_decode --no-open
|
|
273
|
+
# (make run wraps this)
|
|
274
|
+
|
|
275
|
+
# Run tests
|
|
276
|
+
make test
|
|
277
|
+
|
|
278
|
+
# Rebuild the frontend only
|
|
279
|
+
make frontend
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Requires Python 3.10+, [`uv`](https://docs.astral.sh/uv/), and Node.js 20+ for
|
|
283
|
+
frontend development.
|
|
284
|
+
|
|
285
|
+
GitHub Actions runs lint, type-check, and the Python + frontend test suites on
|
|
286
|
+
every PR — see [`.github/workflows/ci.yml`](.github/workflows/ci.yml).
|
|
287
|
+
|
|
288
|
+
## Contributing
|
|
289
|
+
|
|
290
|
+
Pull requests are welcome. Please read [`CONTRIBUTING.md`](CONTRIBUTING.md) for
|
|
291
|
+
the dev setup, code style, and commit conventions, and our
|
|
292
|
+
[Code of Conduct](CODE_OF_CONDUCT.md).
|
|
293
|
+
|
|
294
|
+
## Security
|
|
295
|
+
|
|
296
|
+
If you discover a security issue, please follow the responsible disclosure
|
|
297
|
+
process in [`SECURITY.md`](SECURITY.md) — do **not** open a public issue.
|
|
298
|
+
|
|
299
|
+
## Related docs
|
|
300
|
+
|
|
301
|
+
- [`ARCHITECTURE.md`](ARCHITECTURE.md) — system diagram and component overview
|
|
302
|
+
- [`CONTRIBUTING.md`](CONTRIBUTING.md) — dev setup and PR guidelines
|
|
303
|
+
- [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) — community expectations
|
|
304
|
+
- [`SECURITY.md`](SECURITY.md) — responsible disclosure
|
|
305
|
+
- [`CHANGELOG.md`](CHANGELOG.md) — release notes
|
|
306
|
+
|
|
307
|
+
## Acknowledgements
|
|
308
|
+
|
|
309
|
+
Clau-Decode is **inspired by, and built around the file format of, [Claude](https://www.anthropic.com/claude) and Claude Code from [Anthropic](https://www.anthropic.com/)**. This project is not affiliated with, endorsed by, or sponsored by Anthropic, PBC. *Claude* and *Claude Code* are trademarks of Anthropic, PBC; all references in this project are nominative.
|
|
310
|
+
|
|
311
|
+
> *A personal note from the author* — I didn't write the code in this repository or build any of the underlying tools. I sat at my computer, typed into it, and kept asking it for more. The actual line-by-line authoring was done by AI coding assistants — Anthropic's [Claude](https://www.anthropic.com/claude) (Sonnet and Opus) and [Z.ai](https://z.ai/)'s GLM-5.1, with the latter doing a substantial share of the heavy lifting alongside them. They aren't in the lists below because they're AI models rather than libraries, but they deserve named credit here. The projects, products, and people below did the rest of the real work that made Clau-Decode possible:
|
|
312
|
+
|
|
313
|
+
**Backend (Python)**
|
|
314
|
+
|
|
315
|
+
- [FastAPI](https://fastapi.tiangolo.com/) — HTTP API framework
|
|
316
|
+
- [Uvicorn](https://www.uvicorn.org/) — ASGI server
|
|
317
|
+
- [Pydantic](https://docs.pydantic.dev/) — data validation and settings
|
|
318
|
+
- [aiosqlite](https://github.com/omnilib/aiosqlite) — async SQLite driver
|
|
319
|
+
- [SQLite](https://www.sqlite.org/) — embedded database, including the [FTS5](https://www.sqlite.org/fts5.html) full-text search extension
|
|
320
|
+
- [watchfiles](https://github.com/samuelcolvin/watchfiles) — filesystem change notifications
|
|
321
|
+
- [anyio](https://github.com/agronholm/anyio) and [httpx](https://www.python-httpx.org/) — async primitives and HTTP client
|
|
322
|
+
- [Hatch](https://hatch.pypa.io/) and [hatch-vcs](https://github.com/ofek/hatch-vcs) — packaging and version management
|
|
323
|
+
- [uv](https://docs.astral.sh/uv/) — Python project and tool runner
|
|
324
|
+
- [pytest](https://docs.pytest.org/), [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio), and [pytest-cov](https://github.com/pytest-dev/pytest-cov) — testing
|
|
325
|
+
|
|
326
|
+
**Frontend (Web)**
|
|
327
|
+
|
|
328
|
+
- [React](https://react.dev/) and [React DOM](https://react.dev/reference/react-dom) — UI runtime
|
|
329
|
+
- [TypeScript](https://www.typescriptlang.org/) — typed JavaScript
|
|
330
|
+
- [Vite](https://vitejs.dev/) — bundler / dev server
|
|
331
|
+
- [Vitest](https://vitest.dev/) and [@testing-library](https://testing-library.com/) — unit / component testing
|
|
332
|
+
- [Zustand](https://github.com/pmndrs/zustand) — state management
|
|
333
|
+
- [react-markdown](https://github.com/remarkjs/react-markdown), [remark-gfm](https://github.com/remarkjs/remark-gfm), and [rehype-highlight](https://github.com/rehypejs/rehype-highlight) — Markdown rendering and code highlighting
|
|
334
|
+
- [highlight.js](https://highlightjs.org/) — syntax highlighter behind rehype-highlight
|
|
335
|
+
- [Apache ECharts](https://echarts.apache.org/) — analytics charts
|
|
336
|
+
- [OverlayScrollbars](https://kingsora.github.io/OverlayScrollbars/) — custom scrollbars
|
|
337
|
+
- [xterm.js](https://xtermjs.org/) — browser terminal renderer for the Native view, with [`@xterm/addon-fit`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-fit) (viewport sizing) and [`@xterm/addon-unicode11`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-unicode11) (Unicode 11 wide-character widths)
|
|
338
|
+
- [clsx](https://github.com/lukeed/clsx) — conditional class names
|
|
339
|
+
- [Node.js](https://nodejs.org/) and [npm](https://www.npmjs.com/) — JS runtime and package manager
|
|
340
|
+
|
|
341
|
+
**Fonts (bundled — [SIL Open Font License 1.1](frontend/src/assets/fonts/LICENSES.md))**
|
|
342
|
+
|
|
343
|
+
The Native view ships these monospace fonts so the in-app font picker works on any machine (a browser terminal can only paint fonts the browser has). Each is © its respective authors and redistributed under OFL-1.1; the full copyright notices and license text live in [`frontend/src/assets/fonts/LICENSES.md`](frontend/src/assets/fonts/LICENSES.md).
|
|
344
|
+
|
|
345
|
+
- [Monaspace](https://github.com/githubnext/monaspace) (Argon) — GitHub
|
|
346
|
+
- [Source Code Pro](https://github.com/adobe-fonts/source-code-pro) — Adobe
|
|
347
|
+
- [Fira Code](https://github.com/tonsky/FiraCode) — Nikita Prokopov & the Fira Code authors
|
|
348
|
+
- [JetBrains Mono](https://github.com/JetBrains/JetBrainsMono) — JetBrains
|
|
349
|
+
- [Libertinus Mono](https://github.com/alerque/libertinus) — The Libertinus Project authors
|
|
350
|
+
- [Xanh Mono](https://github.com/yellow-type-foundry/xanhmono) — Yellow Type Foundry
|
|
351
|
+
- [JuliaMono](https://github.com/cormullion/juliamono) — cormullion
|
|
352
|
+
- [Spline Sans Mono](https://github.com/SorkinType/SplineSansMono) — Sorkin Type
|
|
353
|
+
- [Ioskeley Mono](https://github.com/ahatem/IoskeleyMono) — Ahmed Hatem (an Iosevka custom build)
|
|
354
|
+
|
|
355
|
+
**Demo reel pipeline**
|
|
356
|
+
|
|
357
|
+
- [VHS](https://github.com/charmbracelet/vhs) — terminal recording as code (with [ttyd](https://github.com/tsl0922/ttyd) under the hood)
|
|
358
|
+
- [chafa](https://hpjansson.org/chafa/) — image-to-ANSI rendering, used to embed pixel-art into the terminal welcome banner
|
|
359
|
+
- [ImageMagick](https://imagemagick.org/) — image autocrop and text-on-color rendering for the outro card
|
|
360
|
+
- [FFmpeg](https://ffmpeg.org/) — video concat, audio mixing, sidechain ducking, and final mux
|
|
361
|
+
- [testreel](https://github.com/greentfrapp/testreel) — programmatic Chromium recording for the web-app segment
|
|
362
|
+
- [Playwright](https://playwright.dev/) — browser automation underlying testreel
|
|
363
|
+
- [tmux](https://github.com/tmux/tmux) — terminal multiplexer (optional, for multi-pane VHS scenes)
|
|
364
|
+
- Methodology reference: [saas-product-demo-video](https://github.com/noamdorr/saas-product-demo-video) — the SaaS demo-reel skill that inspired our soundtrack-splice and beat-alignment approach
|
|
365
|
+
|
|
366
|
+
**Tooling and platforms**
|
|
367
|
+
|
|
368
|
+
- [Homebrew](https://brew.sh/) — package management for the demo-reel toolchain on macOS
|
|
369
|
+
- [GitHub Actions](https://github.com/features/actions) — CI / type-check / test runners
|
|
370
|
+
- [Ruff](https://docs.astral.sh/ruff/) and [pre-commit](https://pre-commit.com/) — code style and pre-commit hooks
|
|
371
|
+
- [Editorconfig](https://editorconfig.org/) — consistent indentation across editors
|
|
372
|
+
|
|
373
|
+
Every project listed above is independently licensed by its respective authors; check each project's repository for terms. If we've missed an attribution, please [open an issue](https://github.com/Comradery64/Clau-Decode/issues).
|
|
374
|
+
|
|
375
|
+
## License
|
|
376
|
+
|
|
377
|
+
This project is licensed under the **Functional Source License, Version 1.1,
|
|
378
|
+
with the Apache 2.0 Future License**
|
|
379
|
+
([FSL-1.1-Apache-2.0](LICENSE)).
|
|
380
|
+
|
|
381
|
+
In short:
|
|
382
|
+
- Free for personal use, internal business use, modification, and forking.
|
|
383
|
+
- You may not use it to build a competing commercial product or service.
|
|
384
|
+
- Each release automatically converts to Apache 2.0 two years after publication.
|
|
385
|
+
|
|
386
|
+
See [`LICENSE`](LICENSE) for the full text and the
|
|
387
|
+
[FSL FAQ](https://fsl.software/) for context.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
clau_decode/__init__.py,sha256=1Cp-FjFVO9PhbAGfAobbLmMUJdoAoEJ7u3TvA-Kc1es,505
|
|
2
|
+
clau_decode/__main__.py,sha256=y7Qi6yLh0Q1LD3PGewtdxRHaL5y5swfQqTambyP8uy8,307
|
|
3
|
+
clau_decode/_auth_env.py,sha256=cAMNi6HiGwrZAPTzmm5UKzkdv2grGk7YmjA4VjtfCkQ,4687
|
|
4
|
+
clau_decode/_pty_preexec.py,sha256=Irf6hsUzlJWKlEXdvxnQzMJqb7ErB-7vWG4rJMTxC5s,1196
|
|
5
|
+
clau_decode/btw_capture.py,sha256=AZ05ytUVfNp6DGeQFZyLmbQVrktES5HvqWV7ynuxYXs,11823
|
|
6
|
+
clau_decode/cli.py,sha256=e1r_2tTL-ov94NDgKrjbFh2QIFIaxEM7yoCBkYbl6ZM,16796
|
|
7
|
+
clau_decode/config.py,sha256=8NVOS-8d6bVkbKw9K9UYU-2xRywowM6qLmg07QXyT0w,4871
|
|
8
|
+
clau_decode/db.py,sha256=wq1J2LiAAijBKyfoUc0OAd6X1Gmqsdp1sqYQh0C5a3k,84831
|
|
9
|
+
clau_decode/driver_manager.py,sha256=ICLdKNMghrTIYJ_RXmBGxeDSMMNLMOT8nJnPCqA9IWU,17215
|
|
10
|
+
clau_decode/editor.py,sha256=NO_7LmMVI0WPvMer5340OjlJbLwt7Vs-3HIoAK3jbs8,6862
|
|
11
|
+
clau_decode/events_bus.py,sha256=c_KOrUqywF-Gj6ipKpZGLZMaojMHV9_od8w2liOD8bw,2818
|
|
12
|
+
clau_decode/locks.py,sha256=8_cIi-06kaHIiEvN4cODFIWW6O7QR-7hZKRauuOu89M,13996
|
|
13
|
+
clau_decode/migrate.py,sha256=q23Y7tJjzjgm1i1BMtdR-Ne4M8HIumsV9d9wSxMgUhM,52971
|
|
14
|
+
clau_decode/models.py,sha256=3X0Q23sP6jB2uaEcVsmH27zaAqNvr1hZ2Wg_UMhNFEY,10164
|
|
15
|
+
clau_decode/parser.py,sha256=XeaBqSBQtZgQUwDC-aT1QbQ-S79SgGXHcDI3AI65IIQ,17766
|
|
16
|
+
clau_decode/pty_native.py,sha256=PSvm2RjER4hVV0Pkp68-qywrOEvrkeEM5OW8vrdhKOQ,935
|
|
17
|
+
clau_decode/pty_runner.py,sha256=Ga6EoVYTfiW7_hEPSVelDLephWPVyVeYrNNho9Eir7o,104246
|
|
18
|
+
clau_decode/pty_screen_state.py,sha256=WMvlkBqyYoJKDjdT1JYf_A-LZuoSkJMyY-KVx_xipAs,2771
|
|
19
|
+
clau_decode/recap_runner.py,sha256=xMQeFn8qkA_2yd3jIzWn5xrjVhdagkT7umkIyMGcj6Q,8610
|
|
20
|
+
clau_decode/reporter.py,sha256=ih4vIPzOSWW5xRav2vNVqHwxTM3p4NTsrsetHKgvUZM,11499
|
|
21
|
+
clau_decode/scanner.py,sha256=P5ytvhQEyvuCvdcfckGAJGgXF5IHOcZAaC78N9szd5Q,4354
|
|
22
|
+
clau_decode/server.py,sha256=yb_61SqLmB4YIPwweKnAxnm89CbMihBzmEkL_RBtOlM,123625
|
|
23
|
+
clau_decode/update_check.py,sha256=u1fLPSeYbsIMypEnlbaurlTyru8aP3ZHKVRX3vh2dDE,1844
|
|
24
|
+
clau_decode/watcher.py,sha256=1l10LekhVsJpYIYCOecic1zTyHWq6fhkBUwFB22UmDs,2154
|
|
25
|
+
clau_decode/analytics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
+
clau_decode/analytics/aggregator.py,sha256=iTJqUscIoPOaucr4VuwVBo3rXIKq8qJHm9FjXYwQyNo,2079
|
|
27
|
+
clau_decode/analytics/cost.py,sha256=F4ZdhUzCvu7FotoewgBSO3Lt4DwNfGYQMGSj9NNrD1Q,2433
|
|
28
|
+
clau_decode/analytics/extractor.py,sha256=st-lKaDgLXBXDKAdtoj1lYljotsn14CmZwE4REafPI4,1048
|
|
29
|
+
clau_decode/analytics/fast.py,sha256=8sHLZq7cydIotfSPvFIO8duKUeEltfA_SPnjj5Th4ek,11023
|
|
30
|
+
clau_decode/analytics/models.py,sha256=8jmO4CbXzOx146hvEw31yEp7Xg4VA9K5xK5t8gM7yV4,1371
|
|
31
|
+
clau_decode/analytics/pricing.py,sha256=xfa31TXBhljZ93kbTToSfSEDwGqPgosgudapzEgUO4o,5863
|
|
32
|
+
clau_decode/analytics/prompt.py,sha256=m3evob-i9KP46V4dp_Jpodmmo1Dyohf7M-jjERu_oac,1211
|
|
33
|
+
clau_decode/analytics/service.py,sha256=Tvi4HUNrEOAhtz9qHgmk2ioLI_V9APwHkJfJwj1HMdc,955
|
|
34
|
+
clau_decode/analytics/stats.py,sha256=E7YleQA_IAKlbjCBx2ctWo1xzMD0pa74AM4zvaDy-tc,4186
|
|
35
|
+
clau_decode/analytics/tips.py,sha256=nUQJ2HDknBr2OG4OWAjrtp-JyWlvpJZNZAuXg7z30LI,6398
|
|
36
|
+
clau_decode/drivers/__init__.py,sha256=lFYngZHWAosjcFrhXuRBHEPdthSDxnqTeRFQtTGF4nM,664
|
|
37
|
+
clau_decode/drivers/base.py,sha256=ihVZj6p00iP70NJ-s7v6IXqBDJiGQu84s0wF98tLql4,6358
|
|
38
|
+
clau_decode/drivers/registry.py,sha256=GbEsGZPY6oYyB0NmS632LSH92pGj8zmHSGbEMaxwj4Q,4076
|
|
39
|
+
clau_decode/drivers/tmux_driver.py,sha256=2qRk9WxlTvQpcxgZ3C50UdR98xj4GYshfaaBsE5axik,19655
|
|
40
|
+
clau_decode/providers/__init__.py,sha256=STx42DONzo7UdSgbsXb3mVKhJ_sZrZvhMc2heMaY1eo,1168
|
|
41
|
+
clau_decode/providers/base.py,sha256=PEBpbrBERKl24BhQIJ2WysL6rfS_JRl5ITgBruLIMV4,4500
|
|
42
|
+
clau_decode/providers/claude.py,sha256=sFQ5dM7XjRf65ooObwlsg2ZzETWArhlP_IzJzYkJjrE,2898
|
|
43
|
+
clau_decode/providers/codex.py,sha256=P7DAKa6yqW84llkfMvtsyvdqXvIyWFkg0GeqUKIl8mI,17863
|
|
44
|
+
clau_decode/providers/registry.py,sha256=BJnp2N7KF2H7zpzoSxQR4B7ULOThoIZXmPlrGtlSL_k,2663
|
|
45
|
+
clau_decode/static/android-chrome-192x192.png,sha256=ggd5vx0y4xShTaY3P9jWFJLao6DKUeC4nmawzUoABAM,26440
|
|
46
|
+
clau_decode/static/android-chrome-512x512.png,sha256=MGGgV7ahOy9hgx9mXLPyYN90P4gEM3-AfK9VgoFQFzU,112878
|
|
47
|
+
clau_decode/static/app-icon.png,sha256=gXXhJOjnhmp3Pdp96rgMOpQmWrNiUTY91C__lJ46msQ,30324
|
|
48
|
+
clau_decode/static/apple-touch-icon.png,sha256=X2YfytavgO1CLo3SXFBIsDzPoRy_Pa6B7pqWVf7SCg4,23916
|
|
49
|
+
clau_decode/static/favicon-16x16.png,sha256=XUe28EbZseuyFOaRxCchIdzeUIVjaydbGaPtaWWuRLE,813
|
|
50
|
+
clau_decode/static/favicon-32x32.png,sha256=2D8YYsFnYespQMulycfRmL2bzsnuG12pAN1T_ojOHmA,2025
|
|
51
|
+
clau_decode/static/favicon.ico,sha256=l7jyd7x-jj1PLBwR_lJ-2kpaUIGio27WhNGbcKinnVY,15406
|
|
52
|
+
clau_decode/static/index.html,sha256=V6rH1N1Eu6VXck8IWGK0shHrZWs5dPhDnpd6bTpWbOI,1297
|
|
53
|
+
clau_decode/static/site.webmanifest,sha256=4hTFbWpJGEKH4LZr2XdSzEV3v2e8k-CL3I-ILWsZLUo,286
|
|
54
|
+
clau_decode/static/assets/ChatView-BBVXuITs.js,sha256=2WMEq8eLc73Po7KhTjkA2kIcxyhE_8hPwHZst7K1Lzo,470381
|
|
55
|
+
clau_decode/static/assets/ChatView-BrP-ENHg.css,sha256=DlOG8Wy0vnii_pEeAUqBDaduottH2MiyqWZRay_VJws,3939
|
|
56
|
+
clau_decode/static/assets/Dashboard-3CYO4HQw.js,sha256=MZtYbr4FtOE3b9eU7jzPIhNRSBsUM5jeGtDecM9eyfs,26627
|
|
57
|
+
clau_decode/static/assets/FileViewer-BwbDc3ky.js,sha256=JNQ01AdiGQeB-eh8JU62K1AB57aeQJR_ZFup_bl_laU,12133
|
|
58
|
+
clau_decode/static/assets/HelpPopup-CPtECjYw.js,sha256=ayq0ZdFqpxHAENC84VcdZBXMPQb8Cx3zqnN40OZmtAM,2697
|
|
59
|
+
clau_decode/static/assets/ScrollContainer-BT_Dzxah.js,sha256=27RIUj2fJr3oPfPBv_ReJNPa7O0J4yrG34tUjLvINjE,29501
|
|
60
|
+
clau_decode/static/assets/SearchOverlay-DqI7aZaC.js,sha256=D0BXQM0x3NeC3f9qBrbZ014wZfTvn_b49Z9JPkMjBqk,5905
|
|
61
|
+
clau_decode/static/assets/SessionItem-DlyKg80u.js,sha256=UiusdWYC5hoWDHj3EjR47k9IIaYNdLvyUj7BgqP4dkU,13332
|
|
62
|
+
clau_decode/static/assets/SettingsModal-CZBfMqx7.js,sha256=uh5SG2yVvdIEwhig0w4fnXNUAOFp6fd9IXtJ4ZhhRJ4,30040
|
|
63
|
+
clau_decode/static/assets/ShortcutsPopup-W7CPdCzW.js,sha256=pax_ZrcffbLVIfcfKWdaQRVAiC9IhbqC6e5TGeDz8AU,2460
|
|
64
|
+
clau_decode/static/assets/Sidebar-BBswhEua.js,sha256=Wzf0rsFHQ4hH_WQ9ekvFH7OQqw8sGEpdKRLsSmeQq90,35139
|
|
65
|
+
clau_decode/static/assets/client-DTSXvAb8.js,sha256=RhLYab7Gi6Q3nveaXXIH7Uw0FwH8p_2qVtX5QAeLdeQ,8407
|
|
66
|
+
clau_decode/static/assets/fira-code-DGosTW8U.woff2,sha256=bcnaFxzOpx1SU3nuHL9R0UPjGsrDMKJRu3Gz1gYOaHw,23312
|
|
67
|
+
clau_decode/static/assets/formatRelative-j86webkr.js,sha256=y2ef3mASw7EbfzoX_R_PPyt2VW_QHPBUASXUIKxWJ3U,1181
|
|
68
|
+
clau_decode/static/assets/hljs-B3O74O7Z.js,sha256=B9xcNg4TdEOQQkyfW4fDCcmkNulMH0bzZURVygDoxu8,335504
|
|
69
|
+
clau_decode/static/assets/index-BHdCOIkq.css,sha256=5WwHMQ6asCTLogkJOSrCSeO1anUr3qkW-iovLn7DsXY,30001
|
|
70
|
+
clau_decode/static/assets/index-DfKltZ6z.js,sha256=bEYJ2ihkrRqSnbf3PO1t_hBPVrwkgJ1vF5sdAyRAmFE,24468
|
|
71
|
+
clau_decode/static/assets/ioskeley-mono-C7VR2-sL.woff2,sha256=pVVPNuvAALDH7fHVjn92l9q8qaWzDA949fcPSQAsq2Y,481808
|
|
72
|
+
clau_decode/static/assets/jetbrains-mono-V6pRDFza.woff2,sha256=FEJbqcaVdjwVR_SKIGt6pgNQozriPeCfBAeHfz_Nies,21168
|
|
73
|
+
clau_decode/static/assets/julia-mono-Cbvba6sW.woff2,sha256=J8tSRj93aj-0Nmu257L91PgOEb1mps7lv8pAXKnSGIE,1031284
|
|
74
|
+
clau_decode/static/assets/libertinus-mono-Coz17E-O.woff2,sha256=kc4SFTCsCFvHP82iqV3Y-afLk9un94qrDGB4HHqnwRk,24360
|
|
75
|
+
clau_decode/static/assets/monaspace-argon-RS-2TGNg.woff2,sha256=JDLmOWUUzqgH8UHGMLvurq8XBBb1P_AAg1iIbZWZg20,45600
|
|
76
|
+
clau_decode/static/assets/nativePtyFonts-BaXKtUsn.js,sha256=g7ZUiVTaY1QQBGphYISKzCqGGlMZsw0i0yNlnTi2U4k,1393
|
|
77
|
+
clau_decode/static/assets/react-Bi_azaFt.js,sha256=0GE1OrUEINn_dueDAHC7ebf7w-kehCCFF31_21q6waE,189644
|
|
78
|
+
clau_decode/static/assets/renderSnippet-CqpQQugH.js,sha256=8GRi6SbQ2vJQibEfpJMIhdhGZDIN_nx7pMeVqZVyYAc,413
|
|
79
|
+
clau_decode/static/assets/rolldown-runtime-S-ySWqyJ.js,sha256=XbW6gu7wDR3ufobmYwmMlCfQEYOojTV0N9r_KVrsPnU,694
|
|
80
|
+
clau_decode/static/assets/shared-DdVGprvF.js,sha256=-_7OUEBIljimv42imAlWYc-DrO8tBOlUeIzyz2YmXVA,2049
|
|
81
|
+
clau_decode/static/assets/source-code-pro-DEXWLoHG.woff2,sha256=daqMrP1FnVjXwJPz_wq4dFzIeN_JPF1M2gUnka6s6Hg,11656
|
|
82
|
+
clau_decode/static/assets/spline-sans-mono-mUpA6Mve.woff2,sha256=r3Ng4R7_oIhRDFe9bDJ8rNHlPOiw8-8eJEUoTfd35dY,12888
|
|
83
|
+
clau_decode/static/assets/ui-BcGPjpYn.js,sha256=ilmkD1ZscQnc-PBP21Fw0CeEC0AnjXusdoxRVWWFk2s,4178
|
|
84
|
+
clau_decode/static/assets/xanh-mono-Dsg19vWS.woff2,sha256=QyCippwv48B3ysSytQ8RpXIq80IwczQM16VTmI88G3M,18048
|
|
85
|
+
agent_decoder-0.3.2.dist-info/METADATA,sha256=60IgMw-FQo_D14CUpLea9KaGwEPwOXB1xjFc8Yjs7X0,19141
|
|
86
|
+
agent_decoder-0.3.2.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
87
|
+
agent_decoder-0.3.2.dist-info/entry_points.txt,sha256=V5tfDZRQ3KrnJaVUIeB-OPBvzZQKDknfclwfW4Zgv-w,53
|
|
88
|
+
agent_decoder-0.3.2.dist-info/licenses/LICENSE,sha256=eGgedq1AoiKV0Aov4keJWse9IG7Pd9ReKc6a5BBjxVc,3943
|
|
89
|
+
agent_decoder-0.3.2.dist-info/RECORD,,
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Functional Source License, Version 1.1, Apache 2.0 Future License
|
|
2
|
+
|
|
3
|
+
## Abbreviation
|
|
4
|
+
|
|
5
|
+
FSL-1.1-Apache-2.0
|
|
6
|
+
|
|
7
|
+
## Notice
|
|
8
|
+
|
|
9
|
+
Copyright 2026 Comradery64
|
|
10
|
+
|
|
11
|
+
Licensor: Comradery64
|
|
12
|
+
Licensed Work: clau-decode. The Licensed Work is © 2026 Comradery64.
|
|
13
|
+
Effective Date: 2026-05-13
|
|
14
|
+
Change Date: 2028-05-13
|
|
15
|
+
Change License: Apache License, Version 2.0
|
|
16
|
+
|
|
17
|
+
## Terms and Conditions
|
|
18
|
+
|
|
19
|
+
### Licensor ("We")
|
|
20
|
+
|
|
21
|
+
The party offering the Software under these Terms and Conditions.
|
|
22
|
+
|
|
23
|
+
### The Software
|
|
24
|
+
|
|
25
|
+
The "Software" is each version of the software that we make available under
|
|
26
|
+
these Terms and Conditions, as indicated by our inclusion of these Terms and
|
|
27
|
+
Conditions with the Software.
|
|
28
|
+
|
|
29
|
+
### License Grant
|
|
30
|
+
|
|
31
|
+
Subject to your compliance with this License Grant and the Patents,
|
|
32
|
+
Redistribution and Trademark clauses below, we hereby grant you the right to
|
|
33
|
+
use, copy, modify, create derivative works, publicly perform, publicly display
|
|
34
|
+
and redistribute the Software for any Permitted Purpose identified below.
|
|
35
|
+
|
|
36
|
+
### Permitted Purpose
|
|
37
|
+
|
|
38
|
+
A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
|
|
39
|
+
means making the Software available to others in a commercial product or
|
|
40
|
+
service that:
|
|
41
|
+
|
|
42
|
+
1. substitutes for the Software;
|
|
43
|
+
|
|
44
|
+
2. substitutes for any other product or service we offer using the Software
|
|
45
|
+
that exists as of the date we make the Software available; or
|
|
46
|
+
|
|
47
|
+
3. offers the same or substantially similar functionality as the Software.
|
|
48
|
+
|
|
49
|
+
Permitted Purposes specifically include using the Software:
|
|
50
|
+
|
|
51
|
+
1. for your internal use and access;
|
|
52
|
+
|
|
53
|
+
2. for non-commercial education;
|
|
54
|
+
|
|
55
|
+
3. for non-commercial research; and
|
|
56
|
+
|
|
57
|
+
4. in connection with professional services that you provide to a licensee
|
|
58
|
+
using the Software in accordance with these Terms and Conditions.
|
|
59
|
+
|
|
60
|
+
### Patents
|
|
61
|
+
|
|
62
|
+
To the extent your use for a Permitted Purpose would necessarily infringe our
|
|
63
|
+
patents, the license grant above includes a license under our patents. If you
|
|
64
|
+
make a claim against any party that the Software infringes or contributes to
|
|
65
|
+
the infringement of any patent, then your patent license to the Software ends
|
|
66
|
+
immediately.
|
|
67
|
+
|
|
68
|
+
### Redistribution
|
|
69
|
+
|
|
70
|
+
The Terms and Conditions apply to all copies, modifications and derivatives of
|
|
71
|
+
the Software.
|
|
72
|
+
|
|
73
|
+
If you redistribute any copies, modifications or derivatives of the Software,
|
|
74
|
+
you must include a copy of or a link to these Terms and Conditions and not
|
|
75
|
+
remove any copyright notices provided in or with the Software.
|
|
76
|
+
|
|
77
|
+
### Disclaimer
|
|
78
|
+
|
|
79
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
|
|
80
|
+
IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
|
|
81
|
+
PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
|
|
82
|
+
|
|
83
|
+
IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
|
|
84
|
+
SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
|
|
85
|
+
EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
|
|
86
|
+
|
|
87
|
+
### Trademarks
|
|
88
|
+
|
|
89
|
+
Except for displaying the License Details and identifying us as the origin of
|
|
90
|
+
the Software, you have no right under these Terms and Conditions to use our
|
|
91
|
+
trademarks, trade names, service marks or product names.
|
|
92
|
+
|
|
93
|
+
## Grant of Future License
|
|
94
|
+
|
|
95
|
+
We hereby irrevocably grant you an additional license to use the Software under
|
|
96
|
+
the Apache License, Version 2.0 that is effective on the second anniversary of
|
|
97
|
+
the date we make the Software available. On or after that date, you may use the
|
|
98
|
+
Software under the Apache License, Version 2.0, in which case the following
|
|
99
|
+
will apply:
|
|
100
|
+
|
|
101
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
102
|
+
this file except in compliance with the License.
|
|
103
|
+
|
|
104
|
+
You may obtain a copy of the License at
|
|
105
|
+
|
|
106
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
107
|
+
|
|
108
|
+
Unless required by applicable law or agreed to in writing, software distributed
|
|
109
|
+
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
110
|
+
CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
|
111
|
+
specific language governing permissions and limitations under the License.
|
clau_decode/__init__.py
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# THE single source of truth for Clau-Decode's version. Edit it here and
|
|
2
|
+
# nowhere else — every other place derives from this one string:
|
|
3
|
+
# * Python packaging — pyproject's [tool.hatch.version] reads this file.
|
|
4
|
+
# * CLI `--version` — cli.py imports __version__.
|
|
5
|
+
# * HTTP API — /api/host-info returns it.
|
|
6
|
+
# * Settings ▸ About — the frontend fetches it from that API (no copy in JS).
|
|
7
|
+
# Bump this on every release (and tag the commit `vX.Y.Z` to match).
|
|
8
|
+
__version__ = "0.3.2"
|
clau_decode/__main__.py
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Module entry point so ``python -m clau_decode`` runs the app.
|
|
2
|
+
|
|
3
|
+
Mirrors the ``clau-decode`` console script (``clau_decode.cli:main``). Handy for
|
|
4
|
+
running straight from a checkout (``uv run python -m clau_decode``) without a
|
|
5
|
+
global install.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .cli import main
|
|
9
|
+
|
|
10
|
+
if __name__ == "__main__":
|
|
11
|
+
main()
|