@x-otto/tui 0.0.1-alpha.2 → 0.0.1-alpha.21
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.
- package/README.md +76 -73
- package/dist/{Tabable-DDNOHe29.d.ts → Tabable-20oY6m1Y.d.ts} +272 -86
- package/dist/Tabable-20oY6m1Y.d.ts.map +1 -0
- package/dist/WizardDialog-BsgANU-A.js +14 -0
- package/dist/WizardDialog-BsgANU-A.js.map +1 -0
- package/dist/compat.d.ts +5 -0
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js +1 -1
- package/dist/compat.js.map +1 -1
- package/dist/i18n-8QKYVet8.js +76 -0
- package/dist/i18n-8QKYVet8.js.map +1 -0
- package/dist/index.d.ts +234 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +89 -83
- package/dist/index.js.map +1 -1
- package/dist/standalone.d.ts +21 -1
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +1 -1
- package/dist/standalone.js.map +1 -1
- package/package.json +8 -7
- package/dist/Tabable-DDNOHe29.d.ts.map +0 -1
- package/dist/WizardDialog-BG-t6UJT.js +0 -10
- package/dist/WizardDialog-BG-t6UJT.js.map +0 -1
- package/dist/i18n-Dju4J1Q-.js +0 -76
- package/dist/i18n-Dju4J1Q-.js.map +0 -1
|
@@ -91,6 +91,8 @@ interface SummaryMessage {
|
|
|
91
91
|
tasksTotal?: number;
|
|
92
92
|
/** 回合完成时刻(epoch ms,cli 侧 reducer 生成)。摘要行末尾灰色渲染 "YYYY-MM-DD HH:MM:SS"。 */
|
|
93
93
|
completedAt?: number;
|
|
94
|
+
/** 错误终止时的错误消息(status='error' 时),摘要行下方红色渲染错误详情。 */
|
|
95
|
+
errorMessage?: string;
|
|
94
96
|
id?: string;
|
|
95
97
|
}
|
|
96
98
|
/**
|
|
@@ -148,8 +150,7 @@ interface PruneBoundaryMessage {
|
|
|
148
150
|
* 死历史(R12 压缩前置保证),但压缩连续失败后的兜底裁剪(`lossy`)会真实削减模型上下文,
|
|
149
151
|
* 此时该表述不成立,必须按 lossy 分型提示。**RFC-159 起持久层为
|
|
150
152
|
* append-forever**:默认 SQLite 后端从不因此裁剪删除已持久化的 DB 行,被移出内存视图的
|
|
151
|
-
* 消息仍完整保留在存储中(`/session export`
|
|
152
|
-
* 逃生口后端会整份快照覆写、导致真实数据丢失。携带具体条数(`removedCount`)供用户感知
|
|
153
|
+
* 消息仍完整保留在存储中(`/session export` 可导出全量)。携带具体条数(`removedCount`)供用户感知
|
|
153
154
|
* 内存视图收窄的范围。
|
|
154
155
|
*/
|
|
155
156
|
interface HistoryCappedMessage {
|
|
@@ -296,6 +297,17 @@ interface AppNotification {
|
|
|
296
297
|
/** 可选操作(如 "/delegates"、"/extension",enter 时触发)。 */
|
|
297
298
|
action?: string;
|
|
298
299
|
}
|
|
300
|
+
/** 待决权限请求 */
|
|
301
|
+
interface PendingPermission {
|
|
302
|
+
id: string;
|
|
303
|
+
tool: string;
|
|
304
|
+
input: string;
|
|
305
|
+
risk?: 'low' | 'medium' | 'high';
|
|
306
|
+
/** 模型生成的命令解释文本 */
|
|
307
|
+
description?: string;
|
|
308
|
+
/** bash「始终允许」拟持久化的命令前缀(如 `git status`),弹窗显式呈现给用户。 */
|
|
309
|
+
alwaysAllowLabel?: string;
|
|
310
|
+
}
|
|
299
311
|
/**
|
|
300
312
|
* RFC-186 D3:暂停浮层数据项。notificationStore.pauseDialog 非 null 时 App.tsx 渲染
|
|
301
313
|
* PauseDialog 组件。两个阶段:requested(等待 turn 边界)+ active(已暂停)。
|
|
@@ -449,7 +461,8 @@ declare const DEFAULT_FIGURES: {
|
|
|
449
461
|
readonly gaugeFilled: "━"; /** LineGauge 未完成段 ╌ */
|
|
450
462
|
readonly gaugeRest: "╌"; /** Scrollbar thumb 右半块 ▐ */
|
|
451
463
|
readonly scrollThumb: "▐"; /** 委托任务识别到的服务前缀 ↕ */
|
|
452
|
-
readonly service: "↕"; /**
|
|
464
|
+
readonly service: "↕"; /** SignalBar services 信号前缀 ⇢(RFC-377 D4,与 delegates 的 ↕ 不同形) */
|
|
465
|
+
readonly serviceSignal: "⇢"; /** 已编辑文件标记 ✎(RFC-309 SummaryStrip) */
|
|
453
466
|
readonly edited: "✎"; /** 定时/计划任务标记 ◷(RFC-309 SummaryStrip) */
|
|
454
467
|
readonly scheduled: "◷"; /** 剪贴板信号 ✓(复制成功提示) */
|
|
455
468
|
readonly clipboard: "✓"; /** LLM 调用阶段箭头:requesting ↑,responding ↓ */
|
|
@@ -482,8 +495,8 @@ declare const PANEL_BORDER: {
|
|
|
482
495
|
* **单一真源**:所有经 DialogFrame 呈现的弹层写此常量。历史上曾有 `BORDER_VARIANTS`
|
|
483
496
|
* 三档(hard/nav/overlay)按界面层级分不同形态(RFC-183 D1),但 2026-07-22 commit
|
|
484
497
|
* 9466cb7c9「统一所有弹层为四边圆角」有意将三档收敛为同一形态;RFC-266 D1 据此删除
|
|
485
|
-
* 无差异的 variant API
|
|
486
|
-
*
|
|
498
|
+
* 无差异的 variant API,收敛为本单一常量(界面层级语义分层已由路由层焦点归属单一判定
|
|
499
|
+
* 承载,边框层不再重复编码)。将来若需按层级再分化边框,以新 RFC 重新设计,不保留投机性 API。
|
|
487
500
|
*/
|
|
488
501
|
declare const DIALOG_BORDER: {
|
|
489
502
|
readonly borderStyle: "round";
|
|
@@ -610,16 +623,16 @@ interface Store<T> {
|
|
|
610
623
|
}
|
|
611
624
|
declare function useAppState<T, R>(store: Store<T>, selector: (state: T) => R): R;
|
|
612
625
|
//#endregion
|
|
613
|
-
//#region src/stores/
|
|
626
|
+
//#region src/stores/status-store.d.ts
|
|
614
627
|
/** 内存快照——字段对齐 `@x-otto/coding` 的 `MemorySample`(不直接 import 跨包类型,
|
|
615
|
-
* tui 包不依赖 coding 包,由 cli
|
|
628
|
+
* tui 包不依赖 coding 包,由 cli 层组装时结构对齐即可)。 */
|
|
616
629
|
interface PerfMemorySnapshot {
|
|
617
630
|
level: 'healthy' | 'warning' | 'critical';
|
|
618
631
|
heapUsed: number;
|
|
619
632
|
heapSizeLimit: number;
|
|
620
633
|
usedPct: number;
|
|
621
634
|
}
|
|
622
|
-
/** 渲染健康度快照——字段对齐 `NotifyStats
|
|
635
|
+
/** 渲染健康度快照——字段对齐 `NotifyStats`。 */
|
|
623
636
|
interface PerfNotifySnapshot {
|
|
624
637
|
coalescedCalls: number;
|
|
625
638
|
coalescedFires: number;
|
|
@@ -630,43 +643,50 @@ interface PerfNotifySnapshot {
|
|
|
630
643
|
}
|
|
631
644
|
/**
|
|
632
645
|
* 单个插件采集器的结果。
|
|
633
|
-
* RFC-118 小修(S10
|
|
634
|
-
* `@x-otto/interchange`(coding 生产侧同源),此处别名保持 tui 内既有消费方命名兼容。
|
|
646
|
+
* RFC-118 小修(S10):类型本体上移 `@x-otto/interchange`,此处别名保持兼容。
|
|
635
647
|
*/
|
|
636
648
|
type PluginMetricResult = _$_x_otto_interchange0.PluginPerfMetricResult;
|
|
637
|
-
|
|
649
|
+
/** Session 概览快照——由 CLI 层 handleStatus 从 AgentSession 实时采集。 */
|
|
650
|
+
interface StatusSessionSnapshot {
|
|
651
|
+
title: string;
|
|
652
|
+
sessionId: string;
|
|
653
|
+
modelId: string;
|
|
654
|
+
messageCount: number;
|
|
655
|
+
occupancy: number;
|
|
656
|
+
contextWindow: number | undefined;
|
|
657
|
+
occupancyPct: number | undefined;
|
|
658
|
+
cumOutput: number;
|
|
659
|
+
writeLeaseReadOnly: boolean;
|
|
660
|
+
isPaused: boolean;
|
|
661
|
+
}
|
|
662
|
+
interface StatusPaneState {
|
|
663
|
+
/** Session 概览——面板打开/刷新时采集。undefined = 尚未采集。 */
|
|
664
|
+
session: StatusSessionSnapshot | undefined;
|
|
638
665
|
memory: PerfMemorySnapshot | undefined;
|
|
639
|
-
/** 内存采样历史(
|
|
666
|
+
/** 内存采样历史(sparkline 趋势,环形窗口 ≤32 点,heapUsed 字节)。 */
|
|
640
667
|
memoryHistory: number[];
|
|
641
|
-
/** M1 阶段恒为 undefined(渲染区占位);M2 起由 CLI 层喂入真实值。 */
|
|
642
668
|
notify: PerfNotifySnapshot | undefined;
|
|
643
669
|
/**
|
|
644
|
-
*
|
|
645
|
-
*
|
|
646
|
-
* `/perf` 面板),由 `MemoryGovernor.onLevelChange` 回调驱动(每次分级变化都推送,
|
|
647
|
-
* 含恢复到 healthy 的方向)。初始为 'healthy'(保守假设,避免启动瞬间误报)。
|
|
670
|
+
* footer 常驻指示器的实时分级——与面板数据解耦,
|
|
671
|
+
* 由 `MemoryGovernor.onLevelChange` 回调驱动。初始为 'healthy'。
|
|
648
672
|
*/
|
|
649
673
|
indicatorLevel: 'healthy' | 'warning' | 'critical';
|
|
650
|
-
/**
|
|
651
|
-
* RFC-116 M5:插件贡献的性能采集器结果——手动刷新时喂入(对齐 D7 手动刷新决策,
|
|
652
|
-
* 不做自动轮询)。空数组 = 无插件贡献采集器或本次刷新尚未获取,两者在渲染层
|
|
653
|
-
* 不做区分(均不显示该区块),因为区分"无贡献"与"未刷新"对用户价值不大。
|
|
654
|
-
*/
|
|
674
|
+
/** 插件贡献的性能采集器结果——手动刷新时喂入(不做自动轮询)。 */
|
|
655
675
|
pluginMetrics: PluginMetricResult[];
|
|
656
676
|
}
|
|
657
|
-
interface
|
|
658
|
-
store: Store<
|
|
659
|
-
/** /clear
|
|
660
|
-
* RFC-256 收尾:面板可见性已改由 Router 栈单一真源派生(isInStack('/pane/perf')),
|
|
661
|
-
* store 不再持 `open` 布尔——原 toggle() 已删除。 */
|
|
677
|
+
interface StatusStore {
|
|
678
|
+
store: Store<StatusPaneState>;
|
|
679
|
+
/** /clear 会话重置——全字段回初始值。 */
|
|
662
680
|
reset(): void;
|
|
663
|
-
/** CLI
|
|
681
|
+
/** CLI 喂入 session 概览快照(面板打开/刷新时)。 */
|
|
682
|
+
setSession(snapshot: StatusSessionSnapshot): void;
|
|
683
|
+
/** CLI 喂入最新内存快照。 */
|
|
664
684
|
setMemory(snapshot: PerfMemorySnapshot): void;
|
|
665
|
-
/** CLI
|
|
685
|
+
/** CLI 喂入最新渲染健康度快照。 */
|
|
666
686
|
setNotify(snapshot: PerfNotifySnapshot): void;
|
|
667
|
-
/** CLI 喂入 footer
|
|
687
|
+
/** CLI 喂入 footer 常驻指示器的最新分级。 */
|
|
668
688
|
setIndicatorLevel(level: 'healthy' | 'warning' | 'critical'): void;
|
|
669
|
-
/** CLI
|
|
689
|
+
/** CLI 喂入最新插件采集器结果。 */
|
|
670
690
|
setPluginMetrics(results: PluginMetricResult[]): void;
|
|
671
691
|
}
|
|
672
692
|
//#endregion
|
|
@@ -828,6 +848,34 @@ interface ErrorRetryItem {
|
|
|
828
848
|
intervalSeconds?: number;
|
|
829
849
|
}
|
|
830
850
|
//#endregion
|
|
851
|
+
//#region src/views/recovery-card.d.ts
|
|
852
|
+
/**
|
|
853
|
+
* recovery-card.ts — RFC-326 §6.7:Home 常驻恢复卡的纯呈现逻辑。
|
|
854
|
+
*
|
|
855
|
+
* 问题:用户 Esc 退出向导后,Home 上**没有任何**"还差什么"的线索——配置状态只
|
|
856
|
+
* 活在一个转瞬即逝的 toast 里,之后就只能靠用户记住 `/setup`。§6.7 要求把它变成
|
|
857
|
+
* 常驻可见的事实:每个未就绪阶段给一个明确的主行动。
|
|
858
|
+
*
|
|
859
|
+
* 本模块只做「阶段 → 文案键 + 单一 CTA」的映射与窄屏降级,不碰渲染:
|
|
860
|
+
* - 纯函数,便于穷举每个阶段的产物;
|
|
861
|
+
* - 文案返回 **i18n key** 而非成品字符串,避免纯逻辑层耦合语言资源。
|
|
862
|
+
*
|
|
863
|
+
* 设计约束(§6.7 明文):
|
|
864
|
+
* - **单一 CTA**:每张卡只给一个推荐动作,不并列 `/login` `/model` `/plugin`
|
|
865
|
+
* 让新用户猜(§4 原则 4)。
|
|
866
|
+
* - **常态 ≤4 行**、窄屏(<80 列)降为两行标题+CTA。
|
|
867
|
+
* - 卡片走文档流,不得占用 ChatInputArea / StatusBar 的稳定行位——这条由渲染层
|
|
868
|
+
* 保证(放在 Home 主区域内),本模块只负责把行数压在预算内。
|
|
869
|
+
*/
|
|
870
|
+
/** 与 `FtueStage` 同构;此处独立声明避免 tui 反向依赖 cli 的 ftue 模块。 */
|
|
871
|
+
type RecoveryStage = 'provider' | 'authentication' | 'model' | 'ready' | 'first-prompt';
|
|
872
|
+
/** 单条能力推荐的展示视图(纯数据,与 cli 侧 `CapabilityRecommendation` 同构)。 */
|
|
873
|
+
interface CapabilityCardItem {
|
|
874
|
+
extensionId: string;
|
|
875
|
+
/** 推荐理由文案 key(如 "Detected a web app")。 */
|
|
876
|
+
reasonKey: string;
|
|
877
|
+
}
|
|
878
|
+
//#endregion
|
|
831
879
|
//#region src/panes/EditedFilesPane.d.ts
|
|
832
880
|
interface EditedFileEntry {
|
|
833
881
|
/** 文件路径(相对项目根或绝对) */
|
|
@@ -1205,7 +1253,7 @@ interface PasteStore {
|
|
|
1205
1253
|
/** 当前 store 占用字节数(LRU 容量判据的另一维度)。 */
|
|
1206
1254
|
readonly bytesUsed: number;
|
|
1207
1255
|
/** 累计驱逐次数(LRU 超限淘汰 + 内存紧张分级用完即释放,两者都计数)。纯计数器,不驱动
|
|
1208
|
-
|
|
1256
|
+
* 任何行为,供未来 `/status` 面板或调试场景观测。 */
|
|
1209
1257
|
readonly evictionCount: number;
|
|
1210
1258
|
/**
|
|
1211
1259
|
* 清空全部映射。
|
|
@@ -1248,6 +1296,14 @@ interface CommandEntry {
|
|
|
1248
1296
|
* 切换导致列表位置跳动。
|
|
1249
1297
|
*/
|
|
1250
1298
|
sortKey?: string;
|
|
1299
|
+
/**
|
|
1300
|
+
* 已弃用命令(RFC-369):该命令名已收敛为某父命令的子命令,仅作过渡期别名保留。
|
|
1301
|
+
* 斜杠面板据此弱化展示(描述前缀标注),使用户在选中时就能看到迁移目标。
|
|
1302
|
+
*
|
|
1303
|
+
* 同 `aliases` 的前车之鉴:CLI 侧目录(`SLASH_COMMANDS`)标了 `deprecated`,本接口
|
|
1304
|
+
* 若无对应字段,值会在 CLI→TUI 注册映射时被静默丢弃,标记形同虚设。
|
|
1305
|
+
*/
|
|
1306
|
+
deprecated?: boolean;
|
|
1251
1307
|
}
|
|
1252
1308
|
type SlashNavigateAction = 'prev' | 'next' | 'accept' | 'dismiss';
|
|
1253
1309
|
interface TypeaheadState {
|
|
@@ -1307,7 +1363,7 @@ declare function applySlashCompletion(input: string, cursorOffset: number, comma
|
|
|
1307
1363
|
* 若 coding 侧契约变更,需同步此镜像(两处保持一致是 R3 解耦的成本)。
|
|
1308
1364
|
*/
|
|
1309
1365
|
type SigilPrefix = '#' | '@';
|
|
1310
|
-
type SigilKind = 'hashtag' | 'file' | 'person' | 'agent' | 'skill' | 'mcp' | 'plugin' | 'model' | 'resource' | 'shortcut';
|
|
1366
|
+
type SigilKind = 'hashtag' | 'file' | 'person' | 'agent' | 'skill' | 'mcp' | 'plugin' | 'model' | 'resource' | 'shortcut' | 'effort';
|
|
1311
1367
|
/** 面板条目:label 展示 / value 替换,严格分离(R2)。 */
|
|
1312
1368
|
interface SigilEntry {
|
|
1313
1369
|
label: string;
|
|
@@ -1334,7 +1390,8 @@ interface SigilSearchRegistry {
|
|
|
1334
1390
|
type SubmitMode = 'send' | 'bash' | 'bash_async' | 'memory';
|
|
1335
1391
|
interface PromptInputProps {
|
|
1336
1392
|
columns?: number;
|
|
1337
|
-
/** RFC-306
|
|
1393
|
+
/** RFC-306 遗留 prop:终端总行数。RFC-311 起光标锚定改由 useMeasuredCursorOrigin
|
|
1394
|
+
* 布局实测(见 computeCursorInline),本 prop 已不再被读取。 */
|
|
1338
1395
|
rows?: number;
|
|
1339
1396
|
placeholder?: string;
|
|
1340
1397
|
/** RFC-294 D7:真禁用(强制升级/确认框占据交互)→ 塌缩为单行提示。 */
|
|
@@ -1342,15 +1399,19 @@ interface PromptInputProps {
|
|
|
1342
1399
|
/** RFC-300 优化:回看态(滚动回看中)——保留完整外观(不塌缩),仅不注册键盘
|
|
1343
1400
|
* (滚动独占)且不渲染光标。区别于 disabled:disabled 塌缩,reviewing 不塌缩。 */
|
|
1344
1401
|
reviewing?: boolean;
|
|
1345
|
-
/**
|
|
1346
|
-
*
|
|
1402
|
+
/** 空闲提示卡片是否可见(卡片在输入框上方占 3+ 行且有 480ms 动画)。
|
|
1403
|
+
* 注意:本 prop **不参与**物理光标 gate——早期曾用于"出现时隐藏光标(残影防护)",
|
|
1404
|
+
* 后确认是 bug(setCursorPosition(undefined) 会把 IME 候选框甩到状态栏下),
|
|
1405
|
+
* 见 cursorActive 处注释;prop 保留仅为外部调用方兼容。 */
|
|
1347
1406
|
idleTipVisible?: boolean;
|
|
1348
1407
|
/** 斜杠命令表(typeahead 数据源) */
|
|
1349
1408
|
commands?: CommandEntry[];
|
|
1350
|
-
/** force=true 表示修饰键+Enter(Alt/Ctrl/Cmd)——上层据此映射为 followUp/排队;plain Enter→steer/send。 */
|
|
1351
1409
|
/**
|
|
1352
1410
|
* 提交回调。
|
|
1353
1411
|
*
|
|
1412
|
+
* `force=true` 表示修饰键+Enter(Alt/Ctrl/Cmd)——上层据此映射为 followUp/排队;
|
|
1413
|
+
* plain Enter → steer/send。
|
|
1414
|
+
*
|
|
1354
1415
|
* 返回 `'rejected'` 表示宿主**拒绝了本次提交**(如 FTUE 未就绪、无可用模型),
|
|
1355
1416
|
* 此时输入框**保留原文**,用户修完配置可直接重发(RFC-326 §6.7:
|
|
1356
1417
|
* "未发出的 prompt 保留在输入框")。返回 void/其它值一律按已受理处理并清空。
|
|
@@ -1411,6 +1472,20 @@ interface PromptInputProps {
|
|
|
1411
1472
|
current: {
|
|
1412
1473
|
fill: (text: string) => void;
|
|
1413
1474
|
append?: (text: string) => void;
|
|
1475
|
+
/**
|
|
1476
|
+
* 当前草稿是否为空(trim 后)。供 App 级数字键分支做前置门——Home 建议 chips /
|
|
1477
|
+
* 能力推荐卡的 `[1]`-`[3]` 是**空输入框专属**快捷键:这些 handler 挂在
|
|
1478
|
+
* `PRIORITY_APP_FALLBACK`(低于 prompt-input 的 FALLBACK 层),而 PromptInput 的
|
|
1479
|
+
* 字符插入路径**不消费**按键(返回 void),于是数字键会一路冒泡下来。若不看草稿
|
|
1480
|
+
* 状态,用户打字到一半按 `1` 会先插入 `1`、再被 `fill()` 整段覆盖成建议文案。
|
|
1481
|
+
*/
|
|
1482
|
+
isEmpty?: () => boolean;
|
|
1483
|
+
/**
|
|
1484
|
+
* 在光标处插入换行(2026-08 键位重设计:Shift+Enter 换行)。供 enter-family
|
|
1485
|
+
* 旁路(onShiftEnter → main.ts ref → 本方法)调用——裸 `\n` 字节在 Ink 键层
|
|
1486
|
+
* 不可识别(与 F1-F12 同为「空 input 无修饰」),必须走命令式桥。
|
|
1487
|
+
*/
|
|
1488
|
+
insertNewline?: () => void;
|
|
1414
1489
|
} | null;
|
|
1415
1490
|
};
|
|
1416
1491
|
/**
|
|
@@ -1562,28 +1637,6 @@ interface RegisteredStatusWidget {
|
|
|
1562
1637
|
order?: number;
|
|
1563
1638
|
}
|
|
1564
1639
|
//#endregion
|
|
1565
|
-
//#region src/views/recovery-card.d.ts
|
|
1566
|
-
/**
|
|
1567
|
-
* recovery-card.ts — RFC-326 §6.7:Home 常驻恢复卡的纯呈现逻辑。
|
|
1568
|
-
*
|
|
1569
|
-
* 问题:用户 Esc 退出向导后,Home 上**没有任何**"还差什么"的线索——配置状态只
|
|
1570
|
-
* 活在一个转瞬即逝的 toast 里,之后就只能靠用户记住 `/setup`。§6.7 要求把它变成
|
|
1571
|
-
* 常驻可见的事实:每个未就绪阶段给一个明确的主行动。
|
|
1572
|
-
*
|
|
1573
|
-
* 本模块只做「阶段 → 文案键 + 单一 CTA」的映射与窄屏降级,不碰渲染:
|
|
1574
|
-
* - 纯函数,便于穷举每个阶段的产物;
|
|
1575
|
-
* - 文案返回 **i18n key** 而非成品字符串,避免纯逻辑层耦合语言资源。
|
|
1576
|
-
*
|
|
1577
|
-
* 设计约束(§6.7 明文):
|
|
1578
|
-
* - **单一 CTA**:每张卡只给一个推荐动作,不并列 `/login` `/model` `/plugin`
|
|
1579
|
-
* 让新用户猜(§4 原则 4)。
|
|
1580
|
-
* - **常态 ≤4 行**、窄屏(<80 列)降为两行标题+CTA。
|
|
1581
|
-
* - 卡片走文档流,不得占用 ChatInputArea / StatusBar 的稳定行位——这条由渲染层
|
|
1582
|
-
* 保证(放在 Home 主区域内),本模块只负责把行数压在预算内。
|
|
1583
|
-
*/
|
|
1584
|
-
/** 与 `FtueStage` 同构;此处独立声明避免 tui 反向依赖 cli 的 ftue 模块。 */
|
|
1585
|
-
type RecoveryStage = 'provider' | 'authentication' | 'model' | 'ready' | 'first-prompt';
|
|
1586
|
-
//#endregion
|
|
1587
1640
|
//#region src/views/Home.d.ts
|
|
1588
1641
|
interface SessionListItem {
|
|
1589
1642
|
id: string;
|
|
@@ -1621,6 +1674,22 @@ interface HomeProps {
|
|
|
1621
1674
|
* 省略/ready 时不渲染,老用户零干扰。
|
|
1622
1675
|
*/
|
|
1623
1676
|
ftueStage?: RecoveryStage;
|
|
1677
|
+
/**
|
|
1678
|
+
* RFC-326 §6.5 / M4-02:项目感知首 prompt 建议(已本地化成品文案)。只在
|
|
1679
|
+
* `ftueStage` 为 `undefined`(已就绪)或 `'ready'` 时渲染——`'first-prompt'`
|
|
1680
|
+
* 阶段(已发过第一条)与 provider/authentication/model 三个未就绪阶段都不显示:
|
|
1681
|
+
* 前者是"不该再打扰",后者是"该显示恢复卡而非建议"(二者本就互斥于
|
|
1682
|
+
* `deriveRecoveryCard` 的判定,此处只需再排除 `'first-prompt'`)。
|
|
1683
|
+
*/
|
|
1684
|
+
promptSuggestions?: readonly string[];
|
|
1685
|
+
/**
|
|
1686
|
+
* RFC-326 §6.6 / M5-02:项目能力推荐(已本地化成品文案由渲染层用 reasonKey 取
|
|
1687
|
+
* i18next.t,本组件不直接接触文案原文)。只在 `ftueStage === 'first-prompt'`
|
|
1688
|
+
* 且未被本会话 dismiss 时显示,见 `deriveCapabilityCard`。
|
|
1689
|
+
*/
|
|
1690
|
+
capabilityRecommendations?: readonly CapabilityCardItem[];
|
|
1691
|
+
/** RFC-326 §6.6 / M5-02:本会话是否已关闭能力推荐卡("Not now")。 */
|
|
1692
|
+
capabilityDismissed?: boolean;
|
|
1624
1693
|
/** RFC-234 P2-b:多会话列表。未提供时不渲染。 */
|
|
1625
1694
|
sessionList?: readonly SessionListItem[];
|
|
1626
1695
|
/** RFC-234 P2-b:选择会话回调。 */
|
|
@@ -1643,6 +1712,9 @@ declare function Home({
|
|
|
1643
1712
|
updateAvailable,
|
|
1644
1713
|
weather: _weather,
|
|
1645
1714
|
ftueStage,
|
|
1715
|
+
promptSuggestions,
|
|
1716
|
+
capabilityRecommendations,
|
|
1717
|
+
capabilityDismissed,
|
|
1646
1718
|
shadow
|
|
1647
1719
|
}: HomeProps): React.ReactElement;
|
|
1648
1720
|
//#endregion
|
|
@@ -1672,6 +1744,10 @@ interface TaskState {
|
|
|
1672
1744
|
clipboardText: string;
|
|
1673
1745
|
/** 复制写入两路通道均失败(SignalBar 显示失败兜底信号,非 Toast)。TTL 后归零。 */
|
|
1674
1746
|
clipboardFailed: boolean;
|
|
1747
|
+
/** 刚复制成功的短时脉冲态(~1.5s,独立于 clipboardChars 12s TTL)——SignalBar
|
|
1748
|
+
* 剪贴板信号在此窗口内渲染绿底 + ✓,随后回落为常态 ✓ 已复制 N(同一 12s 窗口内)。
|
|
1749
|
+
* 纯 React 状态驱动的 Typography backgroundColor,不涉及选区层直写 stdout。 */
|
|
1750
|
+
clipboardJustCopied: boolean;
|
|
1675
1751
|
queued: QueuedItem[];
|
|
1676
1752
|
pendingPermission: unknown | null;
|
|
1677
1753
|
backgroundOutput: DelegateOutputView | null;
|
|
@@ -1709,6 +1785,43 @@ interface TaskState {
|
|
|
1709
1785
|
sessionList: readonly SessionListItem[];
|
|
1710
1786
|
/** 当前会话标题(对话中 SessionHeader 展示)——cli 侧 resolveSessionTitle 单一真源下推。 */
|
|
1711
1787
|
sessionTitle: string;
|
|
1788
|
+
/**
|
|
1789
|
+
* RFC-326 M3-01:FTUE 精确阶段(provider/authentication/model/ready/first-prompt),
|
|
1790
|
+
* 由 cli 侧 `FtueController.refresh()` 的 `FtueSnapshot.stage` 单向下推。
|
|
1791
|
+
* `undefined` = 尚未收到过快照(如启动早期、非交互模式)——Home 的恢复卡回退到
|
|
1792
|
+
* `needsSetup` 布尔判断「要不要出卡」,但不虚构具体阶段(避免 provider 步误显示成
|
|
1793
|
+
* model 步文案)。与 `RecoveryStage` 同构(tui 侧独立声明,见 views/recovery-card.ts
|
|
1794
|
+
* 头注释,避免 tui 反向依赖 cli 的 ftue 模块)。
|
|
1795
|
+
*/
|
|
1796
|
+
ftueStage: RecoveryStage | undefined;
|
|
1797
|
+
/**
|
|
1798
|
+
* RFC-326 §6.6 / M5-02:项目能力推荐列表(cli 侧 `matchCapabilities()` 的产出,
|
|
1799
|
+
* 已下推)。空数组 = 尚未计算/无匹配,与 `deriveCapabilityCard` 的"空则不显示"
|
|
1800
|
+
* 语义天然一致,无需额外 undefined 状态。
|
|
1801
|
+
*/
|
|
1802
|
+
capabilityRecommendations: readonly CapabilityCardItem[];
|
|
1803
|
+
/**
|
|
1804
|
+
* 用户是否已在本会话内关闭过能力推荐卡(按过 "Not now")。**瞬态、不持久化**——
|
|
1805
|
+
* 与 `wizard_dont_show_again` 不同语义:那是"不再自动弹向导"的跨会话意图,这里
|
|
1806
|
+
* 只是"这次会话别再提",下次启动仍会按新的项目特征重新评估是否推荐(§6.6 未要求
|
|
1807
|
+
* 持久化 dismiss,且能力推荐本身就该"每次打开项目独立判断",而非记住用户永久
|
|
1808
|
+
* 拒绝过某个扩展)。
|
|
1809
|
+
*/
|
|
1810
|
+
capabilityDismissed: boolean;
|
|
1811
|
+
/**
|
|
1812
|
+
* 版本更新提示(cli 侧 `checkForUpdate()` 启动异步检查的产出,经
|
|
1813
|
+
* `setUpdateAvailable` 单向下推)。与 Home 首屏 `welcome.updateAvailable`
|
|
1814
|
+
* 同构——后者是启动期静态快照(cli 侧一直传 undefined,从未接线),本字段是
|
|
1815
|
+
* 运行时真源:检测到新版后 Home 版本行右侧渲染常驻横幅
|
|
1816
|
+
* (`update.availableBanner`/`update.forcedBanner`)。`undefined` = 已是最新/
|
|
1817
|
+
* 尚未检出(不渲染横幅)。
|
|
1818
|
+
*/
|
|
1819
|
+
updateAvailable: {
|
|
1820
|
+
latest: string;
|
|
1821
|
+
current: string;
|
|
1822
|
+
newer: boolean;
|
|
1823
|
+
forced: boolean;
|
|
1824
|
+
} | undefined;
|
|
1712
1825
|
}
|
|
1713
1826
|
interface TaskStore {
|
|
1714
1827
|
store: Store<TaskState>;
|
|
@@ -1722,7 +1835,7 @@ interface TaskStore {
|
|
|
1722
1835
|
/**
|
|
1723
1836
|
* 注入副作用钩子(RFC-335 T335-07 前置 P0a)。原 TuiHandle 残留 setter 是"字段 setter
|
|
1724
1837
|
* + 副作用"混合体(如 setForcedUpgrade = setState + syncOverlayRoute + notify)——
|
|
1725
|
-
* 直接变纯 action 会丢副作用。setEffects
|
|
1838
|
+
* 直接变纯 action 会丢副作用。setEffects 把副作用接入口注入(仿 setNotify 的
|
|
1726
1839
|
* post-creation 注入范式),store 层不 import 树外 ref(routerRef/plugin registry),
|
|
1727
1840
|
* 由 main.ts 接线处把闭包函数传进来。未注入时副作用为 no-op(对齐 notify 防过早调用)。
|
|
1728
1841
|
*/
|
|
@@ -1735,7 +1848,7 @@ interface TaskStore {
|
|
|
1735
1848
|
actions: TaskActions;
|
|
1736
1849
|
}
|
|
1737
1850
|
/**
|
|
1738
|
-
* taskStore
|
|
1851
|
+
* taskStore 副作用接入口。注入方(main.ts)把闭包函数绑进来——这些闭包内部可
|
|
1739
1852
|
* `getRouterRef()` 取真 router / `registerPlugin` 调中央 registry,故接口不把 router/
|
|
1740
1853
|
* registry 作为参数传递(保持 store 层不引用任何树外类型)。这是"store 不依赖树外
|
|
1741
1854
|
* 全局"的类型层体现(P0c 先导)。
|
|
@@ -1767,6 +1880,18 @@ interface TaskActions {
|
|
|
1767
1880
|
setSessionList(list: TaskState['sessionList']): void;
|
|
1768
1881
|
setSessionTitle(title: string): void;
|
|
1769
1882
|
setNeedsSetup(value: boolean): void;
|
|
1883
|
+
/** RFC-326 M3-01:cli 侧 FtueController.refresh() 后单向下推精确阶段。 */
|
|
1884
|
+
setFtueStage(stage: TaskState['ftueStage']): void;
|
|
1885
|
+
/** RFC-326 §6.6 / M5-02:cli 侧 matchCapabilities() 结果单向下推。 */
|
|
1886
|
+
setCapabilityRecommendations(items: TaskState['capabilityRecommendations']): void;
|
|
1887
|
+
/** RFC-326 §6.6 / M5-02:用户按 "Not now" 关闭能力推荐卡(本会话瞬态,不持久化)。 */
|
|
1888
|
+
dismissCapabilityRecommendations(): void;
|
|
1889
|
+
/**
|
|
1890
|
+
* 版本更新提示单向下推(cli 侧 `applyUpdateCheckResult` 调用)。传 null/undefined
|
|
1891
|
+
* 清除(理论上是已升级至最新后的复位路径,当前无调用方——Home 横幅只在值非空时
|
|
1892
|
+
* 渲染,清除可留空)。
|
|
1893
|
+
*/
|
|
1894
|
+
setUpdateAvailable(info: TaskState['updateAvailable']): void;
|
|
1770
1895
|
setPermissionMode(mode: string): void;
|
|
1771
1896
|
/** 强制升级提示(RFC-335 P0a 自 TuiHandle.setForcedUpgrade 下沉):字段 + overlay 路由 + notify。 */
|
|
1772
1897
|
setForcedUpgrade(msg: string | null): void;
|
|
@@ -1797,9 +1922,9 @@ interface BudgetView {
|
|
|
1797
1922
|
totalUsed: number;
|
|
1798
1923
|
/** 可用 token = contextWindow − overhead − messages(三段恒闭合;正常态 = window − totalUsed)。 */
|
|
1799
1924
|
free: number;
|
|
1800
|
-
/** prune 触发线 token
|
|
1925
|
+
/** prune 触发线 token 数(派生自 memory 的 DEFAULT_PRUNE_CONFIG,200K 窗口≈60%)。 */
|
|
1801
1926
|
pruneLine: number;
|
|
1802
|
-
/** compact 触发线 token
|
|
1927
|
+
/** compact 触发线 token 数(派生自 memory 的 DEFAULT_COMPACTION_CONFIG,200K 窗口≈80%)。 */
|
|
1803
1928
|
compactLine: number;
|
|
1804
1929
|
/** 最近一轮 input(非 cache 部分,API 返回)。 */
|
|
1805
1930
|
lastInput: number;
|
|
@@ -2009,8 +2134,8 @@ interface NotificationStore {
|
|
|
2009
2134
|
setPulseSurvey(item: NotificationState['pulseSurvey']): void;
|
|
2010
2135
|
}
|
|
2011
2136
|
/**
|
|
2012
|
-
* notificationStore
|
|
2013
|
-
*
|
|
2137
|
+
* notificationStore 副作用接入口。注入方(main.ts)闭包内取真 router / drainQueue,
|
|
2138
|
+
* 接口不暴露树外类型,与 taskStore 同款。
|
|
2014
2139
|
*/
|
|
2015
2140
|
interface NotificationStoreEffects {
|
|
2016
2141
|
/** paused 由 true→false 时尝试出队(原 inline 的 drainQueue())。 */
|
|
@@ -2216,6 +2341,25 @@ interface ExtensionDetailRequest {
|
|
|
2216
2341
|
/** 执行某控制按钮(value)。 */
|
|
2217
2342
|
onAction: (value: string) => void;
|
|
2218
2343
|
onClose: () => void;
|
|
2344
|
+
/**
|
|
2345
|
+
* RFC-401 M3:插件配置表单数据。提供时在 DataList 之后渲染配置字段展示,
|
|
2346
|
+
* 并在 actions 末尾追加"编辑配置"按钮(触发 onEditConfig 回调)。
|
|
2347
|
+
* 编辑 UI 由宿主侧独立实现(经 updatePluginConfig 写入 PluginConfigStore)。
|
|
2348
|
+
*/
|
|
2349
|
+
configForm?: {
|
|
2350
|
+
/** manifest 声明的 config schema 片段(JSON Schema 子集,含 properties/type/description)。 */schema: {
|
|
2351
|
+
type?: string;
|
|
2352
|
+
description?: string;
|
|
2353
|
+
properties?: Record<string, {
|
|
2354
|
+
type?: string;
|
|
2355
|
+
description?: string;
|
|
2356
|
+
default?: unknown;
|
|
2357
|
+
enum?: unknown[];
|
|
2358
|
+
}>;
|
|
2359
|
+
}; /** 当前配置值(合并 manifest 默认值 + PluginConfigStore 持久化值后)。 */
|
|
2360
|
+
values: Record<string, unknown>; /** 点击"编辑配置"按钮时调用(宿主侧打开编辑 UI 或直接写入)。 */
|
|
2361
|
+
onEditConfig?: () => void;
|
|
2362
|
+
};
|
|
2219
2363
|
}
|
|
2220
2364
|
//#endregion
|
|
2221
2365
|
//#region src/dialogs/FileViewerDialog.d.ts
|
|
@@ -2694,6 +2838,12 @@ type TuiStreamEvent = {
|
|
|
2694
2838
|
notify?: PerfNotifySnapshot;
|
|
2695
2839
|
indicatorLevel?: 'healthy' | 'warning' | 'critical';
|
|
2696
2840
|
pluginMetrics?: PluginMetricResult[];
|
|
2841
|
+
} | {
|
|
2842
|
+
kind: 'status';
|
|
2843
|
+
session?: StatusSessionSnapshot;
|
|
2844
|
+
memory?: PerfMemorySnapshot;
|
|
2845
|
+
notify?: PerfNotifySnapshot;
|
|
2846
|
+
pluginMetrics?: PluginMetricResult[];
|
|
2697
2847
|
} | ({
|
|
2698
2848
|
kind: 'compactionLog';
|
|
2699
2849
|
entryKind: 'compact';
|
|
@@ -2714,10 +2864,13 @@ type TuiStreamEvent = {
|
|
|
2714
2864
|
* 提交意图(前端无关语义层):cli 据此决定如何处理一次提交。
|
|
2715
2865
|
* - 'send' : 起新回合(空闲时的普通提交,或斜杠命令分发)。
|
|
2716
2866
|
* - 'steer' : agent 运行中时注入当前回合(session.steer)。
|
|
2867
|
+
* - 'action': 纯 action chip([@model:...]/[@effort:...] 单独提交)——切换模型/档位的
|
|
2868
|
+
* 命令语义,不走 busy 分流、不注入对话流(终局设计 2026-08-14,见
|
|
2869
|
+
* submit-routing.ts isPureActionChip)。
|
|
2717
2870
|
* followUp/排队 由 TUI 自身的 state.queued 承载(空闲即出队),不经此枚举。
|
|
2718
2871
|
* 后续移植 GUI:同一 intent 层,GUI 直接绑 Enter→steer / Cmd+Enter→followUp,语义零改。
|
|
2719
2872
|
*/
|
|
2720
|
-
type SubmitIntent = 'send' | 'steer';
|
|
2873
|
+
type SubmitIntent = 'send' | 'steer' | 'action';
|
|
2721
2874
|
/**
|
|
2722
2875
|
* RFC-148 M3:模态对话框判别联合——收敛原 TuiHandle 9 个独立 open* 方法
|
|
2723
2876
|
* (openInfo/openPermissions/openContext/openMemory/openSelect/openExtensionDetail/
|
|
@@ -2806,13 +2959,6 @@ interface ProgressDialogProps {
|
|
|
2806
2959
|
/** 四个阶段标签 */
|
|
2807
2960
|
phases: string[];
|
|
2808
2961
|
}
|
|
2809
|
-
/** Setup 向导弹窗请求(openModal({kind:'wizard',...}) 入参)。 */
|
|
2810
|
-
/**
|
|
2811
|
-
* OAuth 流程句柄——向导内嵌授权,不跳转独立面板。
|
|
2812
|
-
* RFC-274 M2:补 `code`/`instructions`(对齐真实 `OAuthInfo` 字段),供等待态渲染
|
|
2813
|
-
* device-flow 场景(有 code 展示设备码 UI,无 code 展示纯浏览器 UI)——不在选项列表层
|
|
2814
|
-
* 区分 pkce/device-flow,只在这个等待态句柄层区分。
|
|
2815
|
-
*/
|
|
2816
2962
|
/**
|
|
2817
2963
|
* OAuth 轮询失败分类(RFC-326 §6.3)——决定 UI 给出哪个主 CTA。
|
|
2818
2964
|
* - `network`:连不上授权服务(含代理不通)→ 主 CTA 为「打开代理设置」
|
|
@@ -2827,6 +2973,12 @@ type OAuthPollResult = 'pending' | 'done' | 'error' | {
|
|
|
2827
2973
|
status: 'error';
|
|
2828
2974
|
reason: OAuthFailureReason;
|
|
2829
2975
|
};
|
|
2976
|
+
/**
|
|
2977
|
+
* OAuth 流程句柄——向导内嵌授权,不跳转独立面板。
|
|
2978
|
+
* RFC-274 M2:补 `code`/`instructions`(对齐真实 `OAuthInfo` 字段),供等待态渲染
|
|
2979
|
+
* device-flow 场景(有 code 展示设备码 UI,无 code 展示纯浏览器 UI)——不在选项列表层
|
|
2980
|
+
* 区分 pkce/device-flow,只在这个等待态句柄层区分。
|
|
2981
|
+
*/
|
|
2830
2982
|
interface OAuthHandle {
|
|
2831
2983
|
authorizationUrl: string;
|
|
2832
2984
|
/** 设备码流程的 user code(`OAuthInfo.code`);pkce 浏览器流程通常为空。 */
|
|
@@ -2854,6 +3006,7 @@ interface OAuthHandle {
|
|
|
2854
3006
|
*/
|
|
2855
3007
|
openAgain?: () => void;
|
|
2856
3008
|
}
|
|
3009
|
+
/** Setup 向导弹窗请求(openModal({kind:'wizard',...}) 入参)。 */
|
|
2857
3010
|
interface WizardRequest {
|
|
2858
3011
|
kind: 'wizard';
|
|
2859
3012
|
title: string;
|
|
@@ -2891,19 +3044,38 @@ interface WizardRequest {
|
|
|
2891
3044
|
/** Provider Auth 面板中显示的 provider 名称(如 "Anthropic")。 */
|
|
2892
3045
|
authProviderName?: string;
|
|
2893
3046
|
/**
|
|
2894
|
-
* Step 2
|
|
3047
|
+
* Step 2 模型选项(向导打开时刻的初始快照)。
|
|
2895
3048
|
*
|
|
2896
3049
|
* RFC-326 §6.4:不能是"无排序的技术清单"——`recommended` 标出首选(至多一个),
|
|
2897
3050
|
* `unusableReason` 说明为何不可用(缺凭据 / 订阅 429 风险)。两个字段均可选:
|
|
2898
3051
|
* 省略时退化为原来的平列表渲染,旧调用方无需改动。
|
|
3052
|
+
*
|
|
3053
|
+
* RFC-341 修复:本字段只是**打开向导那一刻**的一次性快照——用户在向导内走完
|
|
3054
|
+
* Provider 安装→Login 认证两步后,本字段不会自动刷新。此前 Step 2(Model)
|
|
3055
|
+
* 因此永远展示打开向导时刻的模型状况(大概率为空,因为那时用户还没配置任何
|
|
3056
|
+
* provider),导致 Model 列表看起来"永久空白"——即便凭据已经成功落盘、
|
|
3057
|
+
* `refreshModelsNow()` 也已在宿主侧跑完。真正的刷新必须走下面的
|
|
3058
|
+
* `onRefreshModelOptions` 回调(登录成功后调用),本字段仅作首屏兜底。
|
|
2899
3059
|
*/
|
|
2900
3060
|
modelOptions: Array<{
|
|
2901
3061
|
label: string;
|
|
2902
3062
|
value: string;
|
|
2903
3063
|
detail?: string;
|
|
2904
3064
|
recommended?: boolean;
|
|
2905
|
-
unusableReason?: 'unauthenticated' | 'oauth-429-risk';
|
|
3065
|
+
unusableReason?: 'unauthenticated' | 'oauth-429-risk' | 'intranet-unreachable';
|
|
2906
3066
|
}>;
|
|
3067
|
+
/**
|
|
3068
|
+
* 重新计算 Step 2 模型选项(RFC-341 修复)。登录成功(API key 提交成功 / OAuth
|
|
3069
|
+
* 完成)后调用,宿主据最新 `authStore`/`modelRegistry` 状态重算一份 `modelOptions`
|
|
3070
|
+
* 同构的数组返回。省略时退化为旧行为(`modelOptions` 恒为打开时刻快照,不刷新)。
|
|
3071
|
+
*/
|
|
3072
|
+
onRefreshModelOptions?: () => Promise<Array<{
|
|
3073
|
+
label: string;
|
|
3074
|
+
value: string;
|
|
3075
|
+
detail?: string;
|
|
3076
|
+
recommended?: boolean;
|
|
3077
|
+
unusableReason?: 'unauthenticated' | 'oauth-429-risk' | 'intranet-unreachable';
|
|
3078
|
+
}>>;
|
|
2907
3079
|
examplePrompts: readonly string[];
|
|
2908
3080
|
/** 信任步骤(Step 1)中显示的工作区路径。 */
|
|
2909
3081
|
workspacePath?: string;
|
|
@@ -3023,7 +3195,7 @@ type QuestionsAnswer = {
|
|
|
3023
3195
|
*
|
|
3024
3196
|
* 不收编 toggleEditedFiles(全仓 grep 零调用点,见 findings-backlog.md 死代码候选)。
|
|
3025
3197
|
*/
|
|
3026
|
-
type PaneName = 'history' | 'backgroundTasks' | 'draftPane' | 'queuePane' | 'notifications' | 'schedulePane' | '
|
|
3198
|
+
type PaneName = 'history' | 'backgroundTasks' | 'draftPane' | 'queuePane' | 'notifications' | 'schedulePane' | 'status' | 'cacheStats' | 'compactionLog' | 'gallery' | 'proxy' | 'prompts';
|
|
3027
3199
|
interface TuiOptions {
|
|
3028
3200
|
stdin: NodeJS.ReadStream;
|
|
3029
3201
|
stdout: NodeJS.WriteStream;
|
|
@@ -3038,6 +3210,8 @@ interface TuiOptions {
|
|
|
3038
3210
|
modelName?: string;
|
|
3039
3211
|
/** 初始「无可用模型」态(未登录/无凭证)→ 输入框显 promptSetup 引导。 */
|
|
3040
3212
|
needsSetup?: boolean;
|
|
3213
|
+
/** RFC-326 §6.5 / M4-02:Home 首 prompt 建议 chips(已本地化文案,cli 侧产出)。 */
|
|
3214
|
+
promptSuggestions?: readonly string[];
|
|
3041
3215
|
/** 斜杠命令表(typeahead) */
|
|
3042
3216
|
commands?: CommandEntry[];
|
|
3043
3217
|
/** #/@ sigil 条目数据源(coding 层 PluginInputRegistry,结构同构)。
|
|
@@ -3068,6 +3242,10 @@ interface TuiOptions {
|
|
|
3068
3242
|
};
|
|
3069
3243
|
/** RFC-234 P2-b:选择会话回调。 */
|
|
3070
3244
|
onSessionSelect?: (id: string) => void;
|
|
3245
|
+
/** RFC-326 §6.6 / M5-02:Home 能力推荐卡数字键选中安装(复用既有 extension install 链路)。 */
|
|
3246
|
+
onInstallCapability?: (extensionId: string) => void;
|
|
3247
|
+
/** RFC-326 §6.6 / M5-02:Home 能力推荐卡 "Not now" 关闭(本会话瞬态)。 */
|
|
3248
|
+
onDismissCapabilityRecommendations?: () => void;
|
|
3071
3249
|
/** RFC-198 §4.4:PasteStore 的内存压力分级来源只读视图(cli 层传入 App._residencyGovernor
|
|
3072
3250
|
* 的结构化子集,零 @x-otto/runtime 编译期依赖)。省略时 PasteStore 固定 healthy 上限。 */
|
|
3073
3251
|
residencyGovernor?: PasteStoreResidencySource;
|
|
@@ -3129,7 +3307,6 @@ interface TuiOptions {
|
|
|
3129
3307
|
/** RFC-089 M8 spike:Ink ConcurrentRoot(键击 DiscreteEventPriority 插队 + 可中断 reconcile)。
|
|
3130
3308
|
* 缺省读 OTTO_TUI_CONCURRENT=1;A/B 稳定后再定默认。 */
|
|
3131
3309
|
concurrent?: boolean;
|
|
3132
|
-
/** intent='steer' 时 cli 应注入当前运行回合(session.steer)而非起新回合;缺省/'send' 走原路径。 */
|
|
3133
3310
|
/**
|
|
3134
3311
|
* 提交回调(fire-and-forget)。
|
|
3135
3312
|
*
|
|
@@ -3194,11 +3371,11 @@ interface TuiOptions {
|
|
|
3194
3371
|
*/
|
|
3195
3372
|
onA2uiAction?: (componentId: string, action: string, payload?: Record<string, unknown>) => void;
|
|
3196
3373
|
/**
|
|
3197
|
-
*
|
|
3374
|
+
* Status 面板内手动刷新键(r)触发——CLI 侧重新执行 `handleStatus` 的核心
|
|
3198
3375
|
* 采集逻辑(内存/渲染/插件三类数据源),回填后面板自动重渲(数据经 setPerf* 系列
|
|
3199
3376
|
* TuiHandle 方法喂回,不由本回调直接返回值)。手动触发,不做自动轮询(对齐 D7)。
|
|
3200
3377
|
*/
|
|
3201
|
-
|
|
3378
|
+
onStatusRefresh?: () => void;
|
|
3202
3379
|
/** /tasks 面板:k 杀选中后台进程。 */
|
|
3203
3380
|
onBackgroundKill?: (id: string) => void;
|
|
3204
3381
|
/** /tasks 面板:o 看选中后台进程输出(cli 据此启动 logPath tail 轮询)。 */
|
|
@@ -3358,8 +3535,10 @@ interface TuiPendingHandle {
|
|
|
3358
3535
|
setPendingEcho(text: string, mode: string): void;
|
|
3359
3536
|
/** 模型已接起首字节,关闭 ESC 撤回窗口(pending 转正)。 */
|
|
3360
3537
|
clearPendingEcho(): void;
|
|
3361
|
-
/** ESC 撤回 pending 消息——从对话流移除最后一条 user echo +
|
|
3362
|
-
|
|
3538
|
+
/** ESC 撤回 pending 消息——从对话流移除最后一条 user echo + 清 pendingEcho。
|
|
3539
|
+
* 返回是否真的撤回了(false = pendingEcho 已空/已转正,调用方不应回填输入框——否则
|
|
3540
|
+
* 消息已留在对话流却把文本再塞回输入框,制造"撤回失败但输入框有内容"的重复)。 */
|
|
3541
|
+
withdrawPendingEcho(): boolean;
|
|
3363
3542
|
/** RFC-337 D3:注入一条运行中追加(steer)的待定 echo(延迟 commit,live 区渲染)。 */
|
|
3364
3543
|
setPendingSteer(text: string, id: string): void;
|
|
3365
3544
|
/** RFC-337 D3:steer 被模型消费 → 转正 commit 到 scrollback(此后不再可撤回)。 */
|
|
@@ -3474,7 +3653,8 @@ interface TuiEngineHandle {
|
|
|
3474
3653
|
mode: SubmitMode;
|
|
3475
3654
|
} | undefined;
|
|
3476
3655
|
/**
|
|
3477
|
-
* 把一条提交塞进"回合之后"队列(state.queued,与
|
|
3656
|
+
* 把一条提交塞进"回合之后"队列(state.queued,与 Option/Ctrl+Enter 排队同一队列),
|
|
3657
|
+
* 引擎空闲时自动出队起新回合。
|
|
3478
3658
|
* 供 cli 兜底:若消息因镜像态去同步漏到"引擎仍忙却走起新回合"的路,按此回落到回合后队列,
|
|
3479
3659
|
* 而非撞裸 prompt() 抛错。出队由 drainQueue 以引擎真·忙判定为闸,不会在忙时立即回拉打转。
|
|
3480
3660
|
*/
|
|
@@ -3527,8 +3707,14 @@ interface TuiMessagesHandle {
|
|
|
3527
3707
|
getEditedFiles(): EditedFileEntry[];
|
|
3528
3708
|
}
|
|
3529
3709
|
interface TuiLifecycleHandle {
|
|
3530
|
-
/**
|
|
3531
|
-
|
|
3710
|
+
/**
|
|
3711
|
+
* 停止 TUI(卸载 Ink 渲染树 + 清理平台副作用)。
|
|
3712
|
+
*
|
|
3713
|
+
* 2026-08-14 退出乱码 P0:改为 **async**——内含 OSC 11 吸收窗(200ms),在恢复
|
|
3714
|
+
* 终端回显前消费在途回复。调用方**应当 await**(否则吸收窗可能未完成即被
|
|
3715
|
+
* 后续 process.exit 截断);不 await 时由 3s 兜底/进程 exit 兜底覆盖(best-effort)。
|
|
3716
|
+
*/
|
|
3717
|
+
stop(): Promise<void>;
|
|
3532
3718
|
/** 清屏并重置会话界面状态(/clear):
|
|
3533
3719
|
* - 清终端(ANSI \x1B[2J\x1B[H)和 scrollback 状态
|
|
3534
3720
|
* - 清除任务面板、委托面板、动态区状态
|
|
@@ -3934,5 +4120,5 @@ declare function Tabable({
|
|
|
3934
4120
|
children
|
|
3935
4121
|
}: TabableProps): React.ReactElement;
|
|
3936
4122
|
//#endregion
|
|
3937
|
-
export { ExtensionMenuContribution as $,
|
|
3938
|
-
//# sourceMappingURL=Tabable-
|
|
4123
|
+
export { ExtensionMenuContribution as $, ToolCompletionMessage as $n, subagentEntryStatus as $t, RemoteSessionSnapshot as A, ThemeRegistry as An, SigilPrefix as At, createSelectState as B, THEME as Bn, navigateSuggestions as Bt, TuiHandle as C, Risk as Cn, formatProviderUsageLimitTypeFull as Ct, WizardRequest as D, ThemePresetInput as Dn, SubmitMode as Dt, TuiStreamEvent as E, ThemePreset as En, PromptInput as Et, MessageStore as F, PANEL_BORDER as Fn, TypeaheadState as Ft, MemoryDialog as G, MessageContent as Gn, PasteStoreResidencySource as Gt, NotifyScheduler as H, A2uiContent as Hn, PasteSnapshot as Ht, Question as I, FIGURES as In, applySlashCompletion as It, MemoryEntrySource as J, StopReason as Jn, ObservationLike as Jt, MemoryDialogProps as K, PendingPermission as Kn, createPasteStore as Kt, SelectOption as L, FiguresMap as Ln, createCommandRegistry as Lt, SessionDataTarget as M, LAYOUT as Mn, CommandEntry as Mt, SessionTransport as N, SPACING as Nn, CommandRegistry as Nt, AttachDataSourceDeps as O, ThemePresetSelection as On, SigilEntry as Ot, createAttachSessionDataSource as P, DIALOG_BORDER as Pn, SlashNavigateAction as Pt, ExtensionListEntry as Q, ToolCall as Qn, observationRow as Qt, SelectOptions as R, PALETTE as Rn, extractSlashPrefix as Rt, SubagentContext as S, LangMode as Sn, ProviderUsageBadgeItem as St, TuiPanelRegistration as T, ThemeAppearance as Tn, QueuedCommands as Tt, NotifyStats as U, AssistantMessage as Un, PasteSnapshotEntry as Ut, A2uiButtonInfo as V, ThemeColors as Vn, CreatePasteStoreOptions as Vt, makeNotifyScheduler as W, ChatMessage as Wn, PasteStore as Wt, InfoDialogAction as X, TextContent as Xn, formatTurnTimeline as Xt, InfoDialog as Y, StreamEvent as Yn, formatAgentDiagnosticsText as Yt, InfoDialogProps as Z, ThinkingContent as Zn, observationLiveFields as Zt, ModalRequestInput as _, detectLanguage as _n, createBudgetStore as _t, TabableContextValue as a, RateLimitType as an, ButtonProps as at, PluginRegistration as b, t as bn, HomeProps as bt, TabableRegistry as c, KeyBindingPredicate as cn, RegisteredRenderer as ct, useTabableContext as d, DataListProps as dn, NotificationStore as dt, subagentRestoreFields as en, ToolMessage as er, ExtensionsListRequest as et, ConfirmDialog as f, DataListRow as fn, ProxyStore as ft, DraftItemView as g, useAppState as gn, BudgetView as gt, ConfirmRequest as h, Store as hn, BudgetStore as ht, Tabable as i, ErrorRetryItem as in, ButtonColor as it, SessionDataSource as j, createBuiltinThemeRegistry as jn, SigilSearchRegistry as jt, RemoteSessionEvent as k, ThemePresetSource as kn, SigilKind as kt, UseTabableOptions as l, DataList as ln, clearPluginRenderers as lt, AlertRequest as m, StatusStore as mn, BudgetState as mt, RouteContext as n, ErrorRetryAction as nn, ExtensionDetailRequest as nt, TabableEntry as o, ContextStore as on, ButtonVariant as ot, ConfirmDialogProps as p, DataListTone as pn, CacheStore as pt, MemoryEntry as q, PulseSurveyItem as qn, Completer as qt, RouteContextValue as r, ErrorRetryActionKind as rn, Button as rt, TabableProps as s, OnboardingResult as sn, PluginMessageRenderer as st, FocusStyle as t, EditedFileEntry as tn, UserMessage as tr, ExtensionDetailAction as tt, useTabable as u, DataListEntry as un, registerPluginRenderers as ut, ModalRequestVoid as v, i18next as vn, TaskStore as vt, TuiOptions as w, MarkdownThemeOverrides as wn, isUsingOverage as wt, PromptRequest as x, Lang as xn, SessionListItem as xt, PermissionDecision as y, initI18n as yn, Home as yt, SelectState as z, STATUS as zn, getCommandSuggestions as zt };
|
|
4124
|
+
//# sourceMappingURL=Tabable-20oY6m1Y.d.ts.map
|