dsh-ssh-tui 0.8.1 → 0.8.2-rc.1

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 (90) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/README.en.md +40 -8
  3. package/README.md +17 -1
  4. package/docs/release-notes-0.7.4.md +91 -0
  5. package/docs/release-notes-0.8.0.md +56 -0
  6. package/docs/release-notes-0.8.1.md +79 -0
  7. package/docs/release-notes-0.8.2-rc.1.md +159 -0
  8. package/docs/windows.md +13 -0
  9. package/lib/approval-state.js +148 -0
  10. package/lib/approval-state.js.map +1 -0
  11. package/lib/auth-failure.js +38 -0
  12. package/lib/auth-failure.js.map +1 -1
  13. package/lib/color-depth.js +26 -0
  14. package/lib/color-depth.js.map +1 -1
  15. package/lib/copy-text.js +30 -8
  16. package/lib/copy-text.js.map +1 -1
  17. package/lib/dialogs.js +81 -0
  18. package/lib/dialogs.js.map +1 -1
  19. package/lib/display-sock.js +138 -23
  20. package/lib/display-sock.js.map +1 -1
  21. package/lib/footer-accents.js +28 -0
  22. package/lib/footer-accents.js.map +1 -0
  23. package/lib/footer-budget.js +328 -0
  24. package/lib/footer-budget.js.map +1 -0
  25. package/lib/footer-format.js +433 -0
  26. package/lib/footer-format.js.map +1 -0
  27. package/lib/footer-layout.js +407 -0
  28. package/lib/footer-layout.js.map +1 -0
  29. package/lib/footer-meters.js +185 -0
  30. package/lib/footer-meters.js.map +1 -0
  31. package/lib/footer.js +19 -558
  32. package/lib/footer.js.map +1 -1
  33. package/lib/i18n/en.js +65 -5
  34. package/lib/i18n/en.js.map +1 -1
  35. package/lib/i18n/zh.js +67 -5
  36. package/lib/i18n/zh.js.map +1 -1
  37. package/lib/paint.js +53 -8
  38. package/lib/paint.js.map +1 -1
  39. package/lib/plan-projection.js +291 -0
  40. package/lib/plan-projection.js.map +1 -0
  41. package/lib/plan.js +50 -0
  42. package/lib/plan.js.map +1 -1
  43. package/lib/question-state.js +83 -0
  44. package/lib/question-state.js.map +1 -0
  45. package/lib/representation.js +283 -0
  46. package/lib/representation.js.map +1 -0
  47. package/lib/screen.js +105 -0
  48. package/lib/screen.js.map +1 -0
  49. package/lib/selection.js +5 -3
  50. package/lib/selection.js.map +1 -1
  51. package/lib/startup.js +49 -0
  52. package/lib/startup.js.map +1 -1
  53. package/lib/stats.js +101 -3
  54. package/lib/stats.js.map +1 -1
  55. package/lib/term-text.js +154 -55
  56. package/lib/term-text.js.map +1 -1
  57. package/lib/theme.js +20 -3
  58. package/lib/theme.js.map +1 -1
  59. package/lib/throughput.js +305 -0
  60. package/lib/throughput.js.map +1 -0
  61. package/lib/tool-present.js +57 -7
  62. package/lib/tool-present.js.map +1 -1
  63. package/lib/tui.js +3776 -1105
  64. package/lib/tui.js.map +1 -1
  65. package/lib/types/approval-state.d.ts +75 -0
  66. package/lib/types/auth-failure.d.ts +25 -0
  67. package/lib/types/color-depth.d.ts +21 -0
  68. package/lib/types/copy-text.d.ts +18 -1
  69. package/lib/types/dialogs.d.ts +111 -1
  70. package/lib/types/display-sock.d.ts +15 -0
  71. package/lib/types/footer-accents.d.ts +22 -0
  72. package/lib/types/footer-budget.d.ts +204 -0
  73. package/lib/types/footer-format.d.ts +221 -0
  74. package/lib/types/footer-layout.d.ts +292 -0
  75. package/lib/types/footer-meters.d.ts +151 -0
  76. package/lib/types/footer.d.ts +19 -269
  77. package/lib/types/paint.d.ts +48 -0
  78. package/lib/types/plan-projection.d.ts +162 -0
  79. package/lib/types/plan.d.ts +13 -0
  80. package/lib/types/question-state.d.ts +96 -0
  81. package/lib/types/representation.d.ts +498 -0
  82. package/lib/types/screen.d.ts +126 -0
  83. package/lib/types/startup.d.ts +24 -0
  84. package/lib/types/stats.d.ts +64 -1
  85. package/lib/types/term-text.d.ts +45 -1
  86. package/lib/types/throughput.d.ts +163 -0
  87. package/lib/types/tool-present.d.ts +41 -0
  88. package/lib/types/transcript-types.d.ts +63 -2
  89. package/lib/types/tui.d.ts +862 -11
  90. package/package.json +6 -2
