snow-flow 10.0.129 → 10.0.130
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/package.json +1 -1
- package/src/cli/cmd/tui/app.tsx +14 -45
package/package.json
CHANGED
package/src/cli/cmd/tui/app.tsx
CHANGED
|
@@ -116,15 +116,20 @@ export function tui(input: {
|
|
|
116
116
|
}) {
|
|
117
117
|
_onUpgrade = input.onUpgrade
|
|
118
118
|
const skipThemeDetection = !!process.env.OPENCODE_SKIP_THEME_DETECTION || !!process.env.OPENCODE_REMOTE_TUI
|
|
119
|
+
// In hosted mode, use stderr for pre-render logs to keep terminal clean for the renderer
|
|
120
|
+
const forceThread = !!process.env.OTUI_FORCE_THREAD
|
|
121
|
+
const log = forceThread
|
|
122
|
+
? (msg: string) => process.stderr.write(`${msg}\n`)
|
|
123
|
+
: (msg: string) => console.log(msg)
|
|
119
124
|
// promise to prevent immediate exit
|
|
120
125
|
return new Promise<void>(async (resolve) => {
|
|
121
126
|
let mode: "dark" | "light" = "dark"
|
|
122
127
|
if (skipThemeDetection) {
|
|
123
|
-
|
|
128
|
+
log("[snow-flow] skipping theme detection")
|
|
124
129
|
} else {
|
|
125
|
-
|
|
130
|
+
log("[snow-flow] detecting theme...")
|
|
126
131
|
mode = await getTerminalBackgroundColor()
|
|
127
|
-
|
|
132
|
+
log(`[snow-flow] theme: ${mode}`)
|
|
128
133
|
}
|
|
129
134
|
const onExit = async () => {
|
|
130
135
|
await input.onExit?.()
|
|
@@ -148,14 +153,13 @@ export function tui(input: {
|
|
|
148
153
|
|
|
149
154
|
// On Linux, @opentui disables Zig renderer threading which prevents PTY output.
|
|
150
155
|
// OTUI_FORCE_THREAD=1 temporarily spoofs platform so @opentui keeps threading enabled.
|
|
151
|
-
const forceThread = !!process.env.OTUI_FORCE_THREAD
|
|
152
156
|
if (forceThread) {
|
|
153
|
-
|
|
157
|
+
log("[snow-flow] forcing renderer threading (OTUI_FORCE_THREAD)")
|
|
154
158
|
Object.defineProperty(process, "platform", { value: "darwin", configurable: true })
|
|
155
159
|
}
|
|
156
160
|
|
|
157
161
|
try {
|
|
158
|
-
|
|
162
|
+
log("[snow-flow] starting tui...")
|
|
159
163
|
await render(
|
|
160
164
|
() => {
|
|
161
165
|
return (
|
|
@@ -219,50 +223,15 @@ function HostedRendererDiag() {
|
|
|
219
223
|
const renderer = useRenderer()
|
|
220
224
|
onMount(() => {
|
|
221
225
|
const r = renderer as any
|
|
222
|
-
const log = (msg: string) => process.stderr.write(`[sf-diag] ${msg}\n`)
|
|
223
|
-
log(`useThread=${r._useThread} isRunning=${r._isRunning} state=${r._controlState} live=${r.liveRequestCounter}`)
|
|
224
|
-
log(`platform=${process.platform} altScreen=${r._useAlternateScreen}`)
|
|
225
|
-
log(`termSetup=${r._terminalIsSetup} root=${!!r.root} buffer=${!!r.nextRenderBuffer}`)
|
|
226
226
|
|
|
227
|
-
//
|
|
227
|
+
// Clear screen to remove console.log messages, then start render loop
|
|
228
228
|
if (!r._isRunning) {
|
|
229
|
-
log("calling renderer.start()")
|
|
230
|
-
r.start()
|
|
231
|
-
log(`after start: isRunning=${r._isRunning} state=${r._controlState}`)
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Try 2: after 2s, check state and try manual output
|
|
235
|
-
setTimeout(() => {
|
|
236
|
-
log(`2s check: isRunning=${r._isRunning} state=${r._controlState} rendering=${r.rendering}`)
|
|
237
|
-
// Test direct write via realStdoutWrite (saved reference to actual stdout.write)
|
|
238
229
|
const realWrite = r.realStdoutWrite
|
|
239
230
|
if (realWrite) {
|
|
240
|
-
realWrite.call(r.stdout, "\x1b[2J\x1b[H
|
|
241
|
-
log("realStdoutWrite sent")
|
|
242
|
-
}
|
|
243
|
-
// Test lib.writeOut
|
|
244
|
-
try {
|
|
245
|
-
r.writeOut("\x1b[3;1H\x1b[1;32m[sf-diag] WRITEOUT OK\x1b[0m\r\n")
|
|
246
|
-
log("writeOut sent")
|
|
247
|
-
} catch (e: any) {
|
|
248
|
-
log(`writeOut error: ${e.message}`)
|
|
231
|
+
realWrite.call(r.stdout, "\x1b[2J\x1b[H")
|
|
249
232
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
// Try 3: after 4s, try manual render cycle
|
|
253
|
-
setTimeout(() => {
|
|
254
|
-
log(`4s check: isRunning=${r._isRunning} rendering=${r.rendering}`)
|
|
255
|
-
try {
|
|
256
|
-
if (r.root && r.nextRenderBuffer) {
|
|
257
|
-
r.root.render(r.nextRenderBuffer, 0)
|
|
258
|
-
log("root.render done")
|
|
259
|
-
}
|
|
260
|
-
r.renderNative()
|
|
261
|
-
log("renderNative done")
|
|
262
|
-
} catch (e: any) {
|
|
263
|
-
log(`manual render error: ${e.message}`)
|
|
264
|
-
}
|
|
265
|
-
}, 4000)
|
|
233
|
+
r.start()
|
|
234
|
+
}
|
|
266
235
|
})
|
|
267
236
|
return null
|
|
268
237
|
}
|