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.
Files changed (89) hide show
  1. agent_decoder-0.3.2.dist-info/METADATA +387 -0
  2. agent_decoder-0.3.2.dist-info/RECORD +89 -0
  3. agent_decoder-0.3.2.dist-info/WHEEL +4 -0
  4. agent_decoder-0.3.2.dist-info/entry_points.txt +2 -0
  5. agent_decoder-0.3.2.dist-info/licenses/LICENSE +111 -0
  6. clau_decode/__init__.py +8 -0
  7. clau_decode/__main__.py +11 -0
  8. clau_decode/_auth_env.py +118 -0
  9. clau_decode/_pty_preexec.py +42 -0
  10. clau_decode/analytics/__init__.py +0 -0
  11. clau_decode/analytics/aggregator.py +55 -0
  12. clau_decode/analytics/cost.py +76 -0
  13. clau_decode/analytics/extractor.py +32 -0
  14. clau_decode/analytics/fast.py +289 -0
  15. clau_decode/analytics/models.py +49 -0
  16. clau_decode/analytics/pricing.py +162 -0
  17. clau_decode/analytics/prompt.py +34 -0
  18. clau_decode/analytics/service.py +23 -0
  19. clau_decode/analytics/stats.py +117 -0
  20. clau_decode/analytics/tips.py +176 -0
  21. clau_decode/btw_capture.py +290 -0
  22. clau_decode/cli.py +504 -0
  23. clau_decode/config.py +144 -0
  24. clau_decode/db.py +2054 -0
  25. clau_decode/driver_manager.py +387 -0
  26. clau_decode/drivers/__init__.py +27 -0
  27. clau_decode/drivers/base.py +170 -0
  28. clau_decode/drivers/registry.py +113 -0
  29. clau_decode/drivers/tmux_driver.py +488 -0
  30. clau_decode/editor.py +182 -0
  31. clau_decode/events_bus.py +69 -0
  32. clau_decode/locks.py +388 -0
  33. clau_decode/migrate.py +1313 -0
  34. clau_decode/models.py +285 -0
  35. clau_decode/parser.py +466 -0
  36. clau_decode/providers/__init__.py +30 -0
  37. clau_decode/providers/base.py +132 -0
  38. clau_decode/providers/claude.py +81 -0
  39. clau_decode/providers/codex.py +441 -0
  40. clau_decode/providers/registry.py +89 -0
  41. clau_decode/pty_native.py +39 -0
  42. clau_decode/pty_runner.py +2406 -0
  43. clau_decode/pty_screen_state.py +65 -0
  44. clau_decode/recap_runner.py +230 -0
  45. clau_decode/reporter.py +305 -0
  46. clau_decode/scanner.py +125 -0
  47. clau_decode/server.py +2841 -0
  48. clau_decode/static/android-chrome-192x192.png +0 -0
  49. clau_decode/static/android-chrome-512x512.png +0 -0
  50. clau_decode/static/app-icon.png +0 -0
  51. clau_decode/static/apple-touch-icon.png +0 -0
  52. clau_decode/static/assets/ChatView-BBVXuITs.js +79 -0
  53. clau_decode/static/assets/ChatView-BrP-ENHg.css +1 -0
  54. clau_decode/static/assets/Dashboard-3CYO4HQw.js +1 -0
  55. clau_decode/static/assets/FileViewer-BwbDc3ky.js +1 -0
  56. clau_decode/static/assets/HelpPopup-CPtECjYw.js +1 -0
  57. clau_decode/static/assets/ScrollContainer-BT_Dzxah.js +1 -0
  58. clau_decode/static/assets/SearchOverlay-DqI7aZaC.js +1 -0
  59. clau_decode/static/assets/SessionItem-DlyKg80u.js +1 -0
  60. clau_decode/static/assets/SettingsModal-CZBfMqx7.js +1 -0
  61. clau_decode/static/assets/ShortcutsPopup-W7CPdCzW.js +1 -0
  62. clau_decode/static/assets/Sidebar-BBswhEua.js +1 -0
  63. clau_decode/static/assets/client-DTSXvAb8.js +1 -0
  64. clau_decode/static/assets/fira-code-DGosTW8U.woff2 +0 -0
  65. clau_decode/static/assets/formatRelative-j86webkr.js +1 -0
  66. clau_decode/static/assets/hljs-B3O74O7Z.js +35 -0
  67. clau_decode/static/assets/index-BHdCOIkq.css +10 -0
  68. clau_decode/static/assets/index-DfKltZ6z.js +5 -0
  69. clau_decode/static/assets/ioskeley-mono-C7VR2-sL.woff2 +0 -0
  70. clau_decode/static/assets/jetbrains-mono-V6pRDFza.woff2 +0 -0
  71. clau_decode/static/assets/julia-mono-Cbvba6sW.woff2 +0 -0
  72. clau_decode/static/assets/libertinus-mono-Coz17E-O.woff2 +0 -0
  73. clau_decode/static/assets/monaspace-argon-RS-2TGNg.woff2 +0 -0
  74. clau_decode/static/assets/nativePtyFonts-BaXKtUsn.js +1 -0
  75. clau_decode/static/assets/react-Bi_azaFt.js +9 -0
  76. clau_decode/static/assets/renderSnippet-CqpQQugH.js +1 -0
  77. clau_decode/static/assets/rolldown-runtime-S-ySWqyJ.js +1 -0
  78. clau_decode/static/assets/shared-DdVGprvF.js +1 -0
  79. clau_decode/static/assets/source-code-pro-DEXWLoHG.woff2 +0 -0
  80. clau_decode/static/assets/spline-sans-mono-mUpA6Mve.woff2 +0 -0
  81. clau_decode/static/assets/ui-BcGPjpYn.js +1 -0
  82. clau_decode/static/assets/xanh-mono-Dsg19vWS.woff2 +0 -0
  83. clau_decode/static/favicon-16x16.png +0 -0
  84. clau_decode/static/favicon-32x32.png +0 -0
  85. clau_decode/static/favicon.ico +0 -0
  86. clau_decode/static/index.html +24 -0
  87. clau_decode/static/site.webmanifest +1 -0
  88. clau_decode/update_check.py +51 -0
  89. 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,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ clau-decode = clau_decode.cli:main
@@ -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.
@@ -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"
@@ -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()