let-them-talk 0.1.0__tar.gz

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 (33) hide show
  1. let_them_talk-0.1.0/.gitignore +16 -0
  2. let_them_talk-0.1.0/LICENSE +202 -0
  3. let_them_talk-0.1.0/PKG-INFO +55 -0
  4. let_them_talk-0.1.0/README.md +31 -0
  5. let_them_talk-0.1.0/docs/configuration.md +85 -0
  6. let_them_talk-0.1.0/docs/how-it-works.md +227 -0
  7. let_them_talk-0.1.0/docs/limits.md +56 -0
  8. let_them_talk-0.1.0/docs/usage.md +478 -0
  9. let_them_talk-0.1.0/mods/let-them-talk-handoff/.claude-plugin/plugin.json +5 -0
  10. let_them_talk-0.1.0/mods/let-them-talk-handoff/README.md +12 -0
  11. let_them_talk-0.1.0/mods/let-them-talk-handoff/skills/handoff/LICENSE +21 -0
  12. let_them_talk-0.1.0/mods/let-them-talk-handoff/skills/handoff/SKILL.md +16 -0
  13. let_them_talk-0.1.0/mods/let-them-talk-suggestions/.claude-plugin/plugin.json +9 -0
  14. let_them_talk-0.1.0/mods/let-them-talk-suggestions/AGENTS.md +8 -0
  15. let_them_talk-0.1.0/mods/let-them-talk-suggestions/CLAUDE.md +1 -0
  16. let_them_talk-0.1.0/mods/let-them-talk-suggestions/README.md +24 -0
  17. let_them_talk-0.1.0/mods/let-them-talk-suggestions/hooks/hooks.json +1 -0
  18. let_them_talk-0.1.0/mods/let-them-talk-suggestions/hooks/register.test.ts +156 -0
  19. let_them_talk-0.1.0/mods/let-them-talk-suggestions/hooks/register.ts +228 -0
  20. let_them_talk-0.1.0/pypi/__init__.py +1 -0
  21. let_them_talk-0.1.0/pyproject.toml +79 -0
  22. let_them_talk-0.1.0/server.py +4697 -0
  23. let_them_talk-0.1.0/static/app.js +3441 -0
  24. let_them_talk-0.1.0/static/fonts/LICENSE-Selawik.txt +91 -0
  25. let_them_talk-0.1.0/static/fonts/selawk.woff2 +0 -0
  26. let_them_talk-0.1.0/static/fonts/selawkb.woff2 +0 -0
  27. let_them_talk-0.1.0/static/fonts/selawksb.woff2 +0 -0
  28. let_them_talk-0.1.0/static/index.html +273 -0
  29. let_them_talk-0.1.0/static/style.css +1105 -0
  30. let_them_talk-0.1.0/tests/check.sh +18 -0
  31. let_them_talk-0.1.0/tests/check_page.py +1721 -0
  32. let_them_talk-0.1.0/tests/check_server.py +1568 -0
  33. let_them_talk-0.1.0/tests/setup.sh +8 -0
