@vibelord/lanes 1.0.1 → 1.0.3

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 (52) hide show
  1. package/package.json +1 -1
  2. package/payload/lanes/README.md +37 -7
  3. package/payload/lanes/VERSION +1 -1
  4. package/payload/lanes/bin/lanes +664 -50
  5. package/payload/lanes/client/ghostty/common.conf +3 -0
  6. package/payload/lanes/client/ghostty/lanes-palette-light.conf +25 -0
  7. package/payload/lanes/client/ghostty/lanes-palette.conf +25 -0
  8. package/payload/lanes/client/ghostty/omarchy.conf +3 -2
  9. package/payload/lanes/client/lanes-launch +18 -3
  10. package/payload/lanes/client/lanes-window +17 -1
  11. package/payload/lanes/container/env.sh +1 -1
  12. package/payload/lanes/container/hooks/claude-settings.json +10 -0
  13. package/payload/lanes/container/hooks/codex-hooks.json +22 -0
  14. package/payload/lanes/container/lane +310 -26
  15. package/payload/lanes/container/lane-signal +173 -0
  16. package/payload/lanes/docs/ARCHITECTURE.md +87 -13
  17. package/payload/lanes/docs/DESIGN.md +182 -4
  18. package/payload/lanes/docs/INSTALL.md +37 -2
  19. package/payload/lanes/docs/RUNBOOK.md +458 -39
  20. package/payload/lanes/docs/SHARING.md +240 -5
  21. package/payload/lanes/holders/exec.sh +2 -5
  22. package/payload/lanes/holders.lock +13 -0
  23. package/payload/lanes/install/enable-studio-host.sh +14 -0
  24. package/payload/lanes/install/host-install.sh +15 -3
  25. package/payload/lanes/install/services.py +128 -4
  26. package/payload/lanes/install.sh +108 -3
  27. package/payload/lanes/libexec/agent_state.py +32 -0
  28. package/payload/lanes/libexec/cursor_sync.py +10 -2
  29. package/payload/lanes/libexec/economy_poll.py +685 -0
  30. package/payload/lanes/libexec/guard.py +27 -1
  31. package/payload/lanes/libexec/lanes_lib.py +285 -38
  32. package/payload/lanes/libexec/notify.py +317 -0
  33. package/payload/lanes/libexec/registrations.py +1 -1
  34. package/payload/lanes/libexec/session_actions.py +7 -8
  35. package/payload/lanes/libexec/sidebar.py +911 -218
  36. package/payload/lanes/libexec/statusd.py +258 -74
  37. package/payload/lanes/libexec/studio_host.py +1608 -0
  38. package/payload/lanes/libexec/tokens.py +38 -7
  39. package/payload/lanes/libexec/view.sh +13 -3
  40. package/payload/lanes/systemd/lanes-economy.service +20 -0
  41. package/payload/lanes/systemd/lanes-notify.service +19 -0
  42. package/payload/lanes/systemd/lanes-studio-host-enrol.service +11 -0
  43. package/payload/lanes/systemd/lanes-studio-host-enrol.timer +10 -0
  44. package/payload/lanes/systemd/lanes-studio-host.service +37 -0
  45. package/payload/lanes/systemd/lanes-sync.service +3 -0
  46. package/payload/lanes/web/README.md +83 -4
  47. package/payload/lanes/web/index.html +2 -1
  48. package/payload/lanes/web/mobile.css +53 -198
  49. package/payload/lanes/web/mobile.js +87 -55
  50. package/payload/lanes/zellij/config.kdl +67 -16
  51. package/payload/manifest.json +5 -3
  52. package/payload/lanes/libexec/legacy_sessions.py +0 -130
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibelord/lanes",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Installer for Lanes: shared agent terminals over SSH with Zellij views, registry sync, uploads and a phone interface.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -76,24 +76,31 @@ The installer starts an empty catalog safely; it does not assume anyone's contai
76
76
  | Independent second view | `lanes-window 2` |
77
77
  | Two or three panes per workspace | `lanes-window w2` / `lanes-window w3` |
78
78
  | Switch workspace | Ctrl–Alt–Left / Right |
