From ead1dbc1084170a842a4437956851b481f593ef0 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 17:10:04 +0000 Subject: [PATCH 01/10] feat(tui): lock_v2 scenes for theme, fork, init, hooks Add runtime lock boards for COR-18, COR-225, COR-227, and COR-228. Skip COR-226 share/unshare. Leave existing designer PNGs untouched. Co-authored-by: Mathis --- docs/media/tui-lock-v2/SPEC.md | 9 +- docs/media/tui-lock-v2/index.md | 10 +- .../runtime/120x40/custom-commands.png | Bin 0 -> 8373 bytes .../runtime/120x40/handoff-confirm.png | Bin 0 -> 8572 bytes .../runtime/120x40/hooks-lifecycle.png | Bin 0 -> 10357 bytes .../runtime/120x40/init-agents.png | Bin 0 -> 11847 bytes .../runtime/120x40/session-fork.png | Bin 0 -> 7896 bytes .../runtime/120x40/theme-picker.png | Bin 0 -> 8783 bytes .../runtime/40x12/custom-commands.png | Bin 0 -> 4116 bytes .../runtime/40x12/hooks-lifecycle.png | Bin 0 -> 5071 bytes .../tui-lock-v2/runtime/40x12/init-agents.png | Bin 0 -> 4954 bytes .../runtime/40x12/session-fork.png | Bin 0 -> 3979 bytes .../runtime/40x12/theme-picker.png | Bin 0 -> 4775 bytes docs/media/tui-lock-v2/runtime/README.md | 6 +- scripts/render-tui-lock-v2.sh | 10 +- .../src/bin/generate_tui_lock_screenshots.rs | 4 + .../src/interactive/builders/theme.rs | 40 +- src/cortex-tui/src/lib.rs | 1 + src/cortex-tui/src/lock_v2.rs | 10 +- src/cortex-tui/src/lock_v2_boards.rs | 2 + src/cortex-tui/src/lock_v2_designed.rs | 347 ++++++++++++++++++ src/cortex-tui/src/lock_v2_ids.rs | 19 +- src/cortex-tui/src/modal/theme.rs | 12 +- 23 files changed, 428 insertions(+), 42 deletions(-) create mode 100644 docs/media/tui-lock-v2/runtime/120x40/custom-commands.png create mode 100644 docs/media/tui-lock-v2/runtime/120x40/handoff-confirm.png create mode 100644 docs/media/tui-lock-v2/runtime/120x40/hooks-lifecycle.png create mode 100644 docs/media/tui-lock-v2/runtime/120x40/init-agents.png create mode 100644 docs/media/tui-lock-v2/runtime/120x40/session-fork.png create mode 100644 docs/media/tui-lock-v2/runtime/120x40/theme-picker.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/custom-commands.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/hooks-lifecycle.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/init-agents.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/session-fork.png create mode 100644 docs/media/tui-lock-v2/runtime/40x12/theme-picker.png create mode 100644 src/cortex-tui/src/lock_v2_designed.rs diff --git a/docs/media/tui-lock-v2/SPEC.md b/docs/media/tui-lock-v2/SPEC.md index 4ed84fea..dc1c9987 100644 --- a/docs/media/tui-lock-v2/SPEC.md +++ b/docs/media/tui-lock-v2/SPEC.md @@ -10,7 +10,7 @@ captures use `MinimalSessionView` plus lock flags (`computer_held`, `show_computer_default`, `offline_held`, `rate_limit_held`) so MockTerminal matches live chrome. -- Boards: [`index.md`](index.md) — 89 boards at 120×40, 43 of them also at 40×12 (132 PNGs). +- Boards: [`index.md`](index.md) — **95** runtime boards at 120×40, 48 of them also at 40×12. Designer PNG files under `{40x12,120x40}/` from other PRs are not rewritten; new scenes are captured with `generate_tui_lock_screenshots --v2 --only`. - Grids: `txt//.txt` — the exact character grid of every board (diff a `MockTerminal` capture against these). - Renderer: `tools/render_lock_v2.py` + `tools/boards.py` (Python 3 + Pillow, IBM Plex Mono @@ -414,9 +414,10 @@ Narrow: no bars, `used / total pct%`. | slash-palette / slash-model-typed | `slash-palette` (`/goal` after `/plan`), `slash-model-typed` | | goal-chip (active / paused / done / budget / blocked) | `goal-chip-active`, `goal-chip-paused`, `goal-chip-done`, `goal-chip-budget`, `goal-chip-blocked` | | model-effort-low·medium·high / model-list-hover | `model-list`, `model-list-hover`, `model-effort-high`, `model-effort-medium`, `model-effort-low`, `model-effort-hover` | -| settings-appearance / mouse / row-hover / search / theme-submenu | `settings-appearance`, `settings-mouse`, `settings-row-hover`, `settings-search`, `settings-theme-submenu` | +| settings-appearance / mouse / row-hover / search / theme-submenu | `settings-appearance`, `settings-mouse`, `settings-row-hover`, `settings-search`, `settings-theme-submenu`, `theme-picker` | +| theme / handoff / fork / init / commands / hooks | `theme-picker`, `handoff-confirm`, `session-fork`, `init-agents`, `custom-commands`, `hooks-lifecycle` | | mode chips (Shift+Tab) | `mode-agent`, `mode-plan`, `mode-ask`, `mode-bash` | -| permissions / mcp / plugins / usage-quota / sandbox / cloud | `permission-prompt`, `permission-prompt-hover`, `permissions-picker`, `mcp-servers`, `mcp-drop`, `plugins`, `usage`, `quota-exhausted`, `sandbox`, `sandbox-deny`, `cloud-handoff`, `computer-disconnected`, `computer-cloud-default` | +| permissions / mcp / plugins / usage-quota / sandbox / cloud | `permission-prompt`, `permission-prompt-hover`, `permissions-picker`, `mcp-servers`, `mcp-drop`, `plugins`, `usage`, `quota-exhausted`, `sandbox`, `sandbox-deny`, `cloud-handoff`, `handoff-confirm`, `computer-disconnected`, `computer-cloud-default` | | diagnostics red/amber · interrupt/stopped | `diagnostics`, `interrupt-stopped`, `error-unavailable`, `offline`, `rate-limit` | | markdown table · diff hunk · code fence | `md-table`, `diff-hunk`, `edit-collapsed`, `code-fence`, `tool-tiles`, `tool-tiles-collapsed`, `shell-running` | | login / first-run | `login`, `login-waiting`, `login-success`, `login-error`, `first-run-tips` | @@ -428,7 +429,7 @@ Narrow (40×12) set: `welcome-cortex`, `welcome-agent`, `first-run-tips`, `sessi `session-thinking-live`, `session-assistant`, `session-optin`, `composer-empty`, `composer-typing`, `composer-hover`, `tokens-topright`, `compact-chat`, `slash-palette`, `goal-chip-active`, `goal-chip-paused`, `goal-chip-done`, `goal-chip-budget`, `goal-chip-blocked`, `slash-model-typed`, `model-list`, `model-effort-high`, -`settings-appearance`, `settings-mouse`, `settings-row-hover`, `settings-theme-submenu`, `mode-plan`, `mode-ask`, +`settings-appearance`, `settings-mouse`, `settings-row-hover`, `settings-theme-submenu`, `theme-picker`, `session-fork`, `init-agents`, `custom-commands`, `hooks-lifecycle`, `mode-plan`, `mode-ask`, `permission-prompt`, `mcp-servers`, `usage`, `diagnostics`, `interrupt-stopped`, `offline`, `rate-limit`, `computer-disconnected`, `computer-cloud-default`, `diff-hunk`, `login`, `shortcuts-overlay`, `consent-local-tools`, `composer-file-chip`, `undo-sheet`. diff --git a/docs/media/tui-lock-v2/index.md b/docs/media/tui-lock-v2/index.md index 26edd6b5..c9b03845 100644 --- a/docs/media/tui-lock-v2/index.md +++ b/docs/media/tui-lock-v2/index.md @@ -49,6 +49,11 @@ Regenerate: `python3 tools/render_lock_v2.py --index` (fetches IBM Plex Mono on | `goal-chip-budget` | Composer goal chip — `Goal · budget` (budget_limited), text-only | [120x40](120x40/goal-chip-budget.png) | [40x12](40x12/goal-chip-budget.png) | | `goal-chip-blocked` | Composer goal chip — `Goal · blocked`, text-only | [120x40](120x40/goal-chip-blocked.png) | [40x12](40x12/goal-chip-blocked.png) | | `slash-model-typed` | `/mod` typed — banner green matched chars, ghost completion | [120x40](120x40/slash-model-typed.png) | [40x12](40x12/slash-model-typed.png) | +| `theme-picker` | `/theme` — Cortex Night / Cortex Day / Ocean Dark / Monokai | [runtime 120x40](runtime/120x40/theme-picker.png) | [runtime 40x12](runtime/40x12/theme-picker.png) | +| `session-fork` | `/fork` — fork this session or stay | [runtime 120x40](runtime/120x40/session-fork.png) | [runtime 40x12](runtime/40x12/session-fork.png) | +| `init-agents` | `/init` — AGENTS.md diff to accept | [runtime 120x40](runtime/120x40/init-agents.png) | [runtime 40x12](runtime/40x12/init-agents.png) | +| `custom-commands` | `.cortex/commands` + repo `SKILL.md` | [runtime 120x40](runtime/120x40/custom-commands.png) | [runtime 40x12](runtime/40x12/custom-commands.png) | +| `hooks-lifecycle` | `/hooks` — pre_tool / post_tool / on_stop / plugin events | [runtime 120x40](runtime/120x40/hooks-lifecycle.png) | [runtime 40x12](runtime/40x12/hooks-lifecycle.png) | | `model-list` | `/model` — Cortex Mini 1 · Cortex 1 · Cortex Max 1 | [120x40](120x40/model-list.png) | [40x12](40x12/model-list.png) | | `model-list-hover` | Model list with mouse over row 3 | [120x40](120x40/model-list-hover.png) | — | | `model-effort-high` | Effort radios — High focused | [120x40](120x40/model-effort-high.png) | [40x12](40x12/model-effort-high.png) | @@ -85,6 +90,7 @@ Regenerate: `python3 tools/render_lock_v2.py --index` (fetches IBM Plex Mono on | `sandbox` | `/sandbox` — filesystem / network / escalation | [120x40](120x40/sandbox.png) | — | | `sandbox-deny` | Sandbox blocked a command — red title, radios | [120x40](120x40/sandbox-deny.png) | — | | `cloud-handoff` | `&` handoff to Cortex Cloud | [120x40](120x40/cloud-handoff.png) | — | +| `handoff-confirm` | `/handoff` — Cortex Cloud vs stay on this CLI (Chat · Code · Bot) | [runtime 120x40](runtime/120x40/handoff-confirm.png) | — | | `diagnostics` | Diagnostics tile — error red, warn amber | [120x40](120x40/diagnostics.png) | [40x12](40x12/diagnostics.png) | | `interrupt-stopped` | Esc / Ctrl+c — `× Stopped` | [120x40](120x40/interrupt-stopped.png) | [40x12](40x12/interrupt-stopped.png) | | `error-unavailable` | API down — product-facing error | [120x40](120x40/error-unavailable.png) | — | @@ -120,6 +126,4 @@ Regenerate: `python3 tools/render_lock_v2.py --index` (fetches IBM Plex Mono on | `composer-file-chip` | Composer with attached @file chip in prompt | [120x40](120x40/composer-file-chip.png) | [40x12](40x12/composer-file-chip.png) | | `undo-sheet` | /undo /redo /rewind sheet | [120x40](120x40/undo-sheet.png) | [40x12](40x12/undo-sheet.png) | -**89** boards at 120x40 · **43** at 40x12 · 132 PNGs. - -Runtime MockTerminal pack (same ids): [`runtime/120x40`](runtime/120x40/) (89) · [`runtime/40x12`](runtime/40x12/) (43). +**95** runtime boards at 120x40 · **48** at 40x12. Designer PNG pack from other PRs is unchanged; new COR-18/225/227/228 scenes are runtime captures. Computer lock boards from #69 stay in the pack. diff --git a/docs/media/tui-lock-v2/runtime/120x40/custom-commands.png b/docs/media/tui-lock-v2/runtime/120x40/custom-commands.png new file mode 100644 index 0000000000000000000000000000000000000000..c087f57b61ee59195e0dd74601bc7c06ef74371f GIT binary patch literal 8373 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 AL;wH) literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/runtime/120x40/handoff-confirm.png b/docs/media/tui-lock-v2/runtime/120x40/handoff-confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..ba1ff49f4c795e1f7af5ce09b70d99f20f4f5506 GIT binary patch literal 8572 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 literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/runtime/120x40/hooks-lifecycle.png b/docs/media/tui-lock-v2/runtime/120x40/hooks-lifecycle.png new file mode 100644 index 0000000000000000000000000000000000000000..986ab1bf0cbf6545362458bde5ad39ba8fb09c0c GIT binary patch literal 10357 zcmeHtS5#A7yY2#|s1yaIw+{qG1;o&zG!>K%f=CYtp-9I_?}DII0g;jbDotuA(hQ*( zDGC9RUP32PA+!hqg0L6gzc0=hXa6^6{NwDKZ{9FiYt47A^_FM8&olGF$lxyPNxqW+ z0I+InX&3{*@oxZd>?Jcjc*P&hZv+4rm9;f)-VZ>L374}MyPJS-<+*pHuhKGa>LZc7 zEIf-+XUonlp3ENRN?>8>?L}tu_KL=cZ!-i+^#n!V+IV%Xf0yrm@mZN?*L1`G{I#@n zWcWWZx_*Dh90LvY&y)WI9nLLG);TCgbA&yB~-q}@0I+^Y|E0}mvo^5< zPMq*OVa1=I6~hStc6lE}JiJ;q$bTlTv{Veei~z5_c~^RKp}jS6Fx3)VU;}>}y^$6v z%8j0;vV;^nvLY2dVuTeiyB8-)#Zu>v1HgOfzh3tQiWpJ57zo(ktKe6+;V$ijOhEp= z`=5xy|ALLN?bHWgaQ+o@BSV9Q_RcV2gW784v4Q2vjo&x#_W1!y`JW>wkB7S7wx9b_ z@FGY`fxjmw6EToNYUufW´EyR9`>^h%G+8@j%V^yyT7ZF5Bl%_BbIsts~w4hSf zZn{95&rSk8z_x^VtQ}4Y25ck-vP|N{wA=ptZtTkQS{tp+lX6~D1C%R%M?fqBn#}B$ z=WSQJxJ~2JkH_^Z>bqKDK4-P6mMA~gKw5DlpYz@ub86>944I{9#>6`=l}*j+IE|kRT@V;&9RXBQIcuV`lEWKyGZOw;WAVO>6q4!nkShy*Ek11&PU33 zH6Ru4W|=V{vGgLaW%0WByjfiQiM+KG&3QLAYby5|>=v5i>#AvKf0xg`gK2%NO(%cL zd)5qn7f(b3$}qi~4Yh$?4~XmcN`YK>OX#kE%8y>=ue|Eqe8MW;`donjv9m*e;R3mL z(stp?A+lr5?)zdPTy8=KjCqtB5-t6~4SiJ9q5tTorcAYY&k<`^4cSkW)P0sz8wO18 z8qss(j9t&h>(W59ao(l0ijJ968+m3@j$v_JCD5XPUR5XwZaz*8!%}aRsIHlAE7GzV z%@|H#>FxCMA`m<3dFc9&8n#JSUK7slXg2O(Tw&hT!E>r4_r#T9Czar5ZhgE1yj$5b z0#JFcRpG-CT`S3#>#Kdc_rIX>Gu3}Q6hLTb_HCnTr5`RA4rUF`4hEC89`JefvA}Xy z{+#-zd00G@bT~azvoc<2(?zYwQV7D^=@CQBJP2yM&D=@o6#*5>+N+u%L2U@Lw>shV zkdXeO{MWZ(X?U~jB^g+S4I*17D#$L>c|9d*ePH@juW3#`B+L_4-TyFIQ8c31_%d#H zI}CehHOV(t@yqK~w_5mXvT@@Mku@&9)vc?`!$V`vg8BD_BBG72YCRtXIi82-?LE7z zYH1Y?%Qur(H5E;UW6y{;hsV}@u?ikWNgTSf=Rs2(IqP9hoej|aW3blncvRXWudGGb zQuA%PT%9cz(u8gHLb%}t>)XfUV!f{L&d?bvB;Wh>pjR6$8a^zZ;8;rxQWSn*yjAn& z`+ldK|LzQDfJa`9=-RVsQw7^X!}JNUxTd=wR=Vuq`EECc$^!32)v6dNQ_`-6x!oG< zIK?HIYmF$e7@PWwSSr#&j5lQmtSo16ykYYO3ti_!uBe1cqq;7B_q_EiC0IczBCH}w zK6geSef3cS8d~gbfbU55Xe6$By<|*|eq@b!x=Ml@V6aK>jG5Lf@(4}i`p_)+luFXkR0ARQg4KKAhP7LNV&{{r^>v*bS> z_{RhPc;Fuo{NsUtJn;YSfrxq7HdiCT^Gjmr?xuLt70^=XpY2I6%=Y2^5@GN^WhmVR z@Q*1o$h3g>x7t9Sq<$_h*#AvV_yHvk*Iy`PD_2?Tjt793Ka<1vC`*rbyJikkEpX-r z9)kLe-`&q@PT=#pI!-c~CdaV+ZK?pS6u!5W(X+IPZat`QH|ulhcJ4FD0SOq7LH4i! zf6UeXaaB0xp;T~sOM!yaiZx5G0OR2X9>>Q?`R3y4TNS)RvIo+;?XcPQ}O z^wUEVOzTJ1L5JpbN6l@pUhBw{Kg^CVF#beHCOU1ZVj!FZ-Z;ozH z4~Z6zYYw+lQ011`1nWj(M}_8{S7LAb$%V&JhkMI25-;%4RS3v!p0T-}3>geZ0_9KZ zepe;ziz_|gedln8X8Q?Ry(s^BLw-$)AMFlLhrFx7er%AJQ{4BTjtrt8WkR*dD#TuG zudv-sM+7VRUFmp-I$EKD9%vhIXVgN*JB+$MXTct9P+OxR(OqYR29&mG3wZ}2FRiS^ zXj8f)qwf}FiWmSu2u7_cZtUW}C;oztq&!r<@ol0`xwx2PkE9d=ou@s@qK9Gq!<(ebrGOyMu+Nd;;4U zSO(7qtH%xt0uJNMQv259Pg%i~Qm&W@qj`)TNFEV?VC;duZB0QdNgaw%5^tvdCO{0bY*h97h)s{H=eq#xCVR1`p#%SC^hho0=BGw z7fTOB@Wmz#hc;Wp4!vNik(7g`^t2*<7sI2!*-J6`LWGw(2gPcxVn!nT*?) zu)i+Sd>oh!yuv8Or0rYjD>gT919RuT!_IEJ zBkZN`Sty;LbOI=De9`{aI;unszz`%(;MPa*t`{6H$S}H=4P6Gy(O$r;yn|;UWMY!$ z`#3PK*0-Xf=SseLy&06;Ih5viegWezGdXK6RnI?8()vk95_xMiXC!suB|qsBb;Ja1 z1_0m2Cf<$jdd>;jbNO*)43;r+C42M@@Ql_s5!H_+z(DIf9xRUng&O zZ;%A~!;3;>9Wr;WoJviAQ@ZxecfcAD7~hvwlYd>m?b=`%Q+sE1!wTfa9H8$B<)c7x>7|03z}s~!os}TM%pWecLI=bEAVI3rl3fC8%zmmO1 zI|w@R_woiu&`h*c|GnTkV@skO+ZQwbLzRv~Y!sPN4V z7iSDWtCMZ(O8G_DDThbzMo}(s7E~gJ9)o6FpERNO#r@n@K(cmd+2DCf~Jy3o>^` zxK@Yl5jELBn|9)$5{Oq%e`a_;y%LLbxHM93R%Kk>fP4uD5B53kkYHx z3dO`A%k5H{9k@3&Myc5mwUvjj6fmK_#6D{I=xf%?dl6}ZP|3o^S+lSJZS5+inLg0{ zV~^OEB9l#HV;NZ^O+fPy;gLcCnUOhp7nc&XL`L$9$N0?EuG3qSvCZ@xA zOk=gGQ8I)!1vlw~T)X^2z-yykTKlfp=1(PDKSMI&Q&t*ey1QnBG)+{+>{ecpA6a>XLzWJi81$}&y6C9yr0g9Z7| zPSHmezUKf$^!sYnIr&@%xs;1lk5uqC@w*e60}?}Gv%R8;U~~6xM@KW(mSpR(*GArc zJiXEKP6x$l}GuuzzH!c7VDNvSu$83J7un;qov!D)Wjy>hGP~yG<^4V|k zI*MAJd-ftr8X_Vxngm}a`%Mn(G`jDDT~zM3^G(0E!~TE`MKe#{S6ylT!Lp6Z@i*2= zA*7y}u@`8YpqRvqwCwg`Sgod(~N9or#{ZRA(alC&v(~y%q zT!yc|BtCwvi>G$SulAT!ZQ~s5S%ZR-Vjs3(duz+IfC*6dmsK3C^Y4YJMEPuQW@hK` z|K#n9621ulE{|IFd`5NJx;xT>p9L?awq)s0kYbdC#3!FwoVzAP(oBjx3CDo|C$F_b z8_jXmIIH-Fd)uyqvV#$kFhVlPN3;|3;Xv+&Vo(@6Nl6PC9T=&P|2R|ww*KrQn~!91 z{m7Y*XDk%LOtJ%)(ykBQ%0S(1C4LAV4{zM`>d`~abZopDjD zfq05C0CxAHe%svQ#KaBpe6r60ks68pHH~YUw<(qF%$S!KGTN+l1|u(#)NHit5+r>D z&`Qr1*RF&tuYwdr8--7Nq}hI8Bw z3&D77(KvDLOTu05_}W+~#ku zkAG-fQD~m<^H^TrYtHS?#<{-2uTbm*luH6zoXH|;-^%I)U4;{Q9y#0SVdPysp{*4e zL(+G|aPiP;oyL{7@7{E82vJ;6Ka`FEh8Ix|)>GG;5^a;u-qOloEMWJ}Biz zv-zWKh?}Q`3J!W0)h->s`=O%(Y{gP_!S{sE`K8-TT`#%1JEvIKi5&Fot&S7+!m5H6 zE4xn)`$&Mz+4Uy4O)n+-Mw*eI7dj|C$16v#y|RAOOb5MnDa@@Tn|d-sUuXb+eOoB8 zhJrDR6t4@uuygIC1I*SIw+uPv$n7B=$QrHAnp^NuX<8Q#V{o0uC@Zx%^%pPzmtM3Q zC22nk4WZ?sZFmnA1t7gWcS_~HZKd)bl1##T%V^JS&${A)gu?gVJeRUma?$;z#N z@{Divl{$_<0+%v>))_D0S8$8z4niQFPIQjv-h>xao7Y#blSBH8RtCDWW{gR9HopW4 zfT_Q_R@t;`;z86^X+o3(fP&z9oIl=Y{-v0}hXsMe5Xw2?iOYI7ex=O`FhTv}t*9f= zaO35vGaLzsNSLE)fpayn+acWu0Y?LX>#2gwPVQA|_=54A>oG@2uxaVayy{)8&ey(e z`DauWzuV9Hs6?s?2Zmun*_}fK>Mn~;u=rkcc-u=8awx@*e{`#G?|sXBf7PcBP(MQn z@FMGAXY<`kr*(Os+qr$ITi>O?P%zSH;>AeZW9pqfyeJ2S%D*CFDu&+=9W|7;TP zV^v)i94|vuR+fC&oN_mRgM}VoFTeAn=Ji0_IA54bkvrUUE{ENCJ2NRzj-&6RC_cwN z%=QSyEmce8!_R=VioDjk&(5=a_zFCL1cZzmf|Z1$;9@|VSjsfmz5dT5;&w3D%@Be@ zq2IAKGu_~Gr+=EPu@&%(8iEtpetiC$>fiON5wA-tC&D9_?fVd8&Mop)kH+}A^DSYg zzzOS0ynX8@t(LvOlH#LTVWA#it=(br^|nVXT;l6e*^y?SkQxc#N$jAj zH)TN=TgtDzdC`v9NHZOr9PfJ9gJfmQe>#l;gsC@)gMV|-S!BAY{)U{ZVrb1#6>jAARM}eKdTBLcHc-seY&k<B zuUo_a7N|7-B~a;S41vV0-klBfY|_8({I_)F9Haw!M7;o{f8atpe&oqS0qS4Yeaa_~ z1PHrfFngJUEnnj|0?2;6250`ycM8TzfT@tRs~O(jY(jf7bw0R0Q;(lL&}$~O#~=yu zN%qUn?aDn}!LrQyuMcj#7p(i@4JtkL9cKpvDF&Qfyjo#~oddIhX7AWW>?cH52b@e- z!Ow^gl-O-!I?bbN(6$YKA|D~+ zzS``x&t@W1mgRxZZ*S(OXlrpA^m}e!Dstz>T^+sEh=l}5%1+~9u|zZGv?!eBmVJ2+_vKN{V_y-s6{8LfApJ{Q1|8OIEj6ddTJuMD2iGfP`{DLS;xf z4~}9s_LnMAk2#FKgL~3uKPj=BG}B34tbycPRjsUlojxNj939;%sga~enNs>&WE!jI z`HMwnBwm=FObjP1IZURXD_3k~h&qHAZ0N3m83VlfeYNQ`(+=|Kk+iUG)W?(gOmn&& ztginrqfHX*v}dN#*x;KVgCIYqlx{$n0p;5M4!354XFR&KrDau0$YN0=X1NdKpxvVJ zOz^Omq^?W5TG{RG=MBt}bq^aFsBZhcPA5^va7Aq!?1mT6CRCUrVyPwmOc4aGg$8w_u7S*(AlkeFL5XcMW6NYxPvHUf zmVDH0OR?tjH4fVgTU+vEf#;|xV^Uk?%Cd=eZhPIts@iiKx`?RvJl@il%`6{n&*K&G zXnirWJ*idi6P3ouyJr_JidOl`o;{JF?}s7yRj8p_YXampxu^W{+M_KRy#z;k63uiw z(I^&llm6*RHGg~sx_ib zRChP|UF^#9zcr7N+?_@O_Ykz7Q_=B}wCkR5K>h#}z#l|*lkl^r?4nmyXR9Z;= zG4+->I+6#x#W(DceCxC&hIz92nl8qZw&RCA#2or>phq?9N4Ubz;|vs|GKQd*G-yo| zJ_`>;*njRH5ErYL^o5Z<9Bbq&CgzyY`VabOis6i1euAWVCbilZoq6xlh%twK7u?n^ zc*F6?1qQ%UrbJM;B~a4((ypto&%n?G8|R#E)(0a*b8dxQoaEz&@PvH)?DV;+jKVrZ zhxl*T!TA(hYagsz60ygV^TDG&+i_o*$F`q`2K22Nk=9_AnbPVKh)CkWCC)u`Jy=y?6O#=L{}vZ)`Dt!F)cJfP<3_&`*``$CkW zLr6*{^ec3;pCTDVbzfkJkc$m)G0Kka$|@(k+SwM`virWMmgs!2M7zgn!Qg!LJ25BV zgfCH76}`$d*KS{ncR_f#^);pJdcWx{8253yT1E8R*Xb*EQOB~(DTxSBA;pCK4f?jU z_nC7jXDNG~L>a}=0~Xt#d+wB){3Qn-s*^I2)+O+z`?`NRSt$xR@BEM=F}>b!ZRI0C z2==@pG#B7@Q?q@Sa5+q4s}Hq~57-hi!zjEn?t+FVajmh!(s<>Zra5>o3aLeDQetjj7nzyjK*Y4C(O0_tl z$<@$JmY6b2RQ?wx-6$N!zrk2=EClW|P6U8GBzp7d4N~WL7Fc{)Ig&@eO8ZZYHpH%) X+4<8k?n`;qNA|Qe4Kylm***O);J!z8 literal 0 HcmV?d00001 diff --git a/docs/media/tui-lock-v2/runtime/120x40/init-agents.png b/docs/media/tui-lock-v2/runtime/120x40/init-agents.png new file mode 100644 index 0000000000000000000000000000000000000000..7829931392b4ab6f3b1310d6441e1b423cbadb3d GIT binary patch literal 11847 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