dsh-smooth-stream 0.3.3 → 0.4.0

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.
@@ -6,7 +6,23 @@ export const NS = 'settings.smoothStream'
6
6
  /** Locale keys the card renders. */
7
7
  export type SmoothStreamLocaleKey =
8
8
  | 'title' | 'description'
9
+ | 'enabled' | 'enabledHint'
9
10
  | 'thinkAutoExpand' | 'thinkAutoExpandHint'
11
+ | 'autoCollapse' | 'autoCollapseHint'
12
+ | 'debugEnabled' | 'debugEnabledHint' | 'debugUnavailable'
13
+ | 'debugPanelTitle' | 'debugPanelToggle' | 'debugPanelClose' | 'debugGuide'
14
+ | 'debugLive' | 'debugIdle' | 'debugUnsaved'
15
+ | 'debugSave' | 'debugDiscard' | 'debugReset' | 'debugCopy' | 'debugCopied'
16
+ | 'debugSectionLive' | 'debugSectionReveal' | 'debugSectionFollow'
17
+ | 'debugFps' | 'debugFrameTime' | 'debugBacklog' | 'debugRevealSpeed' | 'debugProgress'
18
+ | 'debugFollowState' | 'debugFollowing' | 'debugReleased'
19
+ | 'debugLag' | 'debugVelocity' | 'debugReserve' | 'debugCapacity' | 'debugAppliedScale'
20
+ | 'debugRevealMultiplier' | 'debugQueuePressure' | 'debugMaxReveal'
21
+ | 'debugSpringStiffness' | 'debugSpringDamping' | 'debugSpringMass'
22
+ | 'debugRunway' | 'debugReserveResponse' | 'debugBackpressureMin'
23
+ | 'debugTipRevealMultiplier' | 'debugTipQueuePressure' | 'debugTipMaxReveal'
24
+ | 'debugTipSpringStiffness' | 'debugTipSpringDamping' | 'debugTipSpringMass'
25
+ | 'debugTipRunway' | 'debugTipReserveResponse' | 'debugTipBackpressureMin'
10
26
  | 'readOnly' | 'loading' | 'unavailable' | 'retry'
11
27
  | 'version' | 'developmentVersion'
12
28
  | 'updates' | 'updateHint' | 'developmentBuild' | 'updateUnavailable'
