@patze/code-cli 0.31.0 → 0.41.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.
- package/CHANGELOG.md +97 -0
- package/VERSION +1 -1
- package/dist/cli/commands/agent.d.ts.map +1 -1
- package/dist/cli/commands/agent.js +11 -11
- package/dist/cli/commands/agent.js.map +1 -1
- package/dist/cli/commands/exec.d.ts.map +1 -1
- package/dist/cli/commands/exec.js +8 -5
- package/dist/cli/commands/exec.js.map +1 -1
- package/dist/cli/commands/trust-loop-snapshot.d.ts.map +1 -1
- package/dist/cli/commands/trust-loop-snapshot.js +19 -0
- package/dist/cli/commands/trust-loop-snapshot.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +9 -8
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/interactive/agent-event-feed.d.ts +6 -3
- package/dist/cli/interactive/agent-event-feed.d.ts.map +1 -1
- package/dist/cli/interactive/agent-event-feed.js +110 -63
- package/dist/cli/interactive/agent-event-feed.js.map +1 -1
- package/dist/cli/interactive/agent-execute-turn.d.ts +3 -0
- package/dist/cli/interactive/agent-execute-turn.d.ts.map +1 -1
- package/dist/cli/interactive/agent-execute-turn.js +8 -0
- package/dist/cli/interactive/agent-execute-turn.js.map +1 -1
- package/dist/cli/interactive/agent-stream-format.js +4 -4
- package/dist/cli/interactive/agent-stream-format.js.map +1 -1
- package/dist/cli/interactive/agent-turn-classify.d.ts.map +1 -1
- package/dist/cli/interactive/agent-turn-classify.js +1 -3
- package/dist/cli/interactive/agent-turn-classify.js.map +1 -1
- package/dist/cli/interactive/agent-turn-context.d.ts.map +1 -1
- package/dist/cli/interactive/agent-turn-context.js +7 -1
- package/dist/cli/interactive/agent-turn-context.js.map +1 -1
- package/dist/cli/interactive/agent-turn-format.js +2 -2
- package/dist/cli/interactive/agent-turn-format.js.map +1 -1
- package/dist/cli/interactive/agent-turn.d.ts +1 -0
- package/dist/cli/interactive/agent-turn.d.ts.map +1 -1
- package/dist/cli/interactive/agent-turn.js +40 -28
- package/dist/cli/interactive/agent-turn.js.map +1 -1
- package/dist/cli/interactive/auth-gate.d.ts +6 -0
- package/dist/cli/interactive/auth-gate.d.ts.map +1 -0
- package/dist/cli/interactive/auth-gate.js +29 -0
- package/dist/cli/interactive/auth-gate.js.map +1 -0
- package/dist/cli/interactive/codex-diff-feed.d.ts +14 -0
- package/dist/cli/interactive/codex-diff-feed.d.ts.map +1 -0
- package/dist/cli/interactive/codex-diff-feed.js +76 -0
- package/dist/cli/interactive/codex-diff-feed.js.map +1 -0
- package/dist/cli/interactive/codex-feed-demo.d.ts +9 -0
- package/dist/cli/interactive/codex-feed-demo.d.ts.map +1 -0
- package/dist/cli/interactive/codex-feed-demo.js +72 -0
- package/dist/cli/interactive/codex-feed-demo.js.map +1 -0
- package/dist/cli/interactive/codex-feed-format.d.ts +35 -0
- package/dist/cli/interactive/codex-feed-format.d.ts.map +1 -0
- package/dist/cli/interactive/codex-feed-format.js +142 -0
- package/dist/cli/interactive/codex-feed-format.js.map +1 -0
- package/dist/cli/interactive/codex-feed-writer.d.ts +18 -0
- package/dist/cli/interactive/codex-feed-writer.d.ts.map +1 -0
- package/dist/cli/interactive/codex-feed-writer.js +144 -0
- package/dist/cli/interactive/codex-feed-writer.js.map +1 -0
- package/dist/cli/interactive/codex-preview-feed.d.ts +13 -0
- package/dist/cli/interactive/codex-preview-feed.d.ts.map +1 -0
- package/dist/cli/interactive/codex-preview-feed.js +130 -0
- package/dist/cli/interactive/codex-preview-feed.js.map +1 -0
- package/dist/cli/interactive/cookbook-feed-writer.d.ts +2 -12
- package/dist/cli/interactive/cookbook-feed-writer.d.ts.map +1 -1
- package/dist/cli/interactive/cookbook-feed-writer.js +2 -86
- package/dist/cli/interactive/cookbook-feed-writer.js.map +1 -1
- package/dist/cli/interactive/header.d.ts.map +1 -1
- package/dist/cli/interactive/header.js +1 -7
- package/dist/cli/interactive/header.js.map +1 -1
- package/dist/cli/interactive/line-editor.d.ts +2 -0
- package/dist/cli/interactive/line-editor.d.ts.map +1 -1
- package/dist/cli/interactive/line-editor.js +7 -5
- package/dist/cli/interactive/line-editor.js.map +1 -1
- package/dist/cli/interactive/plain-agent-render.d.ts +5 -4
- package/dist/cli/interactive/plain-agent-render.d.ts.map +1 -1
- package/dist/cli/interactive/plain-agent-render.js +12 -44
- package/dist/cli/interactive/plain-agent-render.js.map +1 -1
- package/dist/cli/interactive/plain-codex-feed.d.ts +11 -0
- package/dist/cli/interactive/plain-codex-feed.d.ts.map +1 -0
- package/dist/cli/interactive/plain-codex-feed.js +37 -0
- package/dist/cli/interactive/plain-codex-feed.js.map +1 -0
- package/dist/cli/interactive/reset-agent.d.ts +8 -0
- package/dist/cli/interactive/reset-agent.d.ts.map +1 -0
- package/dist/cli/interactive/reset-agent.js +23 -0
- package/dist/cli/interactive/reset-agent.js.map +1 -0
- package/dist/cli/interactive/session-controller.d.ts +1 -0
- package/dist/cli/interactive/session-controller.d.ts.map +1 -1
- package/dist/cli/interactive/session-controller.js +21 -10
- package/dist/cli/interactive/session-controller.js.map +1 -1
- package/dist/cli/interactive/session-hints.d.ts +4 -0
- package/dist/cli/interactive/session-hints.d.ts.map +1 -0
- package/dist/cli/interactive/session-hints.js +28 -0
- package/dist/cli/interactive/session-hints.js.map +1 -0
- package/dist/cli/interactive/session.d.ts +3 -1
- package/dist/cli/interactive/session.d.ts.map +1 -1
- package/dist/cli/interactive/session.js +8 -2
- package/dist/cli/interactive/session.js.map +1 -1
- package/dist/cli/interactive/shell.d.ts.map +1 -1
- package/dist/cli/interactive/shell.js +59 -20
- package/dist/cli/interactive/shell.js.map +1 -1
- package/dist/cli/interactive/slash-dispatch.d.ts +6 -0
- package/dist/cli/interactive/slash-dispatch.d.ts.map +1 -1
- package/dist/cli/interactive/slash-dispatch.js +29 -5
- package/dist/cli/interactive/slash-dispatch.js.map +1 -1
- package/dist/cli/interactive/slash-menu-core.d.ts +10 -0
- package/dist/cli/interactive/slash-menu-core.d.ts.map +1 -0
- package/dist/cli/interactive/slash-menu-core.js +34 -0
- package/dist/cli/interactive/slash-menu-core.js.map +1 -0
- package/dist/cli/interactive/slash-menu.d.ts +3 -0
- package/dist/cli/interactive/slash-menu.d.ts.map +1 -1
- package/dist/cli/interactive/slash-menu.js +16 -4
- package/dist/cli/interactive/slash-menu.js.map +1 -1
- package/dist/cli/interactive/slash-registry.d.ts.map +1 -1
- package/dist/cli/interactive/slash-registry.js +4 -1
- package/dist/cli/interactive/slash-registry.js.map +1 -1
- package/dist/cli/interactive/trace-glyphs.d.ts.map +1 -1
- package/dist/cli/interactive/trace-glyphs.js +2 -11
- package/dist/cli/interactive/trace-glyphs.js.map +1 -1
- package/dist/cli/interactive/transcript-upsert.d.ts.map +1 -1
- package/dist/cli/interactive/transcript-upsert.js +6 -6
- package/dist/cli/interactive/transcript-upsert.js.map +1 -1
- package/dist/cli/one-shot-args.d.ts +1 -0
- package/dist/cli/one-shot-args.d.ts.map +1 -1
- package/dist/cli/one-shot-args.js +3 -2
- package/dist/cli/one-shot-args.js.map +1 -1
- package/opentui/src/App.tsx +67 -6
- package/opentui/src/transcript-render.ts +144 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-upsert.js","sourceRoot":"","sources":["../../../src/cli/interactive/transcript-upsert.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transcript-upsert.js","sourceRoot":"","sources":["../../../src/cli/interactive/transcript-upsert.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"one-shot-args.d.ts","sourceRoot":"","sources":["../../src/cli/one-shot-args.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAEpE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"one-shot-args.d.ts","sourceRoot":"","sources":["../../src/cli/one-shot-args.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAEpE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAcD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,mBAAmB,GAAG,IAAI,CA2BrF"}
|
|
@@ -13,6 +13,7 @@ const KNOWN_ROOT_COMMANDS = new Set([
|
|
|
13
13
|
]);
|
|
14
14
|
export function parseOneShotAgentOptions(argv) {
|
|
15
15
|
const dryRun = flagBoolean(argv.flags, "dry-run");
|
|
16
|
+
const force = flagBoolean(argv.flags, "force");
|
|
16
17
|
const cwdFlag = flagString(argv.flags, "cwd") ?? flagString(argv.flags, "C");
|
|
17
18
|
const cwd = resolve(cwdFlag ?? process.cwd());
|
|
18
19
|
const model = flagString(argv.flags, "model") ??
|
|
@@ -21,7 +22,7 @@ export function parseOneShotAgentOptions(argv) {
|
|
|
21
22
|
const [root, sub] = argv.command;
|
|
22
23
|
if (root === "agent") {
|
|
23
24
|
const prompt = [sub, ...argv.positional].filter(Boolean).join(" ").trim();
|
|
24
|
-
return prompt ? { prompt, cwd, model, dryRun } : null;
|
|
25
|
+
return prompt ? { prompt, cwd, model, dryRun, force } : null;
|
|
25
26
|
}
|
|
26
27
|
if (!root || KNOWN_ROOT_COMMANDS.has(root)) {
|
|
27
28
|
return null;
|
|
@@ -30,6 +31,6 @@ export function parseOneShotAgentOptions(argv) {
|
|
|
30
31
|
if (!prompt) {
|
|
31
32
|
return null;
|
|
32
33
|
}
|
|
33
|
-
return { prompt, cwd, model, dryRun };
|
|
34
|
+
return { prompt, cwd, model, dryRun, force };
|
|
34
35
|
}
|
|
35
36
|
//# sourceMappingURL=one-shot-args.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"one-shot-args.js","sourceRoot":"","sources":["../../src/cli/one-shot-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"one-shot-args.js","sourceRoot":"","sources":["../../src/cli/one-shot-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAA;AAUpE,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;CACR,CAAC,CAAA;AAEF,MAAM,UAAU,wBAAwB,CAAC,IAAgB;IACvD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC5E,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC7C,MAAM,KAAK,GACT,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;QAC3B,IAAI,CAAA;IAEN,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;IAEhC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QACzE,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IAC9D,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC9C,CAAC"}
|
package/opentui/src/App.tsx
CHANGED
|
@@ -76,7 +76,7 @@ type InteractiveController = {
|
|
|
76
76
|
useActivitySpinner?: boolean
|
|
77
77
|
onAgentEvent?: (event: AgentEvent) => void
|
|
78
78
|
}
|
|
79
|
-
) => Promise<{ exitShell: boolean; exitCode: number; streamed?: boolean }>
|
|
79
|
+
) => Promise<{ exitShell: boolean; exitCode: number; streamed?: boolean; clearVisibleTranscript?: boolean }>
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
function parseCwdArg(): string {
|
|
@@ -117,6 +117,8 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
117
117
|
const [supportedModels, setSupportedModels] = useState<string[]>([])
|
|
118
118
|
const [slashMenuReady, setSlashMenuReady] = useState(false)
|
|
119
119
|
const [startupHeader, setStartupHeader] = useState<string[]>([])
|
|
120
|
+
const [composerPlaceholder, setComposerPlaceholder] = useState("Describe a task… · / for commands")
|
|
121
|
+
const [emptySessionHints, setEmptySessionHints] = useState<string[]>([])
|
|
120
122
|
|
|
121
123
|
const followTranscript = useCallback(() => {
|
|
122
124
|
if (scrollPinnedRef.current) {
|
|
@@ -259,6 +261,16 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
259
261
|
} else {
|
|
260
262
|
setExecutionTarget(null)
|
|
261
263
|
}
|
|
264
|
+
|
|
265
|
+
const authGate = await importPatzeDist<
|
|
266
|
+
typeof import("../../dist/cli/interactive/auth-gate.js")
|
|
267
|
+
>("cli/interactive/auth-gate.js")
|
|
268
|
+
setComposerPlaceholder(authGate.resolveComposerPlaceholder(controller.cwd))
|
|
269
|
+
|
|
270
|
+
const sessionHints = await importPatzeDist<
|
|
271
|
+
typeof import("../../dist/cli/interactive/session-hints.js")
|
|
272
|
+
>("cli/interactive/session-hints.js")
|
|
273
|
+
setEmptySessionHints(sessionHints.buildEmptySessionHints(controller.cwd))
|
|
262
274
|
}, [])
|
|
263
275
|
|
|
264
276
|
useEffect(() => {
|
|
@@ -367,7 +379,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
367
379
|
const result = await controller.processLine(value, sink, {
|
|
368
380
|
signal: abort.signal,
|
|
369
381
|
onActivity: setActivityLabel,
|
|
370
|
-
useActivitySpinner:
|
|
382
|
+
useActivitySpinner: true,
|
|
371
383
|
onAgentEvent: (event) => {
|
|
372
384
|
setActivityLabel(null)
|
|
373
385
|
setTranscript((items) =>
|
|
@@ -379,6 +391,10 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
379
391
|
if (result.streamed) {
|
|
380
392
|
clearStreaming()
|
|
381
393
|
}
|
|
394
|
+
if (result.clearVisibleTranscript) {
|
|
395
|
+
setTranscript([])
|
|
396
|
+
markScrollPinned()
|
|
397
|
+
}
|
|
382
398
|
await refreshStatusMeta()
|
|
383
399
|
if (result.exitShell) {
|
|
384
400
|
exitApp()
|
|
@@ -443,8 +459,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
443
459
|
|
|
444
460
|
switch (name?.toLowerCase()) {
|
|
445
461
|
case "help":
|
|
446
|
-
|
|
447
|
-
setMode("command")
|
|
462
|
+
await submitToController("/help")
|
|
448
463
|
return
|
|
449
464
|
case "model":
|
|
450
465
|
if (!args.trim()) {
|
|
@@ -569,6 +584,26 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
569
584
|
}))
|
|
570
585
|
}, [currentModel, modelSearch, supportedModels])
|
|
571
586
|
|
|
587
|
+
const toggleFeedExpand = useCallback((target: "think" | "diff") => {
|
|
588
|
+
setTranscript((items) => {
|
|
589
|
+
for (let index = items.length - 1; index >= 0; index -= 1) {
|
|
590
|
+
const entry = items[index]
|
|
591
|
+
const matchesThink = target === "think" && entry.label === "think" && entry.detailText
|
|
592
|
+
const matchesDiff =
|
|
593
|
+
target === "diff" && entry.kind === "meta" && entry.label === "diff" && entry.detailText
|
|
594
|
+
if (matchesThink || matchesDiff) {
|
|
595
|
+
return items.map((candidate, candidateIndex) =>
|
|
596
|
+
candidateIndex === index
|
|
597
|
+
? { ...candidate, expanded: !candidate.expanded }
|
|
598
|
+
: candidate
|
|
599
|
+
)
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
return items
|
|
603
|
+
})
|
|
604
|
+
followTranscript()
|
|
605
|
+
}, [followTranscript])
|
|
606
|
+
|
|
572
607
|
useKeyboard((key: KeyEvent) => {
|
|
573
608
|
const character = getInputCharacter(key)
|
|
574
609
|
|
|
@@ -611,6 +646,16 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
611
646
|
if (mode === "input") {
|
|
612
647
|
const pageSize = Math.max(1, transcriptViewportRows - 1)
|
|
613
648
|
|
|
649
|
+
if (key.ctrl && key.name === "t") {
|
|
650
|
+
toggleFeedExpand("think")
|
|
651
|
+
return
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
if (key.ctrl && key.name === "d") {
|
|
655
|
+
toggleFeedExpand("diff")
|
|
656
|
+
return
|
|
657
|
+
}
|
|
658
|
+
|
|
614
659
|
if (key.shift && (key.name === "return" || key.name === "enter")) {
|
|
615
660
|
setInput((value) => `${value}\n`)
|
|
616
661
|
return
|
|
@@ -688,6 +733,15 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
688
733
|
createElement(
|
|
689
734
|
"box",
|
|
690
735
|
{ flexDirection: "column", height: transcriptViewportRows },
|
|
736
|
+
transcript.length === 0 && emptySessionHints.length
|
|
737
|
+
? emptySessionHints.map((hint, index) =>
|
|
738
|
+
createElement("text", {
|
|
739
|
+
key: `hint-${index}`,
|
|
740
|
+
content: hint,
|
|
741
|
+
attributes: TextAttributes.DIM,
|
|
742
|
+
})
|
|
743
|
+
)
|
|
744
|
+
: null,
|
|
691
745
|
visibleTranscriptLines.map((line) =>
|
|
692
746
|
createElement(TranscriptLine, { key: line.id, line })
|
|
693
747
|
)
|
|
@@ -701,6 +755,13 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
701
755
|
}`
|
|
702
756
|
)
|
|
703
757
|
: null,
|
|
758
|
+
busy && activityLabel
|
|
759
|
+
? createElement("text", {
|
|
760
|
+
content: `${["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"][activityFrame % 10]} ${activityLabel}…`,
|
|
761
|
+
fg: "yellow",
|
|
762
|
+
attributes: TextAttributes.DIM,
|
|
763
|
+
})
|
|
764
|
+
: null,
|
|
704
765
|
mode === "command"
|
|
705
766
|
? createElement(
|
|
706
767
|
"box",
|
|
@@ -785,7 +846,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
785
846
|
? `${["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"][activityFrame % 10]} ${activityLabel}… · Ctrl+C cancel`
|
|
786
847
|
: "Ctrl+C cancel · waiting for agent…"
|
|
787
848
|
: ready
|
|
788
|
-
?
|
|
849
|
+
? composerPlaceholder
|
|
789
850
|
: "Loading Patze Code…",
|
|
790
851
|
value: input,
|
|
791
852
|
onInput: (value: string) => {
|
|
@@ -810,7 +871,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
810
871
|
createElement("text", {
|
|
811
872
|
content: busy
|
|
812
873
|
? "Esc exit · Ctrl+C cancel run · agent executing"
|
|
813
|
-
: "Esc exit · Ctrl+C quit · /
|
|
874
|
+
: "Esc exit · Ctrl+C quit · / commands · ctrl+t thought · ctrl+d diff · /status",
|
|
814
875
|
attributes: TextAttributes.DIM,
|
|
815
876
|
})
|
|
816
877
|
)
|
|
@@ -12,6 +12,9 @@ export type TranscriptEntry = {
|
|
|
12
12
|
label: string
|
|
13
13
|
text: string
|
|
14
14
|
upsertKey?: string
|
|
15
|
+
/** Full thinking body when collapsed summary is truncated. */
|
|
16
|
+
detailText?: string
|
|
17
|
+
expanded?: boolean
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
export type TranscriptPart = {
|
|
@@ -37,17 +40,65 @@ export function buildTranscriptLines(entries: TranscriptEntry[], columns: number
|
|
|
37
40
|
entry.kind === "assistant"
|
|
38
41
|
? renderMarkdownLines(entry.text || "...", textWidth)
|
|
39
42
|
: wrapText(entry.text || "...", textWidth).map((text) => ({
|
|
40
|
-
parts:
|
|
43
|
+
parts: parseCodexFeedParts(entry.kind, entry.label, text),
|
|
41
44
|
}))
|
|
42
45
|
)
|
|
43
46
|
|
|
44
|
-
|
|
47
|
+
const lines = renderedLines.map((line, index) => ({
|
|
45
48
|
id: `${entry.id}-${index}`,
|
|
46
49
|
kind: entry.kind,
|
|
47
50
|
label: index === 0 ? entry.label : "",
|
|
48
51
|
parts: line.parts,
|
|
49
52
|
}))
|
|
53
|
+
|
|
54
|
+
if (entry.label === "think" && entry.detailText) {
|
|
55
|
+
return appendExpandableDetailLines(lines, entry, textWidth, {
|
|
56
|
+
hint: ` (+${entry.detailText.length} chars · ctrl+t expand)`,
|
|
57
|
+
renderDetailLine: (text) => [{ text: ` ${text}`, color: "gray" as const, dimColor: true }],
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (entry.kind === "meta" && entry.label === "diff" && entry.detailText) {
|
|
62
|
+
return appendExpandableDetailLines(lines, entry, textWidth, {
|
|
63
|
+
hint: ` (+${entry.detailText.split("\n").length} lines · ctrl+d expand)`,
|
|
64
|
+
renderDetailLine: (text) => parseCodexDiffParts(text.startsWith(" ") ? text : ` ${text}`),
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return lines
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function appendExpandableDetailLines(
|
|
73
|
+
lines: TranscriptLine[],
|
|
74
|
+
entry: TranscriptEntry,
|
|
75
|
+
textWidth: number,
|
|
76
|
+
options: {
|
|
77
|
+
hint: string
|
|
78
|
+
renderDetailLine: (text: string) => TranscriptPart[]
|
|
79
|
+
}
|
|
80
|
+
): TranscriptLine[] {
|
|
81
|
+
if (entry.expanded) {
|
|
82
|
+
const detailLines = entry.detailText!
|
|
83
|
+
.split("\n")
|
|
84
|
+
.flatMap((rawLine, index) =>
|
|
85
|
+
wrapText(rawLine, textWidth - 2).map((text, wrapIndex) => ({
|
|
86
|
+
id: `${entry.id}-detail-${index}-${wrapIndex}`,
|
|
87
|
+
kind: entry.kind,
|
|
88
|
+
label: "",
|
|
89
|
+
parts: options.renderDetailLine(text),
|
|
90
|
+
}))
|
|
91
|
+
)
|
|
92
|
+
return [...lines, ...detailLines]
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
lines.push({
|
|
96
|
+
id: `${entry.id}-expand-hint`,
|
|
97
|
+
kind: entry.kind,
|
|
98
|
+
label: "",
|
|
99
|
+
parts: [{ text: options.hint, color: "gray", dimColor: true }],
|
|
50
100
|
})
|
|
101
|
+
return lines
|
|
51
102
|
}
|
|
52
103
|
|
|
53
104
|
function trimTrailingBlankLines(lines: Array<{ parts: TranscriptPart[] }>) {
|
|
@@ -156,6 +207,97 @@ function renderMarkdownLines(value: string, width: number) {
|
|
|
156
207
|
return lines
|
|
157
208
|
}
|
|
158
209
|
|
|
210
|
+
function parseCodexFeedParts(kind: TranscriptEntryKind, label: string, text: string): TranscriptPart[] {
|
|
211
|
+
if (kind === "meta" && label === "diff") {
|
|
212
|
+
return parseCodexDiffParts(text)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (kind === "tool") {
|
|
216
|
+
const match = text.match(/^([…✓✗])\s+(.*)$/)
|
|
217
|
+
if (match) {
|
|
218
|
+
const glyph = match[1]
|
|
219
|
+
const body = match[2] ?? ""
|
|
220
|
+
const glyphColor =
|
|
221
|
+
glyph === "✓" ? "green" : glyph === "✗" ? "red" : ("yellow" as const)
|
|
222
|
+
const bodyParts = parseCodexToolBodyParts(body)
|
|
223
|
+
return [{ text: `${glyph} `, color: glyphColor, bold: true }, ...bodyParts]
|
|
224
|
+
}
|
|
225
|
+
return parseCodexToolBodyParts(text)
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (kind === "status" || (kind === "meta" && label === "done")) {
|
|
229
|
+
if (text.startsWith("→ ")) {
|
|
230
|
+
return [{ text, color: "cyan" }]
|
|
231
|
+
}
|
|
232
|
+
if (text.startsWith("…")) {
|
|
233
|
+
return [{ text, color: "gray", dimColor: true }]
|
|
234
|
+
}
|
|
235
|
+
if (text.startsWith("✓")) {
|
|
236
|
+
return [{ text, color: "green" }]
|
|
237
|
+
}
|
|
238
|
+
if (text.startsWith("✗")) {
|
|
239
|
+
return [{ text, color: "red" }]
|
|
240
|
+
}
|
|
241
|
+
if (text.startsWith("○")) {
|
|
242
|
+
return [{ text, color: "yellow" }]
|
|
243
|
+
}
|
|
244
|
+
if (text.startsWith("●")) {
|
|
245
|
+
return [{ text, color: "cyan", bold: true }]
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (kind === "status" && label === "think") {
|
|
250
|
+
if (text.startsWith("…")) {
|
|
251
|
+
return [{ text, color: "gray", dimColor: true }]
|
|
252
|
+
}
|
|
253
|
+
if (text.startsWith("✓")) {
|
|
254
|
+
return [{ text, color: "green" }]
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (kind === "meta") {
|
|
259
|
+
if (text.startsWith("✓ completed")) {
|
|
260
|
+
return [{ text, color: "green", bold: true }]
|
|
261
|
+
}
|
|
262
|
+
if (text.startsWith("deliverables")) {
|
|
263
|
+
return [{ text, color: "cyan" }]
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return [{ text }]
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function parseCodexToolBodyParts(body: string): TranscriptPart[] {
|
|
271
|
+
if (body.startsWith("+ create")) {
|
|
272
|
+
return [{ text: body, color: "green" }]
|
|
273
|
+
}
|
|
274
|
+
if (body.startsWith("~ modify")) {
|
|
275
|
+
return [{ text: body, color: "yellow" }]
|
|
276
|
+
}
|
|
277
|
+
if (body.startsWith("- delete")) {
|
|
278
|
+
return [{ text: body, color: "red" }]
|
|
279
|
+
}
|
|
280
|
+
if (body.startsWith("▸")) {
|
|
281
|
+
return [{ text: body, color: "magenta" }]
|
|
282
|
+
}
|
|
283
|
+
return [{ text: body }]
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function parseCodexDiffParts(text: string): TranscriptPart[] {
|
|
287
|
+
const trimmed = text.trim()
|
|
288
|
+
if (trimmed === "…") {
|
|
289
|
+
return [{ text: " …", color: "gray", dimColor: true }]
|
|
290
|
+
}
|
|
291
|
+
const line = text.startsWith(" ") ? text : ` ${text}`
|
|
292
|
+
if (line.startsWith(" - ")) {
|
|
293
|
+
return [{ text: line, color: "red" }]
|
|
294
|
+
}
|
|
295
|
+
if (line.startsWith(" + ")) {
|
|
296
|
+
return [{ text: line, color: "green" }]
|
|
297
|
+
}
|
|
298
|
+
return [{ text: line, color: "gray", dimColor: true }]
|
|
299
|
+
}
|
|
300
|
+
|
|
159
301
|
function wrapText(value: string, width: number) {
|
|
160
302
|
const lines: string[] = []
|
|
161
303
|
|