@patze/code-cli 0.24.0 → 0.31.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.
Files changed (93) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/VERSION +1 -1
  3. package/dist/backend/agent-trace.d.ts +1 -0
  4. package/dist/backend/agent-trace.d.ts.map +1 -1
  5. package/dist/backend/agent-trace.js +1 -0
  6. package/dist/backend/agent-trace.js.map +1 -1
  7. package/dist/backend/execute-client.d.ts +2 -0
  8. package/dist/backend/execute-client.d.ts.map +1 -1
  9. package/dist/backend/execute-client.js +2 -0
  10. package/dist/backend/execute-client.js.map +1 -1
  11. package/dist/backend/run-record.d.ts +2 -0
  12. package/dist/backend/run-record.d.ts.map +1 -1
  13. package/dist/backend/run-record.js +21 -0
  14. package/dist/backend/run-record.js.map +1 -1
  15. package/dist/backend/run-stream-client.d.ts +6 -0
  16. package/dist/backend/run-stream-client.d.ts.map +1 -1
  17. package/dist/backend/run-stream-client.js +10 -0
  18. package/dist/backend/run-stream-client.js.map +1 -1
  19. package/dist/cli/commands/agent.d.ts.map +1 -1
  20. package/dist/cli/commands/agent.js +19 -22
  21. package/dist/cli/commands/agent.js.map +1 -1
  22. package/dist/cli/commands/exec.d.ts.map +1 -1
  23. package/dist/cli/commands/exec.js +42 -7
  24. package/dist/cli/commands/exec.js.map +1 -1
  25. package/dist/cli/interactive/agent-event-feed.d.ts +7 -0
  26. package/dist/cli/interactive/agent-event-feed.d.ts.map +1 -1
  27. package/dist/cli/interactive/agent-event-feed.js +91 -37
  28. package/dist/cli/interactive/agent-event-feed.js.map +1 -1
  29. package/dist/cli/interactive/agent-event-parse.d.ts +4 -0
  30. package/dist/cli/interactive/agent-event-parse.d.ts.map +1 -0
  31. package/dist/cli/interactive/agent-event-parse.js +92 -0
  32. package/dist/cli/interactive/agent-event-parse.js.map +1 -0
  33. package/dist/cli/interactive/agent-events.d.ts +6 -0
  34. package/dist/cli/interactive/agent-events.d.ts.map +1 -1
  35. package/dist/cli/interactive/agent-events.js +39 -2
  36. package/dist/cli/interactive/agent-events.js.map +1 -1
  37. package/dist/cli/interactive/agent-execute-turn.d.ts.map +1 -1
  38. package/dist/cli/interactive/agent-execute-turn.js +5 -0
  39. package/dist/cli/interactive/agent-execute-turn.js.map +1 -1
  40. package/dist/cli/interactive/agent-stream-format.d.ts +4 -0
  41. package/dist/cli/interactive/agent-stream-format.d.ts.map +1 -1
  42. package/dist/cli/interactive/agent-stream-format.js +44 -5
  43. package/dist/cli/interactive/agent-stream-format.js.map +1 -1
  44. package/dist/cli/interactive/composer-chrome.d.ts +20 -0
  45. package/dist/cli/interactive/composer-chrome.d.ts.map +1 -0
  46. package/dist/cli/interactive/composer-chrome.js +77 -0
  47. package/dist/cli/interactive/composer-chrome.js.map +1 -0
  48. package/dist/cli/interactive/composer-keys.d.ts +2 -1
  49. package/dist/cli/interactive/composer-keys.d.ts.map +1 -1
  50. package/dist/cli/interactive/composer-keys.js +9 -2
  51. package/dist/cli/interactive/composer-keys.js.map +1 -1
  52. package/dist/cli/interactive/composer-session-chrome.d.ts +4 -0
  53. package/dist/cli/interactive/composer-session-chrome.d.ts.map +1 -0
  54. package/dist/cli/interactive/composer-session-chrome.js +22 -0
  55. package/dist/cli/interactive/composer-session-chrome.js.map +1 -0
  56. package/dist/cli/interactive/cookbook-feed-writer.d.ts +13 -0
  57. package/dist/cli/interactive/cookbook-feed-writer.d.ts.map +1 -0
  58. package/dist/cli/interactive/cookbook-feed-writer.js +87 -0
  59. package/dist/cli/interactive/cookbook-feed-writer.js.map +1 -0
  60. package/dist/cli/interactive/cookbook-tool-feed.d.ts +13 -0
  61. package/dist/cli/interactive/cookbook-tool-feed.d.ts.map +1 -0
  62. package/dist/cli/interactive/cookbook-tool-feed.js +67 -0
  63. package/dist/cli/interactive/cookbook-tool-feed.js.map +1 -0
  64. package/dist/cli/interactive/header.d.ts +4 -1
  65. package/dist/cli/interactive/header.d.ts.map +1 -1
  66. package/dist/cli/interactive/header.js +67 -1
  67. package/dist/cli/interactive/header.js.map +1 -1
  68. package/dist/cli/interactive/line-editor.d.ts +9 -0
  69. package/dist/cli/interactive/line-editor.d.ts.map +1 -1
  70. package/dist/cli/interactive/line-editor.js +76 -6
  71. package/dist/cli/interactive/line-editor.js.map +1 -1
  72. package/dist/cli/interactive/opentui-agent-event.d.ts +10 -0
  73. package/dist/cli/interactive/opentui-agent-event.d.ts.map +1 -0
  74. package/dist/cli/interactive/opentui-agent-event.js +12 -0
  75. package/dist/cli/interactive/opentui-agent-event.js.map +1 -0
  76. package/dist/cli/interactive/run-replay.d.ts.map +1 -1
  77. package/dist/cli/interactive/run-replay.js +3 -0
  78. package/dist/cli/interactive/run-replay.js.map +1 -1
  79. package/dist/cli/interactive/session-controller.d.ts.map +1 -1
  80. package/dist/cli/interactive/session-controller.js +3 -0
  81. package/dist/cli/interactive/session-controller.js.map +1 -1
  82. package/dist/cli/interactive/shell.d.ts.map +1 -1
  83. package/dist/cli/interactive/shell.js +22 -2
  84. package/dist/cli/interactive/shell.js.map +1 -1
  85. package/dist/cli/interactive/trace-glyphs.d.ts +1 -0
  86. package/dist/cli/interactive/trace-glyphs.d.ts.map +1 -1
  87. package/dist/cli/interactive/trace-glyphs.js +56 -1
  88. package/dist/cli/interactive/trace-glyphs.js.map +1 -1
  89. package/dist/cli/interactive/transcript-upsert.d.ts.map +1 -1
  90. package/dist/cli/interactive/transcript-upsert.js +4 -0
  91. package/dist/cli/interactive/transcript-upsert.js.map +1 -1
  92. package/opentui/src/App.tsx +167 -80
  93. package/package.json +1 -1