@@ -17,8 +33,61 @@ export type SmoothStreamLocaleKey =
17
33
  export const en: Record<SmoothStreamLocaleKey, string> = {
18
34
  title: 'Smooth stream',
19
35
  description: 'How replies are revealed while they stream.',
36
+ enabled: 'Enable smooth streaming',
37
+ enabledHint: 'Let this plugin render and follow streaming replies. Turn off to use the built-in Harness renderer.',
20
38
  thinkAutoExpand: 'Auto-expand thinking',
21
39
  thinkAutoExpandHint: 'Open the thinking block while it streams. Turn off to keep it collapsed.',
40
+ autoCollapse: 'Collapse finished work',
41
+ autoCollapseHint: 'When a reply finishes, fold its thinking, tools, and intermediate output behind one “Processed” summary so only the final answer shows. Click the summary to expand again; works with streaming on or off.',
42
+ debugEnabled: 'Show render diagnostics',
43
+ debugEnabledHint: 'Show live streaming and scroll metrics on the right side of the chat. Tune values there, then save them here.',
44
+ debugUnavailable: 'Live diagnostics require a newer plugin Host.',
45
+ debugPanelTitle: 'Render diagnostics',
46
+ debugPanelToggle: 'Toggle render diagnostics',
47
+ debugPanelClose: 'Hide diagnostics panel',
48
+ debugGuide: 'Tune one value at a time while a reply streams. Keep FPS stable and backlog near zero. If text lags, raise the reveal multiplier, queue pressure, or maximum reveal; if a blank gap appears, reduce Predictive runway. Increase damping when the scroll feels springy. Save only after the behavior is stable; Reset restores the production defaults.',
49
+ debugLive: 'Streaming',
50
+ debugIdle: 'Idle',
51
+ debugUnsaved: 'Unsaved tuning',
52
+ debugSave: 'Save tuning',
53
+ debugDiscard: 'Discard changes',
54
+ debugReset: 'Reset tuning',
55
+ debugCopy: 'Copy diagnostics',
56
+ debugCopied: 'Copied',
57
+ debugSectionLive: 'Live renderer',
58
+ debugSectionReveal: 'Reveal tuning',
59
+ debugSectionFollow: 'Scroll tuning',
60
+ debugFps: 'FPS',
61
+ debugFrameTime: 'Frame',
62
+ debugBacklog: 'Backlog',
63
+ debugRevealSpeed: 'Reveal',
64
+ debugProgress: 'Progress',
65
+ debugFollowState: 'Follow',
66
+ debugFollowing: 'Pinned',
67
+ debugReleased: 'Released',
68
+ debugLag: 'Visual lag',
69
+ debugVelocity: 'Velocity',
70
+ debugReserve: 'Reserve',
71
+ debugCapacity: 'Capacity',
72
+ debugAppliedScale: 'Applied scale',
73
+ debugRevealMultiplier: 'Reveal multiplier',
74
+ debugQueuePressure: 'Queue pressure',
75
+ debugMaxReveal: 'Maximum reveal',
76
+ debugSpringStiffness: 'Spring stiffness',
77
+ debugSpringDamping: 'Spring damping',
78
+ debugSpringMass: 'Spring mass',
79
+ debugRunway: 'Predictive runway',
80
+ debugReserveResponse: 'Runway response',
81
+ debugBackpressureMin: 'Minimum backpressure',
82
+ debugTipRevealMultiplier: 'Overall reveal speed multiplier. Higher reveals text faster and clears backlog sooner, but can feel jumpy. Lower is smoother but takes longer to finish.',
83
+ debugTipQueuePressure: 'Backlog acceleration strength. Higher catches up to a growing queue more aggressively; lower keeps speed steadier but may leave backlog.',
84
+ debugTipMaxReveal: 'Hard cap for reveal speed in characters per second. Higher allows faster catch-up; lower limits bursts and keeps motion calmer.',
85
+ debugTipSpringStiffness: 'Scroll spring strength. Higher closes visual lag faster but can feel sharp; lower feels softer but follows more slowly.',
86
+ debugTipSpringDamping: 'Scroll energy damping. Higher suppresses overshoot and jitter but feels heavier; lower feels livelier but may oscillate.',
87
+ debugTipSpringMass: 'Scroll inertia. Higher makes movement slower and heavier; lower makes it react faster but can feel abrupt.',
88
+ debugTipRunway: 'Predictive blank space reserved while content grows. Higher absorbs growth and protects the bottom follow, but can create a larger visible gap; lower reduces blank space but leaves less room to absorb lag.',
89
+ debugTipReserveResponse: 'How quickly the reserved runway opens or closes. Higher changes more gradually; lower reacts faster but can look abrupt.',
90
+ debugTipBackpressureMin: 'Slowest reveal multiplier under scroll pressure. Higher keeps text moving but may increase visual lag; lower slows text more to protect smooth following.',
22
91
  readOnly: 'This deployment stores settings read-only.',
23
92
  loading: 'Loading plugin settings…',
24
93
  unavailable: 'Plugin settings are unavailable in this connection.',
@@ -44,8 +113,61 @@ export const en: Record<SmoothStreamLocaleKey, string> = {
44
113
  export const zh: Record<SmoothStreamLocaleKey, string> = {
45
114
  title: '丝滑流式',
46
115
  description: '回复在流式输出时如何逐字展现。',
116
+ enabled: '启用丝滑流式渲染',
117
+ enabledHint: '由本插件渲染并跟随流式回复;关闭后使用 Harness 内置渲染。',
47
118
  thinkAutoExpand: '自动展开思考',
48
119
  thinkAutoExpandHint: '思考块在流式时自动展开;关闭后保持折叠,可手动展开。',
120
+ autoCollapse: '完成后自动折叠',
121
+ autoCollapseHint: '回复处理完成后,把思考、工具与过程输出折叠为一行“已处理”摘要,只展示最终回复;点击摘要可再次展开。开启或关闭流式渲染均可用,默认开启。',
122
+ debugEnabled: '显示渲染调试面板',
123
+ debugEnabledHint: '在聊天右侧显示流式渲染和滚动的实时参数,可在面板中调节并在这里保存。',
124
+ debugUnavailable: '当前 Host 版本不支持实时调试,请先更新插件 Host。',
125
+ debugPanelTitle: '渲染诊断',
126
+ debugPanelToggle: '显示或隐藏渲染诊断',
127
+ debugPanelClose: '收起诊断面板',
128
+ debugGuide: '流式输出时一次只调一个参数,观察帧率、积压和视觉滞后。优先保持帧率稳定、积压接近 0;如果文字滞后,提高揭示倍率、队列压力或最大揭示速度;如果底部出现空白,降低“预测预留空间”。滚动有回弹或抖动时提高阻尼。确认表现稳定后再保存;“恢复默认参数”会回到生产默认值。',
129
+ debugLive: '正在流式输出',
130
+ debugIdle: '空闲',
131
+ debugUnsaved: '参数尚未保存',
132
+ debugSave: '保存参数',
133
+ debugDiscard: '放弃修改',
134
+ debugReset: '恢复默认参数',
135
+ debugCopy: '复制诊断数据',
136
+ debugCopied: '已复制',
137
+ debugSectionLive: '实时渲染',
138
+ debugSectionReveal: '流式参数',
139
+ debugSectionFollow: '滚动参数',
140
+ debugFps: '帧率',
141
+ debugFrameTime: '帧耗时',
142
+ debugBacklog: '积压字符',
143
+ debugRevealSpeed: '揭示速度',
144
+ debugProgress: '渲染进度',
145
+ debugFollowState: '跟随状态',
146
+ debugFollowing: '跟随底部',
147
+ debugReleased: '用户已释放',
148
+ debugLag: '视觉滞后',
149
+ debugVelocity: '滚动速度',
150
+ debugReserve: '预留空间',
151
+ debugCapacity: '安全容量',
152
+ debugAppliedScale: '实际倍率',
153
+ debugRevealMultiplier: '揭示倍率',
154
+ debugQueuePressure: '队列压力',
155
+ debugMaxReveal: '最大揭示速度',
156
+ debugSpringStiffness: '弹簧刚度',
157
+ debugSpringDamping: '弹簧阻尼',
158
+ debugSpringMass: '弹簧质量',
159
+ debugRunway: '预测预留空间',
160
+ debugReserveResponse: '预留响应时间',
161
+ debugBackpressureMin: '最小背压倍率',
162
+ debugTipRevealMultiplier: '整体文字揭示速度倍率。调大能更快清空积压,但可能显得跳;调小更平滑,但完成回复需要更久。',
163
+ debugTipQueuePressure: '积压对加速的影响强度。调大能更积极追赶增长中的队列;调小速度更稳定,但积压可能持续。',
164
+ debugTipMaxReveal: '每秒揭示字符数上限。调大允许更快追赶;调小限制突发速度,让动作更平稳。',
165
+ debugTipSpringStiffness: '滚动弹簧刚度。调大更快收拢视觉滞后,但感觉更硬;调小更柔和,但跟随更慢。',
166
+ debugTipSpringDamping: '滚动能量阻尼。调大能抑制过冲和抖动,但感觉更沉;调小更灵活,但可能回弹。',
167
+ debugTipSpringMass: '滚动惯性。调大移动更慢更沉;调小反应更快,但可能显得突兀。',
168
+ debugTipRunway: '内容增长时预留的预测空白。调大更能吸收增长、保护底部跟随,但可能产生更大的可见空区;调小能减少空白,但可吸收滞后的空间也更少。',
169
+ debugTipReserveResponse: '预留空间打开或关闭的响应时间。调大变化更渐进;调小反应更快,但可能显得突变。',
170
+ debugTipBackpressureMin: '滚动压力下允许的最低揭示倍率。调大文字仍会较快前进,但视觉滞后可能增加;调小会更积极减速,以保护跟随平滑。',
49
171
  readOnly: '本部署的设置为只读。',
50
172
  loading: '正在加载插件设置…',
51
173
  unavailable: '当前连接无法访问插件设置。',
@@ -1,8 +1,17 @@
1
1
  /** Staged form state for the plugin-owned smooth-stream settings RPC. */
2
2
 
3
3
  import { createSnapshotStore, type SnapshotStore } from '@deepseek-ai/dsh-client-runtime/client'
4
- import { DEFAULT_STREAM_SETTINGS } from '../settings.ts'
5
- import type { StreamInstallationKind, StreamSettingsView } from '../settings-api.ts'
4
+ import {
5
+ DEFAULT_STREAM_DEBUG_TUNING,
6
+ DEFAULT_STREAM_SETTINGS,
7
+ type StreamDebugTuning,
8
+ type StreamSettings,
9
+ } from '../settings.ts'
10
+ import type {
11
+ StreamDebugSettingsView,
12
+ StreamInstallationKind,
13
+ StreamSettingsView,
14
+ } from '../settings-api.ts'
6
15
  import type { SmoothStreamSettingsApi } from './smooth-stream-settings-api.ts'
7
16
 
8
17
  /** What the smooth-stream card renders. It remains visible while its Host RPC loads. */
@@ -12,7 +21,12 @@ export interface SmoothStreamCardState {
12
21
  dirty: boolean
13
22
  saving: boolean
14
23
  failed: boolean
24
+ enabled: boolean
15
25
  thinkAutoExpand: boolean
26
+ autoCollapse: boolean
27
+ debugEnabled: boolean
28
+ debugTuning: StreamDebugTuning
29
+ debugAvailable: boolean
16
30
  version: string | undefined
17
31
  installation: StreamInstallationKind
18
32
  canUpgrade: boolean
@@ -26,7 +40,7 @@ export interface SmoothStreamCardFace {
26
40
  hooks: {
27
41
  smoothStreamCard: SnapshotStore<SmoothStreamCardState>
28
42
  }
29
- edit: (value: boolean) => void
43
+ edit: (patch: Partial<StreamSettings>) => void
30
44
  save: () => void
31
45
  discard: () => void
32
46
  reload: () => void
@@ -37,7 +51,9 @@ export interface SmoothStreamCardFace {
37
51
  export class SmoothStreamCardController {
38
52
  private readonly store = createSnapshotStore<SmoothStreamCardState>(this.projection())
39
53
  private loaded: StreamSettingsView | undefined
40
- private staged: boolean | undefined
54
+ private loadedDebug: StreamDebugSettingsView | undefined
55
+ private stagedBase: Pick<StreamSettings, 'enabled' | 'thinkAutoExpand' | 'autoCollapse'> | undefined
56
+ private stagedDebug: Pick<StreamSettings, 'debugEnabled' | 'debugTuning'> | undefined
41
57
  private saving = false
42
58
  private failed = false
43
59
  private upgrading = false
@@ -72,15 +88,31 @@ export class SmoothStreamCardController {
72
88
  inject(): SmoothStreamCardFace {
73
89
  return {
74
90
  hooks: { smoothStreamCard: this.store },
75
- edit: (value) => {
76
- this.staged = value
91
+ edit: (patch) => {
92
+ if (this.saving) return
93
+ if (patch.enabled !== undefined || patch.thinkAutoExpand !== undefined || patch.autoCollapse !== undefined) {
94
+ this.stagedBase = {
95
+ ...this.baseValues(),
96
+ ...(patch.enabled === undefined ? {} : { enabled: patch.enabled }),
97
+ ...(patch.thinkAutoExpand === undefined ? {} : { thinkAutoExpand: patch.thinkAutoExpand }),
98
+ ...(patch.autoCollapse === undefined ? {} : { autoCollapse: patch.autoCollapse }),
99
+ }
100
+ }
101
+ if (this.loadedDebug !== undefined && (patch.debugEnabled !== undefined || patch.debugTuning !== undefined)) {
102
+ this.stagedDebug = {
103
+ ...this.debugValues(),
104
+ ...(patch.debugEnabled === undefined ? {} : { debugEnabled: patch.debugEnabled }),
105
+ ...(patch.debugTuning === undefined ? {} : { debugTuning: { ...this.debugValues().debugTuning, ...patch.debugTuning } }),
106
+ }
107
+ }
77
108
  this.failed = false
78
109
  this.publish()
79
110
  },
80
111
  save: () => { void this.save() },
81
112
  discard: () => {
82
- if (this.staged === undefined && !this.failed) return
83
- this.staged = undefined
113
+ if (this.stagedBase === undefined && this.stagedDebug === undefined && !this.failed) return
114
+ this.stagedBase = undefined
115
+ this.stagedDebug = undefined
84
116
  this.failed = false
85
117
  this.publish()
86
118
  },
@@ -93,10 +125,12 @@ export class SmoothStreamCardController {
93
125
  return {
94
126
  status: this.loadStatus,
95
127
  writable: this.loaded?.writable ?? false,
96
- dirty: this.staged !== undefined,
128
+ dirty: this.stagedBase !== undefined || this.stagedDebug !== undefined,
97
129
  saving: this.saving,
98
130
  failed: this.failed,
99
- thinkAutoExpand: this.staged ?? this.loaded?.thinkAutoExpand ?? DEFAULT_STREAM_SETTINGS.thinkAutoExpand,
131
+ ...this.baseValues(),
132
+ ...this.debugValues(),
133
+ debugAvailable: this.loadedDebug !== undefined,
100
134
  version: this.loaded?.version,
101
135
  installation: this.loaded?.installation ?? 'unmanaged',
102
136
  canUpgrade: this.loaded?.canUpgrade ?? false,
@@ -106,33 +140,82 @@ export class SmoothStreamCardController {
106
140
  }
107
141
  }
108
142
 
143
+ private baseValues(): Pick<StreamSettings, 'enabled' | 'thinkAutoExpand' | 'autoCollapse'> {
144
+ return this.stagedBase ?? {
145
+ enabled: this.loaded?.enabled ?? DEFAULT_STREAM_SETTINGS.enabled,
146
+ thinkAutoExpand: this.loaded?.thinkAutoExpand ?? DEFAULT_STREAM_SETTINGS.thinkAutoExpand,
147
+ autoCollapse: this.loaded?.autoCollapse ?? DEFAULT_STREAM_SETTINGS.autoCollapse,
148
+ }
149
+ }
150
+
151
+ private debugValues(): Pick<StreamSettings, 'debugEnabled' | 'debugTuning'> {
152
+ return this.stagedDebug ?? {
153
+ debugEnabled: this.loadedDebug?.debugEnabled ?? DEFAULT_STREAM_SETTINGS.debugEnabled,
154
+ debugTuning: this.loadedDebug?.tuning ?? DEFAULT_STREAM_DEBUG_TUNING,
155
+ }
156
+ }
157
+
158
+ /** Complete settings projection consumed by the live SettingsCell bridge. */
159
+ values(): StreamSettings {
160
+ return { ...this.baseValues(), ...this.debugValues() }
161
+ }
162
+
109
163
  private async load(): Promise<void> {
110
164
  const generation = ++this.loadGeneration
111
165
  this.loadStatus = 'loading'
112
166
  this.loaded = undefined
167
+ this.loadedDebug = undefined
113
168
  this.publish()
114
169
  try {
115
170
  const view = await this.api.read()
116
171
  if (generation !== this.loadGeneration) return
117
172
  this.loaded = view
118
173
  this.loadStatus = 'ready'
174
+ this.publish()
175
+ try {
176
+ const debug = await this.api.readDebug()
177
+ if (generation !== this.loadGeneration) return
178
+ this.loadedDebug = debug
179
+ } catch {
180
+ if (generation !== this.loadGeneration) return
181
+ // Older hosts expose the original settings endpoints only. Keep the
182
+ // card usable and hide debug-only controls until the host is upgraded.
183
+ this.loadedDebug = undefined
184
+ }
119
185
  } catch {
120
186
  if (generation !== this.loadGeneration) return
121
187
  this.loaded = undefined
188
+ this.loadedDebug = undefined
122
189
  this.loadStatus = 'unavailable'
123
190
  }
124
191
  this.publish()
125
192
  }
126
193
 
127
194
  private async save(): Promise<void> {
128
- if (this.staged === undefined || this.saving || this.loaded?.writable !== true) return
129
- const value = this.staged
195
+ if ((this.stagedBase === undefined && this.stagedDebug === undefined)
196
+ || this.saving || this.loaded?.writable !== true) return
197
+ const base = this.stagedBase
198
+ const debug = this.stagedDebug
130
199
  this.saving = true
131
200
  this.failed = false
132
201
  this.publish()
133
202
  try {
134
- this.loaded = await this.api.write(value)
135
- this.staged = undefined
203
+ if (base !== undefined) {
204
+ const combined = debug !== undefined && this.loadedDebug !== undefined
205
+ this.loaded = await this.api.write(combined ? { ...base, ...debug } : base)
206
+ this.stagedBase = undefined
207
+ if (combined) {
208
+ this.loadedDebug = {
209
+ debugEnabled: debug.debugEnabled,
210
+ tuning: { ...debug.debugTuning },
211
+ }
212
+ this.stagedDebug = undefined
213
+ }
214
+ }
215
+ if (debug !== undefined && this.loadedDebug !== undefined && this.stagedDebug !== undefined) {
216
+ this.loadedDebug = await this.api.writeDebug(debug)
217
+ this.stagedDebug = undefined
218
+ }
136
219
  } catch {
137
220
  this.failed = true
138
221
  }
@@ -1,9 +1,11 @@
1
1
  /** Browser adapter for the Host-owned smooth-stream settings RPC. */
2
2
 
3
3
  import type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'
4
+ import type { StreamDebugTuning, StreamSettings } from '../settings.ts'
4
5
  import {
5
6
  STREAM_SETTINGS_RPC,
6
7
  STREAM_SETTINGS_RPC_CHANNEL,
8
+ type StreamDebugSettingsView,
7
9
  type StreamSettingsView,
8
10
  type StreamUpgradeView,
9
11
  } from '../settings-api.ts'
@@ -20,7 +22,9 @@ function settingsView(value: unknown): StreamSettingsView {
20
22
  || typeof data.version !== 'string'
21
23
  || !['npm', 'development', 'unmanaged'].includes(data.installation as string)
22
24
  || typeof data.writable !== 'boolean'
25
+ || typeof data.enabled !== 'boolean'
23
26
  || typeof data.thinkAutoExpand !== 'boolean'
27
+ || typeof data.autoCollapse !== 'boolean'
24
28
  || typeof data.canUpgrade !== 'boolean') {
25
29
  throw new Error('dsh-smooth-stream: malformed settings response')
26
30
  }
@@ -33,6 +37,29 @@ function upgradeView(value: unknown): StreamUpgradeView {
33
37
  return { restartRequired: true }
34
38
  }
35
39
 
40
+ function debugSettingsView(value: unknown): StreamDebugSettingsView {
41
+ const data = record(value)
42
+ const tuning = record(data?.tuning)
43
+ if (data === undefined
44
+ || typeof data.debugEnabled !== 'boolean'
45
+ || tuning === undefined
46
+ || typeof tuning.revealScale !== 'number'
47
+ || typeof tuning.queuePressure !== 'number'
48
+ || typeof tuning.maxRevealCps !== 'number'
49
+ || typeof tuning.springStiffness !== 'number'
50
+ || typeof tuning.springDamping !== 'number'
51
+ || typeof tuning.springMass !== 'number'
52
+ || typeof tuning.runwayPx !== 'number'
53
+ || typeof tuning.reserveResponseMs !== 'number'
54
+ || typeof tuning.backpressureMinScale !== 'number') {
55
+ throw new Error('dsh-smooth-stream: malformed debug settings response')
56
+ }
57
+ return {
58
+ debugEnabled: data.debugEnabled,
59
+ tuning: tuning as unknown as StreamDebugTuning,
60
+ }
61
+ }
62
+
36
63
  function accepted(result: Awaited<ReturnType<ConnectionHandle['rpc']['call']>>): unknown {
37
64
  if (!result.ok) throw new Error(result.error.message)
38
65
  return result.value
@@ -41,7 +68,9 @@ function accepted(result: Awaited<ReturnType<ConnectionHandle['rpc']['call']>>):
41
68
  /** Narrow client contract consumed by the staged settings-card controller. */
42
69
  export interface SmoothStreamSettingsApi {
43
70
  read(): Promise<StreamSettingsView>
44
- write(thinkAutoExpand: boolean): Promise<StreamSettingsView>
71
+ write(settings: Pick<StreamSettings, 'enabled' | 'thinkAutoExpand' | 'autoCollapse'> & Partial<Pick<StreamSettings, 'debugEnabled' | 'debugTuning'>>): Promise<StreamSettingsView>
72
+ readDebug(): Promise<StreamDebugSettingsView>
73
+ writeDebug(settings: Pick<StreamSettings, 'debugEnabled' | 'debugTuning'>): Promise<StreamDebugSettingsView>
45
74
  upgrade(): Promise<StreamUpgradeView>
46
75
  }
47
76
 
@@ -51,11 +80,32 @@ export function createSmoothStreamSettingsApi(connection: ConnectionHandle): Smo
51
80
  async read(): Promise<StreamSettingsView> {
52
81
  return settingsView(accepted(await connection.rpc.call(STREAM_SETTINGS_RPC_CHANNEL, STREAM_SETTINGS_RPC.read, {})))
53
82
  },
54
- async write(thinkAutoExpand: boolean): Promise<StreamSettingsView> {
83
+ async write(settings: Pick<StreamSettings, 'enabled' | 'thinkAutoExpand' | 'autoCollapse'> & Partial<Pick<StreamSettings, 'debugEnabled' | 'debugTuning'>>): Promise<StreamSettingsView> {
55
84
  return settingsView(accepted(await connection.rpc.call(
56
85
  STREAM_SETTINGS_RPC_CHANNEL,
57
86
  STREAM_SETTINGS_RPC.write,
58
- { thinkAutoExpand },
87
+ {
88
+ enabled: settings.enabled,
89
+ thinkAutoExpand: settings.thinkAutoExpand,
90
+ autoCollapse: settings.autoCollapse,
91
+ ...(settings.debugEnabled === undefined || settings.debugTuning === undefined
92
+ ? {}
93
+ : { debugEnabled: settings.debugEnabled, debugTuning: settings.debugTuning }),
94
+ },
95
+ )))
96
+ },
97
+ async readDebug(): Promise<StreamDebugSettingsView> {
98
+ return debugSettingsView(accepted(await connection.rpc.call(
99
+ STREAM_SETTINGS_RPC_CHANNEL,
100
+ STREAM_SETTINGS_RPC.debugRead,
101
+ {},
102
+ )))
103
+ },
104
+ async writeDebug(settings: Pick<StreamSettings, 'debugEnabled' | 'debugTuning'>): Promise<StreamDebugSettingsView> {
105
+ return debugSettingsView(accepted(await connection.rpc.call(
106
+ STREAM_SETTINGS_RPC_CHANNEL,
107
+ STREAM_SETTINGS_RPC.debugWrite,
108
+ { debugEnabled: settings.debugEnabled, tuning: settings.debugTuning },
59
109
  )))
60
110
  },
61
111
  async upgrade(): Promise<StreamUpgradeView> {