@@ -0,0 +1,16 @@
1
+ # Your own data: boards (chat ids, connection reasons) and the log of sent notes
2
+ boards/
3
+ logs/
4
+ # Python cache
5
+ __pycache__/
6
+ # Private notes (handoffs, scratch files)
7
+ temp/
8
+ # Claude Code (local settings, worktrees)
9
+ .claude/
10
+ # Written by Claude Code each time it loads a mod
11
+ mods/*/.claude-plugin/types/
12
+ mods/*/tsconfig.json
13
+ # The page checks' browser (tests/setup.sh)
14
+ tests/.venv/
15
+ # Built packages (uv build)
16
+ dist/
@@ -0,0 +1,202 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
@@ -0,0 +1,55 @@
1
+ Metadata-Version: 2.5
2
+ Name: let-them-talk
3
+ Version: 0.1.0
4
+ Summary: A visual board for your Claude Code agents: see sessions, subagents and background agents as cards, and draw arrows so they talk to each other.
5
+ Project-URL: Homepage, https://github.com/abdullahkavakli/let-them-talk
6
+ Project-URL: Issues, https://github.com/abdullahkavakli/let-them-talk/issues
7
+ Project-URL: Documentation, https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/usage.md
8
+ Author: Abdullah KAVAKLI
9
+ License-Expression: Apache-2.0
10
+ License-File: LICENSE
11
+ License-File: mods/let-them-talk-handoff/skills/handoff/LICENSE
12
+ License-File: static/fonts/LICENSE-Selawik.txt
13
+ Keywords: agents,board,claude,claude-code,dashboard,multi-agent,subagents
14
+ Classifier: Environment :: Web Environment
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Software Development
22
+ Requires-Python: >=3.12
23
+ Description-Content-Type: text/markdown
24
+
25
+ # Let Them Talk
26
+
27
+ A visual board for your agents. Each running Claude Code session is a card, and an arrow from one card to another tells both chats who they work with and why.
28
+
29
+ ![Let Them Talk: cards for Claude Code chats, an arrow between two of them, and their conversation](https://raw.githubusercontent.com/abdullahkavakli/let-them-talk/main/docs/demo/demo.gif)
30
+
31
+ ## What it does
32
+
33
+ - Draw an arrow between two chats and it tells them who to talk to and why. They then talk through Claude Code's own messaging.
34
+ - Click an arrow to read what the two chats sent each other.
35
+ - Start a team: a master and up to 8 agents, each with its own role, prompt, model and effort.
36
+ - Terminal chats, Cursor chats and background agents share one board, with the subagents they run.
37
+ - Local and small: the server is one Python file that uses only Python's standard library, and nothing is installed into Claude Code.
38
+
39
+ ## Start
40
+
41
+ Needs Python 3.12+ and Claude Code (on Windows, both inside WSL).
42
+
43
+ - One line: `uvx let-them-talk` (needs [uv](https://docs.astral.sh/uv/); or `pipx run let-them-talk`). It starts the board and opens it in your browser; `--no-open` skips that. Its boards are kept in `~/.local/share/let-them-talk`.
44
+ - From a copy of this repository, on Windows: double-click `Start Let Them Talk.bat`.
45
+ - From a copy of this repository, on macOS, Linux or WSL: `./start.sh`, then open <http://localhost:8765>.
46
+
47
+ Click **New board** and pick a project folder: its running chats appear as cards. Drag the blue handle from one card onto another, then click **Connect**.
48
+
49
+ More: [using it](https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/usage.md) · [how it works](https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/how-it-works.md) · [settings](https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/configuration.md) · [limits](https://github.com/abdullahkavakli/let-them-talk/blob/main/docs/limits.md)
50
+
51
+ Not related to [Dekelelz/let-them-talk](https://github.com/Dekelelz/let-them-talk), a different project with the same name.
52
+
53
+ ## License
54
+
55
+ [Apache 2.0](https://github.com/abdullahkavakli/let-them-talk/blob/main/LICENSE). The Selawik font and the `/handoff` skill keep their own licenses, next to their files.
@@ -0,0 +1,31 @@
1
+ # Let Them Talk
2
+
3
+ A visual board for your agents. Each running Claude Code session is a card, and an arrow from one card to another tells both chats who they work with and why.
4
+
5
+ ![Let Them Talk: cards for Claude Code chats, an arrow between two of them, and their conversation](docs/demo/demo.gif)
6
+
7
+ ## What it does
8
+
9
+ - Draw an arrow between two chats and it tells them who to talk to and why. They then talk through Claude Code's own messaging.
10
+ - Click an arrow to read what the two chats sent each other.
11
+ - Start a team: a master and up to 8 agents, each with its own role, prompt, model and effort.
12
+ - Terminal chats, Cursor chats and background agents share one board, with the subagents they run.
13
+ - Local and small: the server is one Python file that uses only Python's standard library, and nothing is installed into Claude Code.
14
+
15
+ ## Start
16
+
17
+ Needs Python 3.12+ and Claude Code (on Windows, both inside WSL).
18
+
19
+ - One line: `uvx let-them-talk` (needs [uv](https://docs.astral.sh/uv/); or `pipx run let-them-talk`). It starts the board and opens it in your browser; `--no-open` skips that. Its boards are kept in `~/.local/share/let-them-talk`.
20
+ - From a copy of this repository, on Windows: double-click `Start Let Them Talk.bat`.
21
+ - From a copy of this repository, on macOS, Linux or WSL: `./start.sh`, then open <http://localhost:8765>.
22
+
23
+ Click **New board** and pick a project folder: its running chats appear as cards. Drag the blue handle from one card onto another, then click **Connect**.
24
+
25
+ More: [using it](docs/usage.md) · [how it works](docs/how-it-works.md) · [settings](docs/configuration.md) · [limits](docs/limits.md)
26
+
27
+ Not related to [Dekelelz/let-them-talk](https://github.com/Dekelelz/let-them-talk), a different project with the same name.
28
+
29
+ ## License
30
+
31
+ [Apache 2.0](LICENSE). The Selawik font and the `/handoff` skill keep their own licenses, next to their files.
@@ -0,0 +1,85 @@
1
+ # Configuration
2
+
3
+ Let Them Talk runs without setup; these settings and the optional
4
+ suggestions mod change how it runs.
5
+
6
+ ## Environment settings
7
+
8
+ Set these for the server before you start it.
9
+
10
+ - `LTT_PORT`: the port it listens on (default `8765`). The Windows `.bat`
11
+ always opens the page on port 8765; for the suggestions mod, see
12
+ [below](#suggestions-mod).
13
+ - `LTT_DATA`: the folder where the app keeps its boards and logs. By
14
+ default the app's own folder when you run `./start.sh` or
15
+ `python3 server.py` from a copy of the repository, and
16
+ `$XDG_DATA_HOME/let-them-talk` (`~/.local/share/let-them-talk` if that isn't
17
+ set, on macOS too) when you installed it with `uvx` or `pipx`. It is also the
18
+ folder the app's own short `claude -p` runs start in. To carry boards over
19
+ to another folder, copy `boards/` and `logs/` there. See
20
+ [What is stored where](how-it-works.md#what-is-stored-where).
21
+ - `LTT_MODEL`: the model for notes and TL;DRs (default `haiku`).
22
+ - `LTT_CLAUDE`: the path to the `claude` binary. By default `claude` on the
23
+ PATH, else `~/.local/bin/claude`.
24
+ - `LTT_WINDOWS_HOME`: your Windows user folder as a WSL path, e.g.
25
+ `/mnt/c/Users/you`, whose `.claude` holds Windows sessions. By default the
26
+ app asks Windows for `%USERPROFILE%`.
27
+ - `CLAUDE_CONFIG_DIR`: if you run Claude Code with it, set it for the server
28
+ too. It then reads sessions, transcripts and background agents from there
29
+ instead of `~/.claude`.
30
+
31
+ The older `ORGANIZER_*` names (such as `ORGANIZER_PORT`) still work.
32
+
33
+ ## Suggestions mod
34
+
35
+ The mod in `mods/let-them-talk-suggestions` does three things: it passes on
36
+ Claude Code's reply suggestion for terminal chats (see
37
+ [Reply suggestions](how-it-works.md#reply-suggestions)), it runs a
38
+ **Chat in IDE** on the model picked in **New agent** (see
39
+ [The model of a Chat in IDE](how-it-works.md#the-model-of-a-chat-in-ide)),
40
+ and in a background agent, after an ultracode switch made while it works,
41
+ it runs `/effort status` so the app can read the switch (see
42
+ [Ultracode](how-it-works.md#ultracode)). In other chats it runs nothing
43
+ for ultracode.
44
+
45
+ To install it, add this repository as a plugin marketplace and install the
46
+ plugin from it:
47
+
48
+ ```
49
+ claude plugin marketplace add abdullahkavakli/let-them-talk
50
+ claude plugin install let-them-talk-suggestions@let-them-talk
51
+ ```
52
+
53
+ Or, in a chat:
54
+ `/plugin install let-them-talk-suggestions --marketplace abdullahkavakli/let-them-talk`.
55
+
56
+ The plugin is the mod of the latest release, the same release as the app
57
+ `uvx let-them-talk` runs, so the two always match. A change made to the mod
58
+ after that release reaches the plugin only with the next release, which brings
59
+ both: update the plugin with
60
+ `claude plugin update let-them-talk-suggestions@let-them-talk`.
61
+
62
+ If you run a copy of the repository and want the mod to follow it, load it
63
+ from there instead. To load it in every chat started from then on, add its
64
+ absolute path to the `env` block of `~/.claude/settings.json`:
65
+
66
+ ```json
67
+ { "env": { "CLAUDE_CODE_PLUGIN_DIRS": "/path/to/let-them-talk/mods/let-them-talk-suggestions" } }
68
+ ```
69
+
70
+ For a single chat:
71
+ `claude --plugin-dir /path/to/let-them-talk/mods/let-them-talk-suggestions`.
72
+
73
+ A copy loaded this way (`CLAUDE_CODE_PLUGIN_DIRS` or `--plugin-dir`) takes the
74
+ place of an installed one with the same name, so having both is fine.
75
+
76
+ - Chats started before the mod was loaded show no suggestion until
77
+ restarted, and an ultracode switch made while they work shows only at
78
+ their next prompt.
79
+ - A **Chat in IDE** gets the picked model only where the mod is loaded: a
80
+ Cursor or VS Code connected to WSL reads the same `~/.claude/settings.json`;
81
+ one on Windows has its own.
82
+ - It talks to port 8765. If you changed `LTT_PORT`, edit `APP` in
83
+ `mods/let-them-talk-suggestions/hooks/register.ts` to match, in a copy of the
84
+ repository loaded as above: Claude Code keeps an installed copy itself and
85
+ may replace it when the plugin updates.
@@ -0,0 +1,227 @@
1
+ # How it works
2
+
3
+ Where the board's data comes from, how notes reach a chat, and what the app
4
+ stores.
5
+
6
+ ## Sessions and cards
7
+
8
+ - Live sessions come from `~/.claude/sessions/*.json`; background agents that
9
+ aren't running come from `claude agents --json --all`. (With
10
+ [`CLAUDE_CONFIG_DIR`](configuration.md#environment-settings) set, that
11
+ folder takes the place of `~/.claude` here and below.)
12
+ - A card greys out when its session ends, and leaves the board about two
13
+ minutes later unless it has arrows.
14
+ - Titles, models and recent messages are read from its transcript in
15
+ `~/.claude/projects/`, and a chat's agents from the subagent and workflow
16
+ files next to it.
17
+ - Inside WSL, sessions of Claude Code on native Windows are read from
18
+ `%USERPROFILE%\.claude` while their `claude.exe` runs.
19
+
20
+ ## Notes and messages
21
+
22
+ Notes are delivered by a short headless run,
23
+ `claude -p --model haiku --name let-them-talk`, whose only tool is
24
+ `SendMessage` (about 8 s); [`LTT_MODEL`](configuration.md#environment-settings)
25
+ picks another model.
26
+
27
+ Each note is then marked *sent*, *sent, reworded* or *failed*; until then its
28
+ arrow shows it is still sending (see [Arrows](usage.md#arrows)). If the
29
+ server restarts meanwhile, the run carries on without it, and the arrow is
30
+ settled from the chats' transcripts: *sent* once the note shows up there,
31
+ *failed* if it hasn't within 3½ minutes.
32
+
33
+ A message you send to a chat goes the same way, as *[Let Them Talk] Message
34
+ from your user:*, and a new editor chat's prompt as *[Let Them Talk] Your
35
+ user started this chat from Let Them Talk with this prompt:*. An idle
36
+ background agent gets yours as a prompt instead: typed into its prompt box
37
+ through `claude attach` while its process runs, or with
38
+ `claude --resume <id> --bg` once that has ended.
39
+
40
+ ## Images
41
+
42
+ An image you send is saved under a random name, readable only by you, in the
43
+ chat's own folder in Claude Code's temporary folder
44
+ (`/tmp/claude-<uid>/<project>/let-them-talk-images/`). Your text gets a line
45
+ `[Image: source: <path>]` for it, the way Claude Code names an image you
46
+ paste. The chat opens it with its Read tool without asking, as it does its
47
+ own files there.
48
+
49
+ Images older than a week are deleted the next time an image is saved.
50
+
51
+ ## An arrow's conversation
52
+
53
+ An arrow's **Conversation** is read from both chats' transcripts. A message
54
+ belongs to it when its message id is in one chat's `SendMessage` call and in
55
+ the other's transcript, or when it went to the other chat's own socket (*not
56
+ read yet* until it shows up there).
57
+
58
+ Matching by name is a last resort, used only when one side's transcript is
59
+ gone (*read state unknown* if it was the receiver's). A→B and B→A arrows show
60
+ the same messages between the two chats, each with its own notes.
61
+
62
+ ## TL;DRs
63
+
64
+ A TL;DR is written by `claude -p` on the same model as notes, with no tools
65
+ (about 7 s). It is written once per finished reply of 280+ characters, only
66
+ when you open that chat, and kept in memory until the server restarts.
67
+
68
+ ## Handoffs
69
+
70
+ A handoff is written by `claude -p --resume <id> --fork-session` on the
71
+ chat's own model, running the app's `/handoff` skill over the whole
72
+ conversation. The skill is loaded for that run only, with
73
+ `--plugin-dir mods/let-them-talk-handoff`; your own skills are left as they
74
+ are. It takes a few seconds to minutes and costs about one reply of that
75
+ chat. The fork is not saved.
76
+
77
+ Nobody can answer the fork, so it edits files without asking
78
+ (`acceptEdits`), in the chat's folder and in the handoff folder (see
79
+ [What is stored where](#what-is-stored-where)). It is told only to write the
80
+ handoff there; nothing else stops it from editing the chat's files.
81
+
82
+ ## Compacting
83
+
84
+ **Compact** types `/compact` into a running background agent through
85
+ `claude attach`, as a prompt is typed, pressing Enter only once its prompt
86
+ box shows `/compact`. An ended one is woken with
87
+ `claude --resume <id> --bg -- /compact`, which Claude Code runs as the
88
+ command too. A chat in a terminal or an editor gets only messages, read
89
+ between steps, and a message can't run a command, so it has no **Compact**.
90
+
91
+ Claude Code writes the result into the agent's transcript once it is done
92
+ (seconds, or a minute or two for a long conversation): a compact boundary
93
+ with the context's size before and after, then `/compact`'s answer. The app
94
+ reads what the transcript gets after you click. It stops waiting after 8
95
+ minutes, or once the agent is neither busy nor done for a few seconds (Esc in
96
+ its terminal, or it ended). Meanwhile it doesn't look up ultracode (see
97
+ [Ultracode](usage.md#ultracode)) in that agent.
98
+
99
+ ## Reply suggestions
100
+
101
+ The Send box shows the same grey suggestion as the chat's own prompt box, or
102
+ nothing:
103
+
104
+ - **A background agent that ends its turn waiting on you:** Claude Code saves
105
+ its suggestion in `~/.claude/jobs/<id>/state.json` (the one `claude agents`
106
+ offers with Tab), and the app reads it there. No setup, any agent. This job
107
+ file isn't an official Claude Code interface; if an update moves it, those
108
+ agents show nothing rather than wrong text.
109
+ - **Terminal chats, and background turns that don't wait on you:** Claude
110
+ Code saves the suggestion nowhere, so the
111
+ [suggestions mod](configuration.md#suggestions-mod) passes it on as it is
112
+ shown. When Claude Code makes none (the window isn't focused, or nobody is
113
+ attached) and the app has that chat's details open, the mod makes one the
114
+ way Claude Code does (one tool-less reply of the chat's own model over its
115
+ cached conversation). It puts it in the chat's prompt box too, so both
116
+ match.
117
+ - It first waits about 12 s for Claude Code's own.
118
+ - At most one per turn, none for chats nobody has open, and none once the
119
+ reply is more than 5 minutes old (its conversation may no longer be
120
+ cached).
121
+ - While the app waits for one (up to about 45 s after the reply, or after
122
+ you open the chat), the Send box says *Suggesting a reply…*.
123
+ - **Chats in Cursor or VS Code** show none, like their own composer: the
124
+ extension doesn't ask Claude Code for suggestions.
125
+
126
+ ## The model of a Chat in IDE
127
+
128
+ An editor link can't name a model, so the
129
+ [suggestions mod](configuration.md#suggestions-mod) runs a **Chat in IDE**
130
+ started from the app on the model picked in
131
+ [New agent](usage.md#new-agent). The app tells the mod which model as the
132
+ chat's first turns start, and the mod names that model on the chat's own
133
+ requests, not its subagents'.
134
+
135
+ ## Ultracode
136
+
137
+ Whether ultracode is on in a background agent (see
138
+ [Ultracode](usage.md#ultracode)) is read from its transcript: Claude Code
139
+ notes each `/effort` answered while the agent is idle ("Ultracode on …",
140
+ "Ultracode off …", or for `/effort status` a line that names ultracode only
141
+ while it is on), and at each prompt a reminder when it changed since the last
142
+ one. The newest of these counts, with what the app saw itself: a **Turn on**
143
+ or **Turn off**, or a look in its Effort panel.
144
+
145
+ - **While it works:** an `/effort` answers only on the agent's screen, and
146
+ its transcript gets nothing. In a background agent that loads the
147
+ [suggestions mod](configuration.md#suggestions-mod), the mod sees the
148
+ command run but not its answer. When `/effort ultracode …` or the Effort
149
+ panel gets no answer (an effort level alone leaves ultracode as it was, so
150
+ it doesn't count), it runs `/effort status` in the agent, once. Claude
151
+ Code queues it until the agent is idle, then notes its answer in the
152
+ transcript, where the app reads it like any other. The mod sends the app
153
+ nothing about it, and the app shows neither that line nor its queued entry
154
+ in the agent's messages. Without the mod, the agent's next prompt tells.
155
+ - **Only in background agents:** Claude Code starts one with
156
+ `CLAUDE_CODE_SESSION_KIND=bg`, which also makes its registry file's kind
157
+ `bg`, the kind the app reads. The mod runs `/effort status` only where that
158
+ variable says `bg`, so never in an ordinary terminal or IDE chat.
159
+ - **The app's own Turn on or off while it works:** the app reads Claude
160
+ Code's answer off the agent's screen, so it is in no transcript either.
161
+ The app keeps it on disk, as it does what a look in the Effort panel
162
+ showed, so a restart of the app loses neither.
163
+ - **Which process:** a switch the app keeps counts only while the process
164
+ that had it (by its pid) runs the agent, and only from when that process
165
+ started, so a later process that gets the same pid doesn't inherit it.
166
+ - **The panel opened only to look:** closed with Esc, Claude Code notes
167
+ "Cancelled", which changes nothing. Opened while the agent works, the mod's
168
+ `/effort status` reads what it left once the agent is idle.
169
+
170
+ ## Moving an editor chat to a terminal
171
+
172
+ The editor's Claude panel runs a chat as a Claude Code process of its own
173
+ (entrypoint `claude-vscode`, in `~/.claude/sessions/<pid>.json`). Claude Code
174
+ doesn't stop a terminal from resuming a conversation that process still holds;
175
+ both would write its transcript. So **Open in terminal** first closes the one
176
+ in the editor, then opens `claude --resume <id>`.
177
+
178
+ - **How it is closed:** the process gets SIGINT, once you said yes. In the
179
+ mode the extension runs it in, Claude Code answers by ending its turn,
180
+ saving the conversation and exiting with code 0, which is what happens when
181
+ the extension closes a chat itself (it ends the process's input). SIGTERM
182
+ would exit with code 143, which the extension reports as an error in the
183
+ panel, so it isn't used. The app waits up to 10 seconds for the process to
184
+ go; if it stays, nothing opens in the terminal and the notice says to close
185
+ the tab in the editor.
186
+ - **What the editor shows:** the extension sees the process end the way it
187
+ does when you close the tab, with no error. Its panel keeps the
188
+ conversation and is not started again by itself; a message typed there later
189
+ starts it, and the extension, which reads the same session files, sees the
190
+ terminal holds the chat and asks before taking it back.
191
+ - **Which chats:** a chat on this machine whose process was started by the
192
+ editor. Windows chats can't be signalled from here.
193
+
194
+ ## Security
195
+
196
+ The server listens only on 127.0.0.1 and answers only requests addressed to
197
+ `localhost` or `127.0.0.1` on its port. It takes commands only with its own
198
+ request header, which other web pages can't send, and tells browsers never to
199
+ show it in a frame.
200
+
201
+ ## What is stored where
202
+
203
+ The first group lives in the app's *data folder*. Run from a copy of the
204
+ repository (`./start.sh`), that is the app's own folder. Installed with `uvx`
205
+ or `pipx`, it is `~/.local/share/let-them-talk` (`$XDG_DATA_HOME/let-them-talk`
206
+ if that is set; the same on macOS), so nothing is written next to the
207
+ installed code. [`LTT_DATA`](configuration.md#environment-settings) picks
208
+ another folder in both cases. The app's own short `claude -p` runs (notes,
209
+ TL;DRs, looking up a model's full id) start in the data folder too, and save
210
+ no conversation.
211
+
212
+ - `boards/`: the boards, a card's name included.
213
+ - `logs/relay.jsonl`: every note and message sent through the headless run.
214
+ - `logs/suggestions.json`: the mod's latest suggestions, kept for a day.
215
+ - `logs/models.json`: the model picked for each Chat in IDE, kept a week, so
216
+ a chat resumed within a week still runs on it.
217
+ - `logs/ultracode.json`: each chat's latest ultracode switch the app made or
218
+ saw in its Effort panel, with the pid of the process that had it, kept 30
219
+ days.
220
+
221
+ Elsewhere:
222
+
223
+ - `let-them-talk-handoffs` in the system's temp folder (`/tmp` on Linux and
224
+ WSL): the handoffs.
225
+ - Images you send: see [Images](#images).
226
+ - What the page keeps in your browser: see
227
+ [What the page remembers](usage.md#what-the-page-remembers).