79
- | Next or previous lane | Ctrl–Alt–Down / Up, or tap the sidebar |
79
+ | Next or previous lane | Ctrl–Alt–Down / Up (the focused pane moves to the next / previous lane of its workspace; nothing is typed, the focus stays), or tap the sidebar |
80
+ | Plain-ASCII glyphs, light or dark tokens | `lanes-window --ascii`, `lanes-window --light` / `--dark` (remembered per device in `devices/<device>.json`; a running sidebar picks it up within one tick) |
81
+ | Lock the view (every key reaches the lane) | Ctrl–Alt–G, again to unlock; the bar shows LOCKED in red. Ctrl–G itself always reaches the lane (Claude Code's editor key) |
80
82
  | Search lanes | Ctrl–Alt–/ |
81
83
  | Select a lane for pane 2 or 3 | `2` / `3` in the sidebar of a wide view |
82
84
  | Open one lane directly | `lanes-launch lane <lane-id>`; find IDs with `lanes-launch ls` |
83
- | Create a persistent workspace shell | **New +** under **Unregistered**, or `+` in the sidebar |
85
+ | Read a markdown file a lane mentioned | Ctrl–Alt–M opens a floating **Preview** pane over the focused lane: the `.md` paths it printed in its last 300 lines that exist in its container (relative ones resolved against its working directory). One is shown at once; several give a numbered menu, newest first (Enter = the newest, `q` closes). Rendered by `glow` in the view's dark/light theme (the server installer adds a pinned glow unless the view server's PATH — `~/.local/share/lanes/bin`, the checkout's `bin`, `/usr/local/bin`, `/usr/bin`, `/bin` — already has one; a glow only in `~/.local/bin` or `~/go/bin` does not count), else `less -R`; `lanes doctor` names which (`preview renderer:`); quitting the pager closes the pane |
86
+ | Create a persistent workspace shell | **+ New shell** under **Unregistered** (**New +** on the phone), or `+` in the sidebar |
84
87
  | Register an existing session | **+** beside an unregistered session, or select it and press `a`; choose a workspace |
85
- | See which agents need you | The sidebar sorts **Needs you** (◆ approval, ✗ error, ◇ waiting for a prompt), **Working** (▸) and **Done** (✓, until you open the lane) above the rest; the header counts them (`◆1 ◇2 ▸6 ✓1`) and every row shows how long (agent turn, else last output) |
88
+ | See which agents need you | The sidebar sorts **Needs you** (◆ approval, ✗ error, ◇ waiting for a prompt), **Working** (▸) and **Done** (✓, until you open the lane) above the rest; the header counts them in the same glyphs (`◆1 ◇2 ▸6 ✓1`, zeros left out; `N lanes` when no lane runs an agent) |
89
+ | Read a sidebar row | `▌` cursor · agent glyph · `›` the lane this pane shows (`²`/`³`: shown in pane 2/3) · the name (`·` per other viewer, `…` when clipped) · an **age column** on every row (agent turn, else last output: `45s`, ` 3m`, ` 2h`, ` 4d`; amber in **Needs you**) · stream glyph · one tail cell by priority (`?` not observed right now > `⚠` starving: producing output but no request for over 10 min, or a 429 > `↓` downgraded > `$` mostly paid — the economy cells need the opt-in economy poller; a dim `⚠`/`↓` is a frozen last-known figure, not a live alarm) · `×` close. `⋮ N more` ends a list that continues below |
86
90
  | End an unregistered session and its jobs | **×** beside the session, or select it and press `x`; confirm with `y` (any other key cancels) |
87
- | Upload | Drop onto the sidebar upload box, use `~/Lanes Uploads/<workspace>/`, or `lanes-upload <files>` |
91
+ | Every sidebar key | `?` replaces the list with the key sheet until the next key (that key only closes it). The footer legend says ` ⏎ open · / find · x close · ? keys`; prompts share one shape (` › close ‘name’? y/n`, ` › Rename: …█`, ` › Register ‘name’? y/n`) and a filter counts its matches (` /abc · 3 matches`) |
92
+ | Jump to the next lane that needs you | `Tab` / `Shift-Tab` in the sidebar (cycles **Needs you** from the lane the pane shows; the pane title carries the counts and a lane that starts needing you raises one OSC 9 desktop notification — `LANES_NOTIFY=0` silences it) |
93
+ | Other workspaces that need you | The row above the footer rule: ` ◆1 Worlds · ◇2 Code` (blank and absent when none; panes of 18 rows or more) |
94
+ | What the fleet spends | With the opt-in economy poller ([RUNBOOK](docs/RUNBOOK.md#economy-projection-opt-in)) the same row is the fleet economy strip instead: ` $8.5k/16k 53% · F2 S1 · spill 76% · free 3/19` — overflow spend against the daily cap (amber at the alert level), new upstream 429s, this workspace's lanes by model tier (`F` fable, `O` opus, `S` sonnet, `H` haiku, `G` gpt), the pool's spill fraction, free accounts and the next 5 h reset, whole parts dropped from the end to fit; a leading `?` means the figures are frozen — the poller could not reach the daemon, or it stopped (no rewrite for over 3 min) |
95
+ | Upload | Click the one-row upload strip above the footer (` ↑ uploads · click, then drop (U)`) or press `U`, then drop anywhere on the window; or use `~/Lanes Uploads/<workspace>/`, or `lanes-upload <files>` |
88
96
  | Phone setup from a client | `sh install/enable-phone.sh --host lanes` |
89
97
  | Laptop or tablet browser view | `lanes web <device> --desktop [--token]` on the server, or `sh install/enable-phone.sh --host lanes --desktop <device>` ([guide](docs/INSTALL.md#laptop-and-tablet-browser)) |
90
98
  | Switch workspace or lane in a laptop browser | The **Lanes** chip (top right) opens the workspace and lane pickers |
91
99
  | Detach | Close the window; the agents keep running |
92
100
 
93
101
  Unregistered sessions also appear when they use shared or previously unlisted tmux servers. Reopening a
94
- session reuses it; closing a view leaves it running. Registered lanes have no **×** control. Older plain
95
- Docker shells labelled **Legacy** are tracked and closable, but a lost Docker connection cannot be reopened;
96
- new shells support reconnection. See the [runbook](docs/RUNBOOK.md) for the transition details.
102
+ session reuses it; closing a view leaves it running. Registered lanes have no **×** control. See the
103
+ [runbook](docs/RUNBOOK.md) for details.
97
104
 
98
105
  **Add to workspace** keeps the session running and moves it into the selected workspace's registered list.
99
106
  The picker offers workspaces using the same container. Registration keeps its name and open views, persists
@@ -107,6 +114,21 @@ On macOS, allow **Lanes Helper** to read Downloads/Desktop/Documents when prompt
107
114
  errors are retained; an active large transfer is not cut off by a total-duration timeout. Files are read only
108
115
  from allowed folders and land in the selected workspace's `uploads/` directory.
109
116
 
117
+ ### Legend
118
+
119
+ Column 2 of every row says what the agent needs; column 33 says what the terminal is doing; the right edge says how
120
+ long (agent since-time, or last output). Glyph then ASCII twin (`LANES_GLYPHS=ascii`):
121
+
122
+ | Agent (column 2) | | Terminal (column 33) | | Marks |
123
+ | --- | --- | --- | --- | --- |
124
+ | `◆` `!` needs approval | `◇` `?` needs input | `●` `*` output in the last 20 s | `○` `o` quiet | `▌` `\|` cursor · `›` `=` viewing · `²` `2` / `³` `3` shown in viewport 2/3 |
125
+ | `▸` `>` working | `✓` `v` done (until viewed) | `–` `-` no session right now | `!` `!` pane dead | `·` `.` viewers · `…` `~` clipped · `×` `x` close |
126
+ | `✗` `X` errored | `_` `_` shell · `·` `.` idle | `✗` `x` container down | `?` `?` not observed · `·` `.` helper | `⋮` `:` more rows · `↑` `^` uploads · `↓` `v` drop now |
127
+
128
+ Column 34 is one tail cell: `?` stale (last known state shown) > `⚠` `!` starving > `↓` `v` downgraded > `$` mostly
129
+ paid. Colour is reinforcement, never the only signal; `LANES_COLOR=none` keeps every glyph. Full tables, tokens and
130
+ modes: [`docs/DESIGN.md`](docs/DESIGN.md).
131
+
110
132
  ## Share with your team
111
133
 
112
134
  Throttle's **Shared lanes** console provides an SSO-protected, read-only overview
@@ -117,10 +139,18 @@ platform/Host version, configuration, access rules and output limits.
117
139
  ## Screenshots
118
140
 
119
141
  **Desktop:** workspace tabs, registered and unregistered lanes, and uploads alongside the active terminal.
142
+ Captured before v2: the v2 sidebar shows attention sections, an agent glyph per row, the age column and a one-row
143
+ upload strip (see [docs/DESIGN.md](docs/DESIGN.md)). It also adds one economy tail cell per lane (column 34: `?` >
144
+ `⚠` > `↓` > `$`) and, with the opt-in economy poller, the fleet economy strip above the footer rule. The image is
145
+ user-supplied and not regenerated.
120
146
 
121
147
  ![Lanes desktop workspace with a lane sidebar, unregistered sessions, upload box, and workspace tabs](docs/images/desktop.png)
122
148
 
123
149
  **iPhone in Safari:** the lane picker and touch controls for workspaces, panes, and explicit text input.
150
+ Captured before v2: the v2 sidebar shows attention sections, an agent glyph per row, the age column and a one-row
151
+ upload strip (see [docs/DESIGN.md](docs/DESIGN.md)). On the phone the picker gives each lane three rows (name,
152
+ status and age, the agent's task) without the upload strip, and view tabs gain the quick-key row; the image is not
153
+ regenerated.
124
154
 
125
155
  <img src="docs/images/iphone.png" alt="Lanes on iPhone in Safari, showing the lane picker and Workspaces, Lanes, Panes, and Type here controls" width="360">
126
156
 
@@ -1 +1 @@
1
- 1.0.1
1
+ 1.0.3