@@ -10,4 +10,5 @@ export declare function formatToolStatusGlyph(status: AgentTraceEvent["status"])
10
10
  export declare function formatToolTraceBody(event: AgentTraceEvent): string;
11
11
  export declare function formatToolUpsertLine(event: AgentTraceEvent): string;
12
12
  export declare function formatThinkingUpsertLine(event: AgentTraceEvent): string;
13
+ export declare function formatCompactDiffSnippet(event: AgentTraceEvent): string | null;
13
14
  //# sourceMappingURL=trace-glyphs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trace-glyphs.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/trace-glyphs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAInE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE3D,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CAwBxE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,MAAM,CAQ/E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAkClE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAEnE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAOvE"}
1
+ {"version":3,"file":"trace-glyphs.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/trace-glyphs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAKnE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE3D,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CAwBxE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,MAAM,CAQ/E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAkClE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAYnE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAOvE;AAyHD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CA6C9E"}
@@ -1,4 +1,5 @@
1
1
  import { excerptTraceText } from "../../backend/agent-trace.js";
2
+ import { formatCookbookToolFeedLine, normalizeCookbookToolStatus } from "./cookbook-tool-feed.js";
2
3
  import { summarizeToolArgsFromDetail } from "./tool-arg-summary.js";
3
4
  export function parseTraceEditMeta(event) {
4
5
  const record = event;
@@ -60,7 +61,16 @@ export function formatToolTraceBody(event) {
60
61
  return `▸ ${event.title || name} · ${target}`;
61
62
  }
62
63
  export function formatToolUpsertLine(event) {
63
- return `${formatToolStatusGlyph(event.status)} ${formatToolTraceBody(event)}`;
64
+ const name = (event.toolName || event.title || "tool").trim();
65
+ const params = summarizeToolArgsFromDetail(name, event.detail) ||
66
+ excerptTraceText(event.detail?.trim() ?? "", 80) ||
67
+ undefined;
68
+ const sdkStatus = event.sdkStatus ?? event.status ?? "running";
69
+ return formatCookbookToolFeedLine({
70
+ name,
71
+ status: normalizeCookbookToolStatus(sdkStatus === "done" ? "completed" : sdkStatus),
72
+ params,
73
+ });
64
74
  }
65
75
  export function formatThinkingUpsertLine(event) {
66
76
  const detail = event.detail?.trim();
@@ -172,4 +182,49 @@ function countLines(text) {
172
182
  }
173
183
  return text.split("\n").length;
174
184
  }
185
+ export function formatCompactDiffSnippet(event) {
186
+ const meta = parseTraceEditMeta(event);
187
+ if (meta.action !== "modify") {
188
+ return null;
189
+ }
190
+ const detail = event.detail?.trim();
191
+ if (!detail || (!detail.startsWith("{") && !detail.startsWith("["))) {
192
+ return null;
193
+ }
194
+ try {
195
+ const args = JSON.parse(detail);
196
+ const oldText = typeof args.old_string === "string"
197
+ ? args.old_string
198
+ : typeof args.old_str === "string"
199
+ ? args.old_str
200
+ : null;
201
+ const newText = typeof args.new_string === "string"
202
+ ? args.new_string
203
+ : typeof args.new_str === "string"
204
+ ? args.new_str
205
+ : typeof args.content === "string"
206
+ ? args.content
207
+ : null;
208
+ if (oldText === null || newText === null) {
209
+ return null;
210
+ }
211
+ const oldLines = oldText.split("\n").slice(0, 2);
212
+ const newLines = newText.split("\n").slice(0, 2);
213
+ const parts = [];
214
+ for (const line of oldLines) {
215
+ if (line.trim()) {
216
+ parts.push(`- ${excerptTraceText(line, 72)}`);
217
+ }
218
+ }
219
+ for (const line of newLines) {
220
+ if (line.trim()) {
221
+ parts.push(`+ ${excerptTraceText(line, 72)}`);
222
+ }
223
+ }
224
+ return parts.length > 0 ? parts.join("\n") : null;
225
+ }
226
+ catch {
227
+ return null;
228
+ }
229
+ }
175
230
  //# sourceMappingURL=trace-glyphs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trace-glyphs.js","sourceRoot":"","sources":["../../../src/cli/interactive/trace-glyphs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-glyphs.js","sourceRoot":"","sources":["../../../src/cli/interactive/trace-glyphs.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-upsert.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/transcript-upsert.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAiBf;AAiBD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,qBAAqB,EAAE,EAC9B,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1D,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,EAAE,MAAM,MAAM,GACnB,qBAAqB,EAAE,CAoBzB"}
1
+ {"version":3,"file":"transcript-upsert.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/transcript-upsert.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAiBf;AAsBD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,qBAAqB,EAAE,EAC9B,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1D,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,EAAE,MAAM,MAAM,GACnB,qBAAqB,EAAE,CAoBzB"}
@@ -17,6 +17,10 @@ export function deriveTranscriptUpsertKey(kind, label, text) {
17
17
  return null;
18
18
  }
19
19
  function deriveToolUpsertKey(text) {
20
+ const cookbook = text.match(/^\[[ x~!]\]\s+\[[^\]]+\]\s+(\S+)/);
21
+ if (cookbook) {
22
+ return `tool:${cookbook[1]}`;
23
+ }
20
24
  const legacy = text.match(/^\[[~x!]\]\s+(\S+)/);
21
25
  if (legacy) {
22
26
  return `tool:${legacy[1]}`;
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-upsert.js","sourceRoot":"","sources":["../../../src/cli/interactive/transcript-upsert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transcript-upsert.js","sourceRoot":"","sources":["../../../src/cli/interactive/transcript-upsert.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,6 @@ import {
12
12
  } from "@opentui/react"
13
13
  import { createElement, useCallback, useEffect, useMemo, useRef, useState } from "react"
14
14
 
15
- import { parseTranscriptLine } from "./line-parse.js"
16
15
  import { importPatzeDist } from "./patze-dist.js"
17
16
  import {
18
17
  buildTranscriptLines,
@@ -23,7 +22,7 @@ import {
23
22
  } from "./transcript-render.js"
24
23
  import { classifyPlainOutput, createTranscriptSink, inferErrorKind } from "./tui-sink.js"
25
24
  import { upsertTranscriptEntry } from "../../dist/cli/interactive/transcript-upsert.js"
26
- import { applyAgentEvent } from "../../dist/cli/interactive/agent-event-feed.js"
25
+ import { applyOpenTuiAgentEvent } from "../../dist/cli/interactive/opentui-agent-event.js"
27
26
  import type { AgentEvent } from "../../dist/cli/interactive/agent-events.js"
28
27
 
29
28
  extend({ "tui-input": InputRenderable })
@@ -58,6 +57,10 @@ type InteractiveController = {
58
57
  session: {
59
58
  getModelOverride: () => string | null
60
59
  setModelOverride: (value: string | null) => void
60
+ getModelThinking: () => boolean | null
61
+ setModelThinking: (value: boolean | null) => void
62
+ getModelFast: () => boolean | null
63
+ setModelFast: (value: boolean | null) => void
61
64
  getExecutionMode: () => "local" | "cloud"
62
65
  snapshot: () => Array<{ input: string; lines: string[] }>
63
66
  }
@@ -107,10 +110,13 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
107
110
  const [scrollOffset, setScrollOffset] = useState(0)
108
111
  const [transcript, setTranscript] = useState<TranscriptEntry[]>([])
109
112
  const [currentModel, setCurrentModel] = useState("composer-2.5-fast")
113
+ const [modelThinking, setModelThinking] = useState<boolean | null>(null)
114
+ const [modelFast, setModelFast] = useState<boolean | null>(null)
110
115
  const [executionMode, setExecutionMode] = useState<"local" | "cloud">("local")
111
116
  const [executionTarget, setExecutionTarget] = useState<string | null>(null)
112
117
  const [supportedModels, setSupportedModels] = useState<string[]>([])
113
118
  const [slashMenuReady, setSlashMenuReady] = useState(false)
119
+ const [startupHeader, setStartupHeader] = useState<string[]>([])
114
120
 
115
121
  const followTranscript = useCallback(() => {
116
122
  if (scrollPinnedRef.current) {
@@ -194,6 +200,14 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
194
200
  streamingIdRef.current = null
195
201
  }, [])
196
202
 
203
+ const openTuiStreamHandlers = useMemo(
204
+ () => ({
205
+ onAssistantDelta: upsertStreaming,
206
+ onClearAssistantStream: clearStreaming,
207
+ }),
208
+ [clearStreaming, upsertStreaming]
209
+ )
210
+
197
211
  const refreshStatusMeta = useCallback(async () => {
198
212
  const controller = controllerRef.current
199
213
  if (!controller) {
@@ -213,7 +227,26 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
213
227
  })
214
228
  )
215
229
  setExecutionMode(controller.session.getExecutionMode())
216
- setSupportedModels([...models.PATZE_SUPPORTED_MODELS])
230
+ setModelThinking(controller.session.getModelThinking())
231
+ setModelFast(controller.session.getModelFast())
232
+
233
+ let modelIds = [...models.PATZE_SUPPORTED_MODELS]
234
+ const apiKey = process.env.CURSOR_API_KEY?.trim()
235
+ if (apiKey) {
236
+ try {
237
+ const { Cursor } = await import("@cursor/sdk")
238
+ const listed = await Cursor.models.list({ apiKey })
239
+ const ids = listed
240
+ .map((item) => String(item.id ?? "").trim())
241
+ .filter(Boolean)
242
+ if (ids.length > 0) {
243
+ modelIds = ids
244
+ }
245
+ } catch {
246
+ // keep bundled fallback list
247
+ }
248
+ }
249
+ setSupportedModels(modelIds)
217
250
 
218
251
  const cloudGit = await importPatzeDist<
219
252
  typeof import("../../dist/cli/interactive/cloud-git.js")
@@ -254,10 +287,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
254
287
  const controller = (await sessionMod.prepareInteractiveController({
255
288
  cwd,
256
289
  interactive: true,
257
- streamPartials: true,
258
- onPartial: (chunk: string) => {
259
- upsertStreaming(chunk)
260
- },
290
+ streamPartials: false,
261
291
  })) as InteractiveController
262
292
 
263
293
  if (cancelled) {
@@ -265,21 +295,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
265
295
  }
266
296
 
267
297
  controllerRef.current = controller
268
-
269
- const headerEntries = controller.renderHeaderLines().flatMap((line) => {
270
- const parsed = parseTranscriptLine(line)
271
- if (!parsed || parsed.continuation) {
272
- return []
273
- }
274
- return [
275
- {
276
- id: nextId(),
277
- kind: "meta" as const,
278
- label: parsed.label || "info",
279
- text: parsed.text || line,
280
- },
281
- ]
282
- })
298
+ setStartupHeader(controller.renderHeaderLines())
283
299
 
284
300
  const restored: TranscriptEntry[] = []
285
301
  for (const turn of controller.session.snapshot()) {
@@ -294,7 +310,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
294
310
  }
295
311
  }
296
312
 
297
- setTranscript([...headerEntries, ...restored])
313
+ setTranscript(restored)
298
314
  await refreshStatusMeta()
299
315
  setReady(true)
300
316
  } catch (error) {
@@ -306,7 +322,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
306
322
  return () => {
307
323
  cancelled = true
308
324
  }
309
- }, [cwd, nextId, refreshStatusMeta, upsertStreaming])
325
+ }, [cwd, nextId, refreshStatusMeta])
310
326
 