@@ -0,0 +1,159 @@
1
+ # 0.8.2-rc.1 发版说明(候选版)
2
+
3
+ > **发布方式:只上 `next`。** 这是候选版(RC):`latest` 保持 **0.8.1**,只有显式装 `@next` 或指定
4
+ > 版本号的人才会拿到它。上一次发版:**0.8.1**(2026-09-30,`latest` + `next`)。
5
+ > 这一版是**架构收尾 + 稳定性**:把 0.8.x 期间分批落地的终端架构(screen / 表示管线 / 工作区区域)
6
+ > 冻结下来,并修掉两处**只有全新安装或弱链路才会遇到**的问题。
7
+
8
+ ## 头等事:全新安装**第一次就会出现配置向导**(此前根本不会出现)
9
+
10
+ 0.8.1 及以前,一台**没有任何配置**的机器上装好插件、启动 `dsh --profile tui`,看到的是:
11
+ 一个空工作区、一行都没有的提示,模型调用必然失败 —— **配置向导永远不会自动出现**。
12
+
13
+ 原因不在向导本身(它是好的),而在触发它的判断:前端拉起后台 Host 时**永远**带上
14
+ `--resume=<id>`(连它自己刚生成的那个新 id 也带),而首启判定把 `--resume` 当成"这台机器配置过",
15
+ 于是直接跳过了首启流程。
16
+
17
+ 0.8.2 起这条判断只看**凭据存不存在**:没有凭据、环境里也没有 key,就是首启,向导自动打开(Enter 走步骤、
18
+ Esc 随时退出),并且工作区会同时留下一行说明告诉你怎么手动重开 `/setup`。**第二次启动不会再出现**。
19
+
20
+ 这同时修掉一个连带问题:向导不再借用 composer 的输入框。0.8.1 里进入向导会**清掉你已经打了一半的草稿**;
21
+ 现在向导有自己的字段、自己的光标,工作区里的草稿、历史、正在进行的输入一个字都不动。
22
+
23
+ ## 工具卡与输入法:两处"画面串行"的修复
24
+
25
+ - **工具卡内容含多行代码时不再窜到输入区**。`bash` 卡片的标题就是命令行原文,遇到 heredoc(`<<'PY'`)会带
26
+ 着换行进入"一行"——终端因此真的换了行,而这一版之前按绝对行号绘制的帧随后把下面每一行都写错位:卡片内容
27
+ 落在输入框和页脚上,甚至两段文字拼在同一行。现在标题行会把换行折成空格,单行裁剪器也不再把换行交给终端。
28
+ - **Windows Terminal + 微软输入法:预输入不再在处理中卡片那一行闪烁**。终端把输入法的预输入画在光标处,
29
+ 而"写一行"会把光标留在该行末尾;跑一轮时实时区域每 tick 重画又正好在输入框上方,所以光标停在处理中卡片
30
+ 上。现在每写完一行就把光标交还输入框,预输入只会出现在它该在的地方。
31
+
32
+ ## resume 不再黑屏,思考卡片不再"发白",`q` 真的能关掉报告
33
+
34
+ - **resume 进入时的 1–3 秒黑屏**。前端先在备用屏打出"正在载入历史会话…",relay 接入时宿主又写了一次
35
+ `?1049h`——终端已经在备用屏时这个序列会**清屏**,而重建会话日志期间按设计不合成任何帧,于是那块加载
36
+ 提示被擦掉、屏幕空着,直到历史重建完成(实测 20k 事件:9.1 s 清屏、12.6 s 首帧落地,中间 3.5 s 全黑)。
37
+ 现在这条"进屏"序列跟着第一帧一起发出,同一 tick 内清屏并重画;没有东西要等的重连行为不变。
38
+ - **思考卡片的文字不再发白**。"思考 / 已思考"这一角色此前只写 `2;3` 两个**属性**、不写颜色——"暗"完全
39
+ 靠 faint,而不实现 faint 的终端(报告的 256 色终端)于是退回**默认前景色**,看起来和旁边的回复一样亮。
40
+ 四个调色板现在各自给出 muted 颜色,属性保留给支持的终端(`mono` 仍然只用属性)。
41
+ - **`q` / `Q` 能关掉报告**。`inspectClosesOn` 一直声明接受它们("全屏报告理应响应 q"),但可打印字符的
42
+ 提示分支在它之前返回,于是这两个键只会打印"这是报告视图,按 Esc 返回"。
43
+
44
+ ## 状态行不再把"绘制节奏"当成"链路延迟"
45
+
46
+ 现场报告(`/diag`):Linux + xterm-256color + SSH,`探测 未知(终端未回 DSR)`——这台终端**多数时候不回答
47
+ `CSI 6n`**,于是状态行常年显示 `SSH ○○○○ 160ms`。两个部分要分开看:
48
+
49
+ - **空心圆是对的**:没测到往返就是 `unknown`,不该假装知道链路好坏。
50
+ - **`160ms` 是错的**:那不是延迟,是**回退的绘制节奏**(探测不到时用的安全默认值)。它出现在"延迟"该在的
51
+ 位置上,读者无法分辨"离我 160ms"和"从来没测过"。这一格现在改为 `SSH ○○○○ 未测` / `SSH ○○○○ n/a`;
52
+ 测到过的链路照旧显示真实值,绘制节奏仍然出现在 `/diag` 那一行、并且写明是"绘制"。
53
+
54
+ 另外两个"看起来像 bug"的现象是设计使然,不是缺陷:
55
+
56
+ - **有回 DSR 时数值也不怎么动**:显示的是最近 3 次测量的**中位数**,重测间隔 20 秒;稳定的 SSH 链路上
57
+ 中位数本来就该是一条直线。Windows 本机之所以看得见跳动,是因为那些数字只有 1–12ms,同样抖动在两位数
58
+ 里显得大。
59
+ - **连续 3 次探测失败后不再每 20 秒重试**:退避到 10 分钟——避免"不回答 DSR 的终端被永远每 20 秒扫一次"。
60
+
61
+ ## 命令提示会自己让位(排队提示除外)
62
+
63
+ 命令的确认("已复制 412 字")与警告(命令失败)从此**显示约 6 秒后自动让位**,恢复原来的遥测行;按 Enter
64
+ 提交仍会立刻清掉。**唯一的例外**是"运行中已提交,将在下个步骤生效"这条:它显示到那条消息**真正被提交**
65
+ 为止——它是"你有话在排队"的唯一标记,提前消失等于把排队这件事藏起来。
66
+
67
+ ## 弱链路 / SSH:画面更稳,流式不再整屏重画
68
+
69
+ 这一版把 0.8.x 期间逐块落地的渲染架构冻结下来,对**远程、跳板机、弱网**最直接的三条:
70
+
71
+ - **流式输出不再每个 tick 整屏重画**:正在生成的回复是一个**投影**,不再是往历史里追加行,所以每个
72
+ token 批次只重画它自己那几行。实测(100×20):一次流式 delta 寻址 **3 行 / 478 字节 / 0 次全屏清屏**。
73
+ - **报告不再污染对话记录**:`/status`、`/help`、`/doctor`、`/subagents`、`/diag` 现在是**独立的屏**,
74
+ 打开不改变历史窗口位置,翻页只重画正文,Esc 回到你原来的位置,也不会在重连后被重新画出来。
75
+ - **断线重接后表示一致**:提问、审批、计划三种卡片从**会话日志**折叠出来,因此掉线重接、换窗口、
76
+ `--resume` 之后读到的状态与当时一致,而不是"重连后多出一张卡"或"状态回到未知"。
77
+
78
+ ## `/clear` 只清可见视图
79
+
80
+ `/clear` 不删除任何东西:不删会话日志、不动模型上下文、不动计划 artifact。它只是把**可见视图**切到
81
+ 当前时刻之后(并且用一行提示告诉你这件事)。`/resume` 进来仍然是完整历史。`/find` 只在你**看得见**的
82
+ 范围里搜索,这一点也在提示里说明。
83
+
84
+ ## 计划与实时处理的抢占关系
85
+
86
+ 计划条(Plan Dock)不再被"处理中"的实时区域盖住:实时区域现在是**自己的行**,而不是画在历史上面。
87
+ 计划条高度上限为工作区一半,所以它不会把输入框和光标挤出屏幕(中文输入法的预输入串也不会再落到
88
+ 计划卡上)。终端很矮时计划条按三档降级(完整 / 紧凑 / 极简),不会直接消失。
89
+
90
+ ## 反馈去哪了("我执行了命令但没有任何提示")
91
+
92
+ - 控制面的确认(切主题、切视图、preset 写入…)进**页脚**,显示到下一次输入为止;
93
+ - 警告与失败进**身份行**(原来 `目录:` 那一行),不盖住你正在读的内容;
94
+ - 只有**会改变历史**的事实才进对话记录。
95
+ 页脚挤不下时确认会退到身份行显示,所以再也不会有"执行了但什么都没有"。
96
+
97
+ ## 上游 400:现在会告诉你它是什么
98
+
99
+ `command-code` 这类思考模式网关偶尔会**成串**拒收请求(实测:一次长会话里 13 个失败轮次中 12 个是这种),
100
+ 以前你只看到一行原始错误。现在:
101
+
102
+ - 明确说出**网关拒收的是请求本身、不是你的 key**;
103
+ - 指名已知的那一族缺陷(上游 #1780 / #231,思考模式的 reasoning 回传);
104
+ - 给出可操作的两条绕法(该路线 `/effort off`,或换同一网关的 command-code-messages);
105
+ - **不会自动重试** —— 实测这类失败会成串出现(连续 8 轮),重发通常值得,但同一个请求确定性失败时
106
+ 自动重试会白花一整段上下文。什么时候重发由你决定。
107
+
108
+ ## 数字(本版实测,100×20)
109
+
110
+ | 动作 | 毫秒(中位) | 字节 | 寻址行 | 全屏清屏 |
111
+ |---|---|---|---|---|
112
+ | 流式 delta | 1.43 | 501 | 3 | **0** |
113
+ | 等待卡时钟 | 1.25 | 465 | 3 | **0** |
114
+ | 报告屏翻页 | 1.19 | 2457 | 17 | **0** |
115
+ | 菜单光标移动 | 0.97 | 588 | 4 | **0** |
116
+ | 向导字段打字 | 0.22 | 140 | 1 | **0** |
117
+
118
+ 发版候选(`c2fe073`)自检,逐条可复现:
119
+
120
+ | 自检 | 结果 | 命令 |
121
+ |---|---|---|
122
+ | 冻结不变量 | 八条全绿 · 七条退役路径 **0 命中** | `npm run freeze` |
123
+ | 性能基线 | 上表五行 · 全部 **0 次整屏清屏** | `npm run bench` |
124
+ | 全套测试(Linux) | 1376 项 · **1372 通过 · 0 失败 · 4 跳过** | `npm test` |
125
+ | 全套测试(Windows 实机) | 1376 项 · **1365 通过 · 0 失败 · 11 跳过**(跳过均为平台互斥用例) | `npm test` |
126
+ | 打包 | **243 个文件** · tarball **1.4 MB** · 解包 **4.2 MB** · shasum `92b7f517…` · 无凭据 / 无 home / 无 sqlite | `npm pack --dry-run` |
127
+
128
+ 跳过只代表"这台机器上没跑",不代表通过:`verify-batch` 见到 `SKIP:` 就收尾 `INCOMPLETE`(见
129
+ [`release.md`](release.md))。
130
+
131
+ ## 兼容
132
+
133
+ 上游兼容窗口与 0.8.1 相同(`0.2.0-rc.1` / `0.2.0-rc.2` / `0.1.7-rc.1` / `0.1.7-rc.2`)。
134
+ 这一版**不改协议、不加命令、不动上游接口**。
135
+
136
+ ## 安装 / 升级
137
+
138
+ ```sh
139
+ dsh plugin --profile tui add dsh-ssh-tui@0.8.2-rc.1
140
+ ```
141
+
142
+ 装完退出再启动。`/status` 可确认当前版本;装不上先看 `/doctor`。
143
+
144
+ ## 已知限制
145
+
146
+ - **Windows / ConPTY 实机人工验收:已完成(2026-10-03,维护者)**。用一份单独安装的 CLI dsh 逐条走过
147
+ 12 项清单,逐项结论见 [`checkpoints.md`](checkpoints.md)「Windows 实机轮」。分三类:
148
+ **可自动化的部分全绿**(`verify-batch --home <dir>`:12 PASS · 2 SKIP · 0 FAIL);**两处 ConPTY 盲区**
149
+ 明确打印 `SKIP:` 并附理由(ConPTY 自己回 `CSI 6n`,"慢链路"与"终端静默但没断连"这两个形状它扮演不了);
150
+ **没有自动化、只能人眼的两目已由维护者确认通过**——微软拼音 IME 组合、多行中文粘贴(清单与走法见
151
+ [`release.md`](release.md)「发布前人工门槛」)。两处 `SKIP` 是**覆盖边界**,不是通过:它们
152
+ **在 Linux 腿上是真跑的**(`link` 第一段、`cut` 的"静默终端"那一半),在 ConPTY 上才无信号。
153
+ - **`未测` 那一格在 Windows 本机看不到**:ConPTY 代答光标位置,本机链路芯片因此永远是"已测量"。
154
+ 该形状由 `scripts/tui-unmeasured-probe.mjs` 用管道父进程覆盖(两条腿:不回话读 `未测`、每条必答读
155
+ 真值),已进 CI 两条腿。
156
+ - **拖放探针此前约 1/7 概率误报**(探针自身与自己的 `/status` 重试竞态,不是产品行为)。本版已修,
157
+ 并连跑 20 次验证。
158
+ - `--resume` 与首启的关系见上文:本版修的是"新机器不显示向导",不是"resume 不再触发向导"。
159
+ - 依赖旧版 inbox 通知(inbox P3)与新协议的命令不在本版范围内。
package/docs/windows.md CHANGED
@@ -118,6 +118,19 @@ Host 的 stderr 记在 `%USERPROFILE%\.dsh\tui-socks\`,锁在 `%USERPROFILE%\.
118
118
  **终端能力。** Windows Terminal 与老的 conhost 能力不同(剪贴板写入、超链接只在 Windows Terminal 上承诺)。
119
119
  判定写在 `/diag` 的「终端」一行,判错了用 `DSH_TUI_TERM_CAPS` 覆盖,详见 [terminals.md](terminals.md)。
120
120
 
121
+ ## ConPTY 会替你的终端回答两件事
122
+
123
+ 这两件事在 Windows 上按"实测"读会读错,写在这里免得当成缺陷追:
124
+
125
+ 1. **`CSI 6n`(问光标位置)由 ConPTY 代答。** 所以底栏链路芯片在 Windows 本机永远是"已测量"
126
+ (`SSH ●●●● 0–12ms`),**看不到 `未测`**——`未测` 是"终端不回 DSR"的形状,在你的 Linux/SSH 会话
127
+ 里才会出现。要看这一格,用管道父进程的形状:
128
+ `node scripts/probe-home.mjs --probe --script tui-unmeasured-probe.mjs`(两条腿:不回话读 `未测`、
129
+ 每条必答读真值)。
130
+ 2. **输出流不是插件写出去的那份。** ConPTY 把每一帧重新发成以换行分隔的批次,还会自己写清屏和回车:
131
+ 同一次 boot 加 `/diag`,`ESC[<row>;1H` 在 ConPTY 上是 3 个、在管道上是 95 个。所以"逐行寻址""不许
132
+ 清屏"这类检查在 ConPTY 上会打印 `SKIP:`(不是通过,也不是失败),详见 [release.md](release.md)。
133
+
121
134
  ## CI 证明不了、需要你自己看一眼的
122
135
 
123
136
  这两项在自动化里只能证明一半:
@@ -0,0 +1,148 @@
1
+ /**
2
+ * What a tool card may say about the approval that guarded it.
3
+ *
4
+ * Approval is a *state of the tool call*, not an event with a history of its own
5
+ * (B2.4): a tool that needed a decision says so on its own card, and nothing else
6
+ * in the transcript claims to be that decision.
7
+ *
8
+ * The hard half is not the state, it is the *evidence*. Two facts are durable and
9
+ * both belong to the Harness, not to this plugin:
10
+ *
11
+ * `approval/asked` — `{ id, toolName, callId?, reason? }`
12
+ * `approval/decided` — `{ id, outcome }`, `outcome ∈ allowed-once|rejected|cancelled|unavailable`
13
+ *
14
+ * Everything else is weaker, and the difference is carried in {@link
15
+ * ApprovalProvenance} rather than smoothed over: reading the log after a resume
16
+ * answers with `durable`, a live decision answers with `live` (a human) or
17
+ * `policy` (a rule, a cached verdict, a reviewer), and a log that predates the
18
+ * audit pair can only be read by `inferred`. The rule this module exists to hold:
19
+ * **a weaker source may never claim more than it proves** — in particular nothing
20
+ * here can ever produce `approved` from an inference, and an ask with no recorded
21
+ * decision is `unknown`, never `approved`.
22
+ *
23
+ * This module is pure (no session, no TUI) so both the live path and a replay go
24
+ * through the same mapping, and so the mapping is testable without a TUI.
25
+ *
26
+ * @module dsh-ssh-tui/approval-state
27
+ */
28
+ import { t } from './i18n/index.js';
29
+ /** Strongest first: a weaker source never overwrites a stronger one. */
30
+ const PROVENANCE_ORDER = {
31
+ live: 3,
32
+ policy: 3,
33
+ durable: 2,
34
+ inferred: 1,
35
+ };
36
+ /**
37
+ * One approval fact onto a card's current field.
38
+ *
39
+ * `next` wins on state when it is at least as strong as what is already there. A
40
+ * live decision is not overwritten by the durable event of the *same* decision
41
+ * (which arrives right behind it on the live path and says strictly less), and an
42
+ * inference never replaces anything but an inference.
43
+ * @param current - the field as it stands, if any.
44
+ * @param next - the fact being applied.
45
+ * @returns the field the card should carry.
46
+ */
47
+ export function mergeApproval(current, next) {
48
+ if (current === undefined)
49
+ return next;
50
+ const strength = PROVENANCE_ORDER[next.provenance];
51
+ const existing = PROVENANCE_ORDER[current.provenance];
52
+ if (strength < existing) {
53
+ // Keep the stronger state, but a reason is still worth having.
54
+ return current.reason !== undefined || next.reason === undefined
55
+ ? current
56
+ : { ...current, reason: next.reason };
57
+ }
58
+ if (strength === existing && current.state === next.state) {
59
+ return current.auto === next.auto && current.reason === next.reason
60
+ ? current
61
+ : { ...current, ...next, provenance: current.provenance };
62
+ }
63
+ // Same strength, or a stronger fact: it wins, and it keeps the better label.
64
+ return existing > strength ? current : { ...current, ...next };
65
+ }
66
+ /**
67
+ * A recorded outcome as a card state.
68
+ *
69
+ * `cancelled` and `unavailable` are deliberately **unknown**, not `rejected`: the
70
+ * reader's Esc, or a Host that had no approval channel, is not the human refusing
71
+ * the tool, and printing a refusal they did not make is exactly the kind of
72
+ * comfortable lie this field exists to prevent.
73
+ * @param outcome - the `approval/decided` outcome, as recorded.
74
+ * @returns the state the card shows.
75
+ */
76
+ export function approvalStateFromOutcome(outcome) {
77
+ if (outcome === 'allowed-once')
78
+ return 'approved';
79
+ if (outcome === 'rejected')
80
+ return 'rejected';
81
+ return 'unknown';
82
+ }
83
+ /**
84
+ * Whether a tool result proves an approval was **refused** when no audit events
85
+ * survived.
86
+ *
87
+ * Only the Harness's own refusal sentences count. A generic denial (`denied by
88
+ * policy`, `blocked`) does *not* prove an approval was ever needed, and the whole
89
+ * point of the `inferred` provenance is that it is used only where the text can
90
+ * carry it: the phrase below is what `dsh-tools` writes when `approval.request()`
91
+ * came back `rejected` or `cancelled`, so it cannot appear for a tool that was
92
+ * refused by a rule instead.
93
+ *
94
+ * It can never produce `approved` — running successfully is not evidence that
95
+ * anyone approved anything (a tool with no approval requirement runs too).
96
+ * @param text - the tool result's text.
97
+ * @returns `rejected` when the text is that refusal, undefined otherwise.
98
+ */
99
+ export function inferredApprovalFromResult(text) {
100
+ if (/the user rejected tool "[^"]*"/u.test(text))
101
+ return 'rejected';
102
+ if (/approval for tool "[^"]*" was cancelled/u.test(text))
103
+ return 'unknown';
104
+ return undefined;
105
+ }
106
+ /** A one-word label for the card chip. */
107
+ export function approvalStateKey(state) {
108
+ return `approval.badge.${state}`;
109
+ }
110
+ /**
111
+ * The provenance note shown beside the state.
112
+ *
113
+ * `live` and `durable` say nothing extra: a person's own decision and the log of
114
+ * it are the same fact at two moments. `policy` and `inferred` do, because the
115
+ * reader is being told something weaker and has to be able to tell.
116
+ */
117
+ export function approvalProvenanceKey(approval) {
118
+ if (approval.provenance === 'inferred')
119
+ return 'approval.badge.inferred';
120
+ if (approval.auto === true)
121
+ return 'approval.badge.auto';
122
+ return undefined;
123
+ }
124
+ /**
125
+ * The expanded card's own line for the approval.
126
+ *
127
+ * It names the state, the strength of the evidence, and the reason when one
128
+ * survived: `live`/`durable` need no apology, `policy` is marked automatic, and
129
+ * `inferred` says outright that the card is reading the log rather than quoting it.
130
+ * @param approval - the card's approval field.
131
+ * @returns the sentence, already translated.
132
+ */
133
+ export function approvalDetailText(approval) {
134
+ const state = t(approvalStateKey(approval.state));
135
+ const provenance = t(`approval.badge.${approval.provenance}`);
136
+ const reason = approval.reason === undefined || approval.reason === '' ? '' : ` · ${approval.reason}`;
137
+ return t(approval.auto === true ? 'approval.badge.detailAuto' : 'approval.badge.detail', { state, provenance, reason });
138
+ }
139
+ /** Whether two approval fields would render identically. */
140
+ export function sameApproval(left, right) {
141
+ if (left === undefined || right === undefined)
142
+ return left === right;
143
+ return left.state === right.state
144
+ && left.provenance === right.provenance
145
+ && left.auto === right.auto
146
+ && left.reason === right.reason;
147
+ }
148
+ //# sourceMappingURL=approval-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-state.js","sourceRoot":"","sources":["../src/approval-state.ts"],"names":[],"mappings":"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"}
@@ -125,4 +125,42 @@ export function isReasoningReplayFailure(message) {
125
125
  return /reasoning_text[^.]{0,80}must be passed back/iu.test(text)
126
126
  || /thinking mode must be passed back/iu.test(text);
127
127
  }
128
+ /**
129
+ * A gateway that refused the request itself, without saying why.
130
+ *
131
+ * The sibling of the failure above, and the one a reader actually meets most: the
132
+ * same thinking-mode route answers a bare envelope with a trace id and nothing else.
133
+ * Measured in one long session (2026-10-03, command-code, `effort: max`):
134
+ *
135
+ * 13 of 14 failed turns were this shape, 12 of them bare
136
+ * they arrived in runs — eight consecutive turns over twelve minutes, then the
137
+ * same route, model and key answered normally again
138
+ * the harness made 14 attempts and 0 retries (a 400 is outside its retryable set)
139
+ *
140
+ * Those three facts decide what the plugin may say and may do. It may say the
141
+ * request body was refused (not the credential) and that the known member of this
142
+ * family is the reasoning-replay defect. It may *not* claim that sending again will
143
+ * work: the envelope carries no reason, and a run that deep may equally be a request
144
+ * the API will keep refusing. What it must not do is retry on its own — the sibling's
145
+ * case below is deterministic, and this one re-sends a whole context to find out.
146
+ *
147
+ * The envelope is deliberately narrow: a 400 whose body names a field
148
+ * (`unknown field "summary"`) is a different fix and is not this.
149
+ * @param message - the failure text the host attached to the turn.
150
+ * @returns true when this is a bare 400 rejection.
151
+ */
152
+ export function isRequestRejectedFailure(message) {
153
+ const text = String(message ?? '');
154
+ if (text === '')
155
+ return false;
156
+ if (isReasoningReplayFailure(text))
157
+ return false;
158
+ if (statusOf(text) !== 400)
159
+ return false;
160
+ if (!/invalid[_ ]request/i.test(text))
161
+ return false;
162
+ // A body that names a field, a parameter or a type is diagnosable, so it is not
163
+ // this case: the notice exists because there is nothing else to go on.
164
+ return !/unknown (?:field|parameter)|unrecognized|missing (?:field|parameter)|json:/iu.test(text);
165
+ }
128
166
  //# sourceMappingURL=auth-failure.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-failure.js","sourceRoot":"","sources":["../src/auth-failure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAWH;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAsB;IAC3C,yBAAyB;IACzB,6BAA6B;IAC7B,wBAAwB;IACxB,uBAAuB;IACvB,iBAAiB;IACjB,iCAAiC;IACjC,0BAA0B;IAC1B,gCAAgC;IAChC,qBAAqB;IACrB,iBAAiB;CAClB,CAAA;AAED,6DAA6D;AAC7D,MAAM,cAAc,GAAsB;IACxC,wCAAwC;IACxC,6EAA6E;IAC7E,6CAA6C;IAC7C,kDAAkD;IAClD,OAAO;IACP,+BAA+B;CAChC,CAAA;AAED,wEAAwE;AACxE,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,6EAA6E;IAC7E,wBAAwB;IACxB,MAAM,KAAK,GAAG,qCAAqC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACjE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;AACrD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;IAClC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7B,0EAA0E;IAC1E,uEAAuE;IACvE,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;IAC/H,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;IAC3E,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;IACrI,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;IAClC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IAC7B,OAAO,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC;WAC5D,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvD,CAAC"}
1
+ {"version":3,"file":"auth-failure.js","sourceRoot":"","sources":["../src/auth-failure.ts"],"names":[],"mappings":"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"}
@@ -244,4 +244,30 @@ function sgrToBasicIndex(sgr) {
244
244
  function sgrTo256(sgr) {
245
245
  return sgrToBasicIndex(sgr);
246
246
  }
247
+ /**
248
+ * Paint one run of text in one role's colour.
249
+ *
250
+ * The one helper the footer's whole colour grammar is built on — the meter
251
+ * primitives paint their filled cell with it and the status row paints the link's
252
+ * pips — so it lives here, beside `downgradeSgr`, rather than in a module of its
253
+ * own. Three rules it keeps:
254
+ *
255
+ * - it wraps *one* run, closes itself, and stops there;
256
+ * - re-opening the surrounding muted style is the *row owner's* job
257
+ * (`muteFooterLine` in `tui.ts` reopens it after every reset), because doing it
258
+ * here as well produced two identical `90m` sequences per accent and made the
259
+ * output depend on which separator the caller passed;
260
+ * - a terminal with no colour left answers with the text unchanged, so the
261
+ * `no-color` and `mono` paths need no branch of their own.
262
+ * @param text - the run to paint.
263
+ * @param token - SGR parameters for the role, as `theme.ts` emits them.
264
+ * @param depth - what the terminal can take.
265
+ * @returns the run, painted when there is colour to paint it with.
266
+ */
267
+ export function accent(text, token, depth) {
268
+ const code = downgradeSgr(token, depth);
269
+ if (code === '' || text === '')
270
+ return text;
271
+ return `\x1b[${code}m${text}\x1b[0m`;
272
+ }
247
273
  //# sourceMappingURL=color-depth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"color-depth.js","sourceRoot":"","sources":["../src/color-depth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"color-depth.js","sourceRoot":"","sources":["../src/color-depth.ts"],"names":[],"mappings":"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"}
package/lib/copy-text.js CHANGED
@@ -50,16 +50,38 @@ export function copyTextFromRow(row) {
50
50
  return '';
51
51
  }
52
52
  }
53
- export function copyTextFromTranscript(rows, focused) {
54
- const focusedText = copyTextFromRow(focused ?? undefined);
55
- if (focusedText.trim() !== '')
56
- return { text: focusedText, source: 'focused' };
53
+ /** The newest model reply with text, or `''` when the session has not produced one. */
54
+ export function latestReplyText(rows) {
57
55
  for (let i = rows.length - 1; i >= 0; i -= 1) {
58
56
  const row = rows[i];
59
- if (row?.kind === 'assistant' && row.text.trim() !== '') {
60
- return { text: clipCopy(row.text), source: 'assistant' };
61
- }
57
+ if (row?.kind === 'assistant' && row.text.trim() !== '')
58
+ return clipCopy(row.text);
59
+ }
60
+ return '';
61
+ }
62
+ /**
63
+ * The text one copy target holds.
64
+ *
65
+ * The two targets are deliberately exclusive. They used to be one rule —
66
+ * "the highlighted card, else the newest reply" — and the fallback made the
67
+ * reply unreachable: any card left highlighted (one click on a tool card is
68
+ * enough) silently redirected `/copy`, with nothing on screen saying the reply
69
+ * had been passed over. `/copy` now names its target and defaults to the reply;
70
+ * `highlight` is the old rule with its own, honest, empty case.
71
+ * @param rows - the rows the reader can see (a `/clear` cutoff is not searched).
72
+ * @param focused - the highlighted row, if any.
73
+ * @param target - what the reader asked for; `reply` is the command's default.
74
+ */
75
+ export function copyTextFromTranscript(rows, focused, target = 'reply') {
76
+ if (target === 'highlight') {
77
+ // A reply has no body to fold away and no card text of its own beyond its
78
+ // lines, so `copyTextFromRow` is the whole rule for both kinds.
79
+ const focusedText = copyTextFromRow(focused ?? undefined);
80
+ return focusedText.trim() === ''
81
+ ? { text: '', source: 'empty' }
82
+ : { text: focusedText, source: 'focused' };
62
83
  }
63
- return { text: '', source: 'empty' };
84
+ const reply = latestReplyText(rows);
85
+ return reply === '' ? { text: '', source: 'empty' } : { text: reply, source: 'assistant' };
64
86
  }
65
87
  //# sourceMappingURL=copy-text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copy-text.js","sourceRoot":"","sources":["../src/copy-text.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"copy-text.js","sourceRoot":"","sources":["../src/copy-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,SAAS,QAAQ,CAAC,IAAY,EAAE,QAAQ,GAAG,MAAM;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACzC,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAA;IAC9C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAuC;IACrE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAChC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3B,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG;gBACZ,GAAG,CAAC,OAAO,IAAI,EAAE;gBACjB,GAAG,CAAC,OAAO;gBACX,GAAG,CAAC,MAAM;aACX,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;YACpC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;gBACd,GAAG,CAAC,YAAY,IAAI,EAAE;gBACtB,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;aAC/D,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAClD,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5H,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACzG,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC3B,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAClG,KAAK,YAAY;YACf,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC/G,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3G,KAAK,qBAAqB;YACxB,OAAO,EAAE,CAAA;QACX;YACE,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAKD,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,IAAoB;IAClD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,GAAG,EAAE,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAoB,EACpB,OAAsC,EACtC,SAAqB,OAAO;IAE5B,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,0EAA0E;QAC1E,gEAAgE;QAChE,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,IAAI,SAAS,CAAC,CAAA;QACzD,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;YAC9B,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;YAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9C,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;IACnC,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;AAC5F,CAAC"}
package/lib/dialogs.js CHANGED
@@ -1,3 +1,36 @@
1
+ /** Whether this is a dialog the live path can own (see {@link SurfaceDialog}). */
2
+ export function isSurfaceDialog(dialog) {
3
+ return dialog.kind === 'confirm' || dialog.kind === 'questions';
4
+ }
5
+ /** The roles as values, so no call site invents its own object. */
6
+ export const PICKER_ROLE = { kind: 'picker' };
7
+ export function interactionRole(ask) {
8
+ return { kind: 'interaction', ask };
9
+ }
10
+ /**
11
+ * Whether a role means the task is stopped waiting for the human.
12
+ *
13
+ * A local `confirm` (deleting a preset, repairing the profile) owns the keyboard
14
+ * too, but the agent is not waiting on it — reporting it as a wait is the same
15
+ * class of mistake as reporting a picker as one.
16
+ */
17
+ export function stallsTask(role) {
18
+ return role?.kind === 'interaction' && role.ask !== 'confirm';
19
+ }
20
+ /**
21
+ * Which surface gets the keyboard first when more than one is waiting (B1.2).
22
+ *
23
+ * Only one transient surface is ever drawn, so this is not a z-order: it decides
24
+ * who is *next in line*. A task interaction outranks a picker (someone is blocked on
25
+ * it, and the agent cannot proceed), and a picker outranks whatever the reader was
26
+ * about to type. Equal ranks keep their arrival order, so a queue of two pickers
27
+ * still behaves exactly as it did before.
28
+ *
29
+ * A Screen is not in this ordering at all: it is not a surface (B2.6 §1).
30
+ */
31
+ export function surfacePriority(role) {
32
+ return role.kind === 'interaction' ? 1 : 0;
33
+ }
1
34
  /** Digits then letters: the hotkeys painted next to question options. */
2
35
  export const QUESTION_OPTION_KEYS = '123456789abcdefghijklmnopqrstuvwxyz';
3
36
  /** Options a dialog can answer with; only a question list has any. */
@@ -201,4 +234,52 @@ export function confirmAnswer(text) {
201
234
  export function inspectClosesOn(text) {
202
235
  return text === '\x1b' || text === '\x03' || text === 'q' || text === 'Q' || text === '\r' || text === '\n';
203
236
  }
237
+ /**
238
+ * Fit an interaction's rendered lines into the rows the frame can give it.
239
+ *
240
+ * The interaction layer is composed *over* the transcript (see `paintFrame`), and
241
+ * the space above the composer is whatever the terminal has left after the footer,
242
+ * the composer and the header. On a short terminal that can be fewer rows than a
243
+ * question list needs — and clipping the *bottom* would hide the options and the
244
+ * key hint, which is exactly the part that has to stay reachable. So the window
245
+ * keeps the focused row visible and marks what it dropped.
246
+ *
247
+ * @param lines - the interaction as its renderer drew it, top to bottom.
248
+ * @param cap - how many rows the frame has for it.
249
+ * @param focusLine - index of the row that must stay visible (the highlighted
250
+ * option, or the prompt when there is no list).
251
+ * @returns the rows to place, top to bottom, at most `cap` of them.
252
+ */
253
+ export function windowInteractionLines(lines, cap, focusLine) {
254
+ if (cap <= 0)
255
+ return { lines: [], hiddenAbove: lines.length, hiddenBelow: 0 };
256
+ if (lines.length <= cap)
257
+ return { lines: [...lines], hiddenAbove: 0, hiddenBelow: 0 };
258
+ // One row is spent on the "there is more" marker, so the reader can tell a
259
+ // clipped list from a short one.
260
+ const room = Math.max(1, cap - 1);
261
+ // The last line is the key hint: it is what says how to answer, so it is kept
262
+ // even when the window has to drop the middle of the interaction. Only when
263
+ // doing so would leave no room for the focused row does it go.
264
+ const tail = lines[lines.length - 1];
265
+ const keepTail = lines.length > 1 && room >= 3 && (focusLine ?? 0) < lines.length - 1;
266
+ const body = keepTail ? lines.slice(0, -1) : lines;
267
+ const rows = keepTail ? room - 1 : room;
268
+ const focus = Math.max(0, Math.min(body.length - 1, focusLine ?? body.length - 1));
269
+ let start = Math.max(0, Math.min(body.length - rows, focus - Math.floor(rows / 2)));
270
+ // The focus must be inside the window whatever the centring worked out to.
271
+ if (focus < start)
272
+ start = focus;
273
+ if (focus >= start + rows)
274
+ start = focus - rows + 1;
275
+ start = Math.max(0, Math.min(start, body.length - rows));
276
+ const kept = body.slice(start, start + rows);
277
+ const hiddenAbove = start;
278
+ const hiddenBelow = body.length - start - rows;
279
+ return {
280
+ lines: [`… ${hiddenAbove + hiddenBelow}`, ...kept, ...(keepTail ? [tail] : [])],
281
+ hiddenAbove,
282
+ hiddenBelow,
283
+ };
284
+ }
204
285
  //# sourceMappingURL=dialogs.js.map