311
327
  const exitApp = useCallback(() => {
312
328
  controllerRef.current?.persistSession()
@@ -320,7 +336,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
320
336
  return
321
337
  }
322
338
 
323
- const value = rawLine.trim()
339
+ const value = trimComposerPrompt(rawLine)
324
340
  if (!value) {
325
341
  return
326
342
  }
@@ -354,7 +370,9 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
354
370
  useActivitySpinner: false,
355
371
  onAgentEvent: (event) => {
356
372
  setActivityLabel(null)
357
- setTranscript((items) => applyAgentEvent(items, event, turnAssistantId))
373
+ setTranscript((items) =>
374
+ applyOpenTuiAgentEvent(items, event, turnAssistantId, openTuiStreamHandlers)
375
+ )
358
376
  followTranscript()
359
377
  },
360
378
  })
@@ -380,6 +398,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
380
398
  followTranscript,
381
399
  markScrollPinned,
382
400
  nextId,
401
+ openTuiStreamHandlers,
383
402
  refreshStatusMeta,
384
403
  upsertTranscriptLine,
385
404
  upsertStreaming,
@@ -391,6 +410,23 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
391
410
  setMode("model")
392
411
  }, [])
393
412
 
413
+ const toggleModelPreference = useCallback((kind: "thinking" | "fast") => {
414
+ const controller = controllerRef.current
415
+ if (!controller) {
416
+ return
417
+ }
418
+ if (kind === "thinking") {
419
+ const next = controller.session.getModelThinking() === true ? null : true
420
+ controller.session.setModelThinking(next)
421
+ setModelThinking(next)
422
+ } else {
423
+ const next = controller.session.getModelFast() === true ? null : true
424
+ controller.session.setModelFast(next)
425
+ setModelFast(next)
426
+ }
427
+ controller.persistSession()
428
+ }, [])
429
+
394
430
  const runCommand = useCallback(
395
431
  async (rawCommand: string) => {
396
432
  const trimmed = rawCommand.trim()
@@ -431,7 +467,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
431
467
 
432
468
  const submitInput = useCallback(
433
469
  (value: string) => {
434
- const prompt = value.trim()
470
+ const prompt = trimComposerPrompt(value)
435
471
  setInput("")
436
472
 
437
473
  if (!prompt || busy) {
@@ -473,41 +509,26 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
473
509
  const modelSelectRows = Math.min(8, Math.max(3, rows - 10))
474
510
  const commandPanelRows = 2 + commandSelectRows
475
511
  const modelPanelRows = 3 + modelSelectRows
512
+ const headerRows = Math.max(1, startupHeader.length)
513
+ const composerChromeRows = 5
514
+ const bottomHintRows = 1
476
515
 
477
516
  const transcriptViewportRows = Math.max(
478
517
  4,
479
- rows - (mode === "model" ? modelPanelRows + 4 : mode === "command" ? commandPanelRows + 4 : 6)
518
+ rows -
519
+ headerRows -
520
+ bottomHintRows -
521
+ (mode === "model"
522
+ ? modelPanelRows + 2
523
+ : mode === "command"
524
+ ? commandPanelRows + 2
525
+ : composerChromeRows)
480
526
  )
481
527
 
482
- const scrollableEntries = useMemo(
483
- () => [
484
- { id: "status-cwd", kind: "meta" as const, label: "cwd", text: cwd },
485
- {
486
- id: "status-mode",
487
- kind: "meta" as const,
488
- label: "mode",
489
- text: executionMode,
490
- },
491
- ...(executionTarget
492
- ? [
493
- {
494
- id: "status-target",
495
- kind: "meta" as const,
496
- label: "target",
497
- text: executionTarget,
498
- },
499
- ]
500
- : []),
501
- {
502
- id: "status-model",
503
- kind: "meta" as const,
504
- label: "model",
505
- text: currentModel,
506
- },
507
- ...transcript,
508
- ],
509
- [cwd, currentModel, executionMode, executionTarget, transcript]
510
- )
528
+ const composerModelLabel = `${currentModel}${modelThinking ? " · thinking" : ""}${modelFast ? " · fast" : ""}`
529
+ const composerPathLabel = shortenComposerPath(cwd)
530
+
531
+ const scrollableEntries = useMemo(() => transcript, [transcript])
511
532
 
512
533
  const transcriptLines = useMemo(
513
534
  () => buildTranscriptLines(scrollableEntries, columns),
@@ -571,6 +592,10 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
571
592
  if (mode === "model") {
572
593
  if (key.name === "backspace" || key.name === "delete") {
573
594
  setModelSearch((value) => value.slice(0, -1))
595
+ } else if (character === "T") {
596
+ toggleModelPreference("thinking")
597
+ } else if (character === "F") {
598
+ toggleModelPreference("fast")
574
599
  } else if (isSearchInput(character)) {
575
600
  setModelSearch((value) => `${value}${character}`)
576
601
  }
@@ -586,6 +611,11 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
586
611
  if (mode === "input") {
587
612
  const pageSize = Math.max(1, transcriptViewportRows - 1)
588
613
 
614
+ if (key.shift && (key.name === "return" || key.name === "enter")) {
615
+ setInput((value) => `${value}\n`)
616
+ return
617
+ }
618
+
589
619
  if (key.name === "up") {
590
620
  markScrollUnpinned()
591
621
  setScrollOffset((offset) => Math.min(maxScrollOffset, offset + 1))
@@ -646,6 +676,15 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
646
676
  return createElement(
647
677
  "box",
648
678
  { flexDirection: "column", height: rows, paddingX: 1 },
679
+ startupHeader.length
680
+ ? createElement(
681
+ "box",
682
+ { flexDirection: "column", flexShrink: 0, marginBottom: 1 },
683
+ startupHeader.map((line, index) =>
684
+ createElement(HeaderLine, { key: `header-${index}`, line })
685
+ )
686
+ )
687
+ : null,
649
688
  createElement(
650
689
  "box",
651
690
  { flexDirection: "column", height: transcriptViewportRows },
@@ -705,7 +744,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
705
744
  attributes: TextAttributes.BOLD,
706
745
  }),
707
746
  createElement("text", {
708
- content: "Type to search · Enter choose · Escape cancel",
747
+ content: `Type to search · T thinking ${modelThinking ? "on" : "off"} · F fast ${modelFast ? "on" : "off"} · Enter choose · Escape cancel`,
709
748
  fg: "gray",
710
749
  }),
711
750
  createElement("text", {
@@ -728,31 +767,44 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
728
767
  border: true,
729
768
  borderStyle: "single",
730
769
  borderColor: busy ? "yellow" : "green",
770
+ flexDirection: "column",
731
771
  marginTop: 1,
732
772
  paddingX: 1,
733
773
  },
734
- createElement(TuiInput, {
735
- focused: ready && !busy,
736
- placeholder: busy
737
- ? activityLabel
738
- ? `${["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"][activityFrame % 10]} ${activityLabel}… · Ctrl+C cancel`
739
- : "Ctrl+C cancel · waiting for agent…"
740
- : ready
741
- ? "Ask or type /help"
742
- : "Loading Patze Code…",
743
- value: input,
744
- onInput: (value: string) => {
745
- setInput(value)
746
- if (busy) {
747
- return
748
- }
749
- if (value.startsWith("/") && !value.includes(" ")) {
750
- setMode("command")
751
- } else {
752
- setMode("input")
753
- }
754
- },
755
- onSubmit: submitInput,
774
+ createElement(
775
+ "box",
776
+ { flexDirection: "row", alignItems: "center" },
777
+ createElement("text", {
778
+ content: "> ",
779
+ attributes: TextAttributes.BOLD,
780
+ }),
781
+ createElement(TuiInput, {
782
+ focused: ready && !busy,
783
+ placeholder: busy
784
+ ? activityLabel
785
+ ? `${["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"][activityFrame % 10]} ${activityLabel}… · Ctrl+C cancel`
786
+ : "Ctrl+C cancel · waiting for agent…"
787
+ : ready
788
+ ? "Ask anything…"
789
+ : "Loading Patze Code…",
790
+ value: input,
791
+ onInput: (value: string) => {
792
+ setInput(value)
793
+ if (busy) {
794
+ return
795
+ }
796
+ if (value.startsWith("/") && !value.includes(" ")) {
797
+ setMode("command")
798
+ } else {
799
+ setMode("input")
800
+ }
801
+ },
802
+ onSubmit: submitInput,
803
+ })
804
+ ),
805
+ createElement("text", {
806
+ content: `${composerModelLabel} · ${composerPathLabel}`,
807
+ attributes: TextAttributes.DIM,
756
808
  })
757
809
  ),
758
810
  createElement("text", {
@@ -764,6 +816,41 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
764
816
  )
765
817
  }
766
818
 
819
+ function trimComposerPrompt(value: string): string {
820
+ return value.replace(/^\s+|\s+$/g, "")
821
+ }
822
+
823
+ function shortenComposerPath(path: string): string {
824
+ const normalized = String(path || "").trim().replace(/\\/g, "/")
825
+ if ([...normalized].length <= 36) {
826
+ return normalized
827
+ }
828
+ const parts = normalized.split("/").filter(Boolean)
829
+ if (parts.length >= 2) {
830
+ const tail = `${parts[parts.length - 2]}/${parts[parts.length - 1]}`
831
+ const candidate = `…/${tail}`
832
+ if ([...candidate].length <= 36) {
833
+ return candidate
834
+ }
835
+ }
836
+ return `…${normalized.slice(-35)}`
837
+ }
838
+
839
+ function HeaderLine({ line }: { line: string }) {
840
+ const plain = stripAnsi(line)
841
+ const dim = line.includes("\x1b[2m") || plain.startsWith("Tip:") || plain.includes("Beta ·")
842
+ const warn = line.includes("\x1b[33m") || plain.startsWith("Heads up:")
843
+ return createElement("text", {
844
+ content: plain,
845
+ fg: warn ? "yellow" : dim ? "gray" : undefined,
846
+ attributes: dim ? TextAttributes.DIM : TextAttributes.NONE,
847
+ })
848
+ }
849
+
850
+ function stripAnsi(text: string): string {
851
+ return text.replace(/\x1b\[[0-9;]*m/g, "")
852
+ }
853
+
767
854
  function TranscriptLine({ line }: { line: TranscriptLine }) {
768
855
  const color = {
769
856
  assistant: "white",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patze/code-cli",
3
- "version": "0.24.0",
3
+ "version": "0.31.0",
4
4
  "description": "Patze Code — local terminal coding agent client for PatzeAgents",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",