@patze/code-cli 0.20.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.
- package/CHANGELOG.md +119 -0
- package/VERSION +1 -1
- package/dist/backend/agent-trace.d.ts +5 -0
- package/dist/backend/agent-trace.d.ts.map +1 -1
- package/dist/backend/agent-trace.js +14 -0
- package/dist/backend/agent-trace.js.map +1 -1
- package/dist/backend/cancel-client.d.ts +19 -0
- package/dist/backend/cancel-client.d.ts.map +1 -0
- package/dist/backend/cancel-client.js +45 -0
- package/dist/backend/cancel-client.js.map +1 -0
- package/dist/backend/execute-client.d.ts +4 -0
- package/dist/backend/execute-client.d.ts.map +1 -1
- package/dist/backend/execute-client.js +4 -0
- package/dist/backend/execute-client.js.map +1 -1
- package/dist/backend/preview-payload.d.ts +6 -0
- package/dist/backend/preview-payload.d.ts.map +1 -1
- package/dist/backend/preview-payload.js +9 -0
- package/dist/backend/preview-payload.js.map +1 -1
- package/dist/backend/run-record.d.ts +4 -0
- package/dist/backend/run-record.d.ts.map +1 -1
- package/dist/backend/run-record.js +24 -1
- package/dist/backend/run-record.js.map +1 -1
- package/dist/backend/run-stream-client.d.ts +6 -0
- package/dist/backend/run-stream-client.d.ts.map +1 -1
- package/dist/backend/run-stream-client.js +10 -0
- package/dist/backend/run-stream-client.js.map +1 -1
- package/dist/cli/commands/agent.d.ts.map +1 -1
- package/dist/cli/commands/agent.js +19 -22
- package/dist/cli/commands/agent.js.map +1 -1
- package/dist/cli/commands/exec.d.ts +5 -0
- package/dist/cli/commands/exec.d.ts.map +1 -0
- package/dist/cli/commands/exec.js +115 -0
- package/dist/cli/commands/exec.js.map +1 -0
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/interactive/agent-activity.d.ts +11 -0
- package/dist/cli/interactive/agent-activity.d.ts.map +1 -0
- package/dist/cli/interactive/agent-activity.js +41 -0
- package/dist/cli/interactive/agent-activity.js.map +1 -0
- package/dist/cli/interactive/agent-event-feed.d.ts +21 -0
- package/dist/cli/interactive/agent-event-feed.d.ts.map +1 -0
- package/dist/cli/interactive/agent-event-feed.js +205 -0
- package/dist/cli/interactive/agent-event-feed.js.map +1 -0
- package/dist/cli/interactive/agent-event-parse.d.ts +4 -0
- package/dist/cli/interactive/agent-event-parse.d.ts.map +1 -0
- package/dist/cli/interactive/agent-event-parse.js +92 -0
- package/dist/cli/interactive/agent-event-parse.js.map +1 -0
- package/dist/cli/interactive/agent-events.d.ts +14 -1
- package/dist/cli/interactive/agent-events.d.ts.map +1 -1
- package/dist/cli/interactive/agent-events.js +46 -4
- package/dist/cli/interactive/agent-events.js.map +1 -1
- package/dist/cli/interactive/agent-execute-turn.d.ts +5 -0
- package/dist/cli/interactive/agent-execute-turn.d.ts.map +1 -1
- package/dist/cli/interactive/agent-execute-turn.js +167 -119
- package/dist/cli/interactive/agent-execute-turn.js.map +1 -1
- package/dist/cli/interactive/agent-stream-format.d.ts +5 -1
- package/dist/cli/interactive/agent-stream-format.d.ts.map +1 -1
- package/dist/cli/interactive/agent-stream-format.js +89 -26
- package/dist/cli/interactive/agent-stream-format.js.map +1 -1
- package/dist/cli/interactive/agent-turn.d.ts +4 -0
- package/dist/cli/interactive/agent-turn.d.ts.map +1 -1
- package/dist/cli/interactive/agent-turn.js +9 -0
- package/dist/cli/interactive/agent-turn.js.map +1 -1
- package/dist/cli/interactive/composer-chrome.d.ts +20 -0
- package/dist/cli/interactive/composer-chrome.d.ts.map +1 -0
- package/dist/cli/interactive/composer-chrome.js +77 -0
- package/dist/cli/interactive/composer-chrome.js.map +1 -0
- package/dist/cli/interactive/composer-keys.d.ts +2 -1
- package/dist/cli/interactive/composer-keys.d.ts.map +1 -1
- package/dist/cli/interactive/composer-keys.js +9 -2
- package/dist/cli/interactive/composer-keys.js.map +1 -1
- package/dist/cli/interactive/composer-session-chrome.d.ts +4 -0
- package/dist/cli/interactive/composer-session-chrome.d.ts.map +1 -0
- package/dist/cli/interactive/composer-session-chrome.js +22 -0
- package/dist/cli/interactive/composer-session-chrome.js.map +1 -0
- package/dist/cli/interactive/cookbook-feed-writer.d.ts +13 -0
- package/dist/cli/interactive/cookbook-feed-writer.d.ts.map +1 -0
- package/dist/cli/interactive/cookbook-feed-writer.js +87 -0
- package/dist/cli/interactive/cookbook-feed-writer.js.map +1 -0
- package/dist/cli/interactive/cookbook-tool-feed.d.ts +13 -0
- package/dist/cli/interactive/cookbook-tool-feed.d.ts.map +1 -0
- package/dist/cli/interactive/cookbook-tool-feed.js +67 -0
- package/dist/cli/interactive/cookbook-tool-feed.js.map +1 -0
- package/dist/cli/interactive/feed-run-stats.d.ts +9 -0
- package/dist/cli/interactive/feed-run-stats.d.ts.map +1 -0
- package/dist/cli/interactive/feed-run-stats.js +51 -0
- package/dist/cli/interactive/feed-run-stats.js.map +1 -0
- package/dist/cli/interactive/header.d.ts +10 -2
- package/dist/cli/interactive/header.d.ts.map +1 -1
- package/dist/cli/interactive/header.js +74 -4
- package/dist/cli/interactive/header.js.map +1 -1
- package/dist/cli/interactive/json-agent-stream.d.ts +8 -0
- package/dist/cli/interactive/json-agent-stream.d.ts.map +1 -0
- package/dist/cli/interactive/json-agent-stream.js +14 -0
- package/dist/cli/interactive/json-agent-stream.js.map +1 -0
- package/dist/cli/interactive/line-editor.d.ts +9 -0
- package/dist/cli/interactive/line-editor.d.ts.map +1 -1
- package/dist/cli/interactive/line-editor.js +76 -6
- package/dist/cli/interactive/line-editor.js.map +1 -1
- package/dist/cli/interactive/model-command.d.ts.map +1 -1
- package/dist/cli/interactive/model-command.js +37 -3
- package/dist/cli/interactive/model-command.js.map +1 -1
- package/dist/cli/interactive/opentui-agent-event.d.ts +10 -0
- package/dist/cli/interactive/opentui-agent-event.d.ts.map +1 -0
- package/dist/cli/interactive/opentui-agent-event.js +12 -0
- package/dist/cli/interactive/opentui-agent-event.js.map +1 -0
- package/dist/cli/interactive/plain-agent-render.d.ts.map +1 -1
- package/dist/cli/interactive/plain-agent-render.js +2 -0
- package/dist/cli/interactive/plain-agent-render.js.map +1 -1
- package/dist/cli/interactive/run-replay.d.ts.map +1 -1
- package/dist/cli/interactive/run-replay.js +3 -0
- package/dist/cli/interactive/run-replay.js.map +1 -1
- package/dist/cli/interactive/session-controller.d.ts +4 -0
- package/dist/cli/interactive/session-controller.d.ts.map +1 -1
- package/dist/cli/interactive/session-controller.js +26 -2
- package/dist/cli/interactive/session-controller.js.map +1 -1
- package/dist/cli/interactive/session-store.d.ts +3 -0
- package/dist/cli/interactive/session-store.d.ts.map +1 -1
- package/dist/cli/interactive/session-store.js +3 -0
- package/dist/cli/interactive/session-store.js.map +1 -1
- package/dist/cli/interactive/session.d.ts +19 -0
- package/dist/cli/interactive/session.d.ts.map +1 -1
- package/dist/cli/interactive/session.js +44 -0
- 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 +22 -2
- package/dist/cli/interactive/shell.js.map +1 -1
- package/dist/cli/interactive/slash-dispatch.d.ts +3 -0
- package/dist/cli/interactive/slash-dispatch.d.ts.map +1 -1
- package/dist/cli/interactive/slash-dispatch.js +3 -0
- package/dist/cli/interactive/slash-dispatch.js.map +1 -1
- package/dist/cli/interactive/trace-glyphs.d.ts +14 -0
- package/dist/cli/interactive/trace-glyphs.d.ts.map +1 -0
- package/dist/cli/interactive/trace-glyphs.js +230 -0
- package/dist/cli/interactive/trace-glyphs.js.map +1 -0
- package/dist/cli/interactive/transcript-line-parse.js +2 -2
- package/dist/cli/interactive/transcript-line-parse.js.map +1 -1
- package/dist/cli/interactive/transcript-upsert.d.ts.map +1 -1
- package/dist/cli/interactive/transcript-upsert.js +25 -4
- package/dist/cli/interactive/transcript-upsert.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +5 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/config/model-preferences.d.ts +13 -0
- package/dist/config/model-preferences.d.ts.map +1 -0
- package/dist/config/model-preferences.js +50 -0
- package/dist/config/model-preferences.js.map +1 -0
- package/dist/config/models.d.ts +2 -1
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +5 -2
- package/dist/config/models.js.map +1 -1
- package/opentui/src/App.tsx +202 -80
- package/package.json +1 -1
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE3E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type ModelPreferenceKey = "thinking" | "fast";
|
|
2
|
+
export type ModelPreferences = {
|
|
3
|
+
thinking: boolean | null;
|
|
4
|
+
fast: boolean | null;
|
|
5
|
+
};
|
|
6
|
+
export declare function resolveModelPreferenceToggle(current: boolean | null, token: string): boolean | null;
|
|
7
|
+
export declare function formatModelPreferenceLabel(key: ModelPreferenceKey, value: boolean | null): string;
|
|
8
|
+
export declare function formatModelDisplay(model: string, prefs: ModelPreferences, cursorAgentId?: string | null): string;
|
|
9
|
+
export declare function modelPreferencesToMetadata(prefs: ModelPreferences): {
|
|
10
|
+
model_thinking?: string;
|
|
11
|
+
model_fast?: string;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=model-preferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-preferences.d.ts","sourceRoot":"","sources":["../../src/config/model-preferences.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,CAAA;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;CACrB,CAAA;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,OAAO,GAAG,IAAI,EACvB,KAAK,EAAE,MAAM,GACZ,OAAO,GAAG,IAAI,CAkBhB;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAKjG;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,EACvB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,MAAM,CAaR;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG;IACnE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CASA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export function resolveModelPreferenceToggle(current, token) {
|
|
2
|
+
const normalized = token.trim().toLowerCase();
|
|
3
|
+
if (normalized === "toggle") {
|
|
4
|
+
if (current === null) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
return !current;
|
|
8
|
+
}
|
|
9
|
+
if (normalized === "on" || normalized === "true" || normalized === "1") {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (normalized === "off" || normalized === "false" || normalized === "0") {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (normalized === "clear") {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return current;
|
|
19
|
+
}
|
|
20
|
+
export function formatModelPreferenceLabel(key, value) {
|
|
21
|
+
if (value === null) {
|
|
22
|
+
return `${key}: auto`;
|
|
23
|
+
}
|
|
24
|
+
return `${key}: ${value ? "on" : "off"}`;
|
|
25
|
+
}
|
|
26
|
+
export function formatModelDisplay(model, prefs, cursorAgentId) {
|
|
27
|
+
const parts = [model];
|
|
28
|
+
if (prefs.thinking !== null) {
|
|
29
|
+
parts.push(prefs.thinking ? "think" : "no-think");
|
|
30
|
+
}
|
|
31
|
+
if (prefs.fast !== null) {
|
|
32
|
+
parts.push(prefs.fast ? "fast" : "no-fast");
|
|
33
|
+
}
|
|
34
|
+
const agent = cursorAgentId?.trim();
|
|
35
|
+
if (agent) {
|
|
36
|
+
parts.push(`agent:${agent.length > 10 ? `${agent.slice(0, 8)}…` : agent}`);
|
|
37
|
+
}
|
|
38
|
+
return parts.join(" · ");
|
|
39
|
+
}
|
|
40
|
+
export function modelPreferencesToMetadata(prefs) {
|
|
41
|
+
const metadata = {};
|
|
42
|
+
if (prefs.thinking !== null) {
|
|
43
|
+
metadata.model_thinking = prefs.thinking ? "true" : "false";
|
|
44
|
+
}
|
|
45
|
+
if (prefs.fast !== null) {
|
|
46
|
+
metadata.model_fast = prefs.fast ? "true" : "false";
|
|
47
|
+
}
|
|
48
|
+
return metadata;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=model-preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-preferences.js","sourceRoot":"","sources":["../../src/config/model-preferences.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,4BAA4B,CAC1C,OAAuB,EACvB,KAAa;IAEb,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC7C,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,CAAC,OAAO,CAAA;IACjB,CAAC;IACD,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACzE,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAuB,EAAE,KAAqB;IACvF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,GAAG,GAAG,QAAQ,CAAA;IACvB,CAAC;IACD,OAAO,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,KAAuB,EACvB,aAA6B;IAE7B,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAA;IACrB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IACnD,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,EAAE,IAAI,EAAE,CAAA;IACnC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IAC5E,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAuB;IAIhE,MAAM,QAAQ,GAAqD,EAAE,CAAA;IACrE,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,QAAQ,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;IAC7D,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,QAAQ,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;IACrD,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
package/dist/config/models.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ModelPreferences } from "./model-preferences.js";
|
|
1
2
|
export declare const DEFAULT_PATZE_MODEL = "composer-2.5-fast";
|
|
2
3
|
/** Models aligned with server PATZE_CODE_CURSOR_MODEL_FALLBACKS + cookbook defaults. */
|
|
3
4
|
export declare const PATZE_SUPPORTED_MODELS: readonly string[];
|
|
@@ -7,5 +8,5 @@ export declare function resolveEffectiveModel(input: {
|
|
|
7
8
|
sessionOverride?: string | null;
|
|
8
9
|
configModel?: string | null;
|
|
9
10
|
}): string;
|
|
10
|
-
export declare function formatModelPickerLines(current: string): string[];
|
|
11
|
+
export declare function formatModelPickerLines(current: string, prefs?: ModelPreferences): string[];
|
|
11
12
|
//# sourceMappingURL=models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/config/models.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,sBAAsB,CAAA;AAEtD,wFAAwF;AACxF,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAMnD,CAAA;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAQhF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMzD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,GAAG,MAAM,CAcT;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/config/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,eAAO,MAAM,mBAAmB,sBAAsB,CAAA;AAEtD,wFAAwF;AACxF,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EAMnD,CAAA;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAQhF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMzD;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,GAAG,MAAM,CAcT;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAiB1F"}
|
package/dist/config/models.js
CHANGED
|
@@ -38,14 +38,17 @@ export function resolveEffectiveModel(input) {
|
|
|
38
38
|
}
|
|
39
39
|
return DEFAULT_PATZE_MODEL;
|
|
40
40
|
}
|
|
41
|
-
export function formatModelPickerLines(current) {
|
|
41
|
+
export function formatModelPickerLines(current, prefs) {
|
|
42
42
|
const lines = [`Model · current: ${current}`, ""];
|
|
43
|
+
if (prefs) {
|
|
44
|
+
lines.push(` thinking ${prefs.thinking === null ? "auto" : prefs.thinking ? "on" : "off"} · fast ${prefs.fast === null ? "auto" : prefs.fast ? "on" : "off"}`, "");
|
|
45
|
+
}
|
|
43
46
|
for (const model of PATZE_SUPPORTED_MODELS) {
|
|
44
47
|
const marker = model.toLowerCase() === current.toLowerCase() ? "›" : " ";
|
|
45
48
|
lines.push(` ${marker} ${model}`);
|
|
46
49
|
}
|
|
47
50
|
lines.push("");
|
|
48
|
-
lines.push("Usage: /model <id> · /model clear");
|
|
51
|
+
lines.push("Usage: /model <id> · /model thinking on|off · /model fast on|off · /model clear");
|
|
49
52
|
return lines;
|
|
50
53
|
}
|
|
51
54
|
//# sourceMappingURL=models.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/config/models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/config/models.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAA;AAEtD,wFAAwF;AACxF,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,mBAAmB;IACnB,cAAc;IACd,YAAY;IACZ,cAAc;IACd,SAAS;CACV,CAAA;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAgC;IAC/D,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAA;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IACnC,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAA;IACnF,OAAO,KAAK,IAAI,OAAO,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;IAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA;AACjG,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAGrC;IACC,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IAC3D,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC9D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IACtD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAA;IACnB,CAAC;IACD,OAAO,mBAAmB,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,KAAwB;IAC9E,MAAM,KAAK,GAAG,CAAC,oBAAoB,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CACR,cAAc,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,WAC5E,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KACrD,EAAE,EACF,EAAE,CACH,CAAA;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,sBAAsB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QACxE,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC,CAAA;IACpC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAA;IAC7F,OAAO,KAAK,CAAA;AACd,CAAC"}
|
package/opentui/src/App.tsx
CHANGED
|
@@ -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,6 +22,8 @@ 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"
|
|
25
|
+
import { applyOpenTuiAgentEvent } from "../../dist/cli/interactive/opentui-agent-event.js"
|
|
26
|
+
import type { AgentEvent } from "../../dist/cli/interactive/agent-events.js"
|
|
26
27
|
|
|
27
28
|
extend({ "tui-input": InputRenderable })
|
|
28
29
|
|
|
@@ -56,6 +57,10 @@ type InteractiveController = {
|
|
|
56
57
|
session: {
|
|
57
58
|
getModelOverride: () => string | null
|
|
58
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
|
|
59
64
|
getExecutionMode: () => "local" | "cloud"
|
|
60
65
|
snapshot: () => Array<{ input: string; lines: string[] }>
|
|
61
66
|
}
|
|
@@ -65,7 +70,12 @@ type InteractiveController = {
|
|
|
65
70
|
processLine: (
|
|
66
71
|
rawLine: string,
|
|
67
72
|
output: { line: (text?: string) => void },
|
|
68
|
-
context?: {
|
|
73
|
+
context?: {
|
|
74
|
+
signal?: AbortSignal
|
|
75
|
+
onActivity?: (label: string | null) => void
|
|
76
|
+
useActivitySpinner?: boolean
|
|
77
|
+
onAgentEvent?: (event: AgentEvent) => void
|
|
78
|
+
}
|
|
69
79
|
) => Promise<{ exitShell: boolean; exitCode: number; streamed?: boolean }>
|
|
70
80
|
}
|
|
71
81
|
|
|
@@ -92,16 +102,21 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
92
102
|
const [ready, setReady] = useState(false)
|
|
93
103
|
const [bootError, setBootError] = useState<string | null>(null)
|
|
94
104
|
const [busy, setBusy] = useState(false)
|
|
105
|
+
const [activityLabel, setActivityLabel] = useState<string | null>(null)
|
|
106
|
+
const [activityFrame, setActivityFrame] = useState(0)
|
|
95
107
|
const [input, setInput] = useState("")
|
|
96
108
|
const [mode, setMode] = useState<ViewMode>("input")
|
|
97
109
|
const [modelSearch, setModelSearch] = useState("")
|
|
98
110
|
const [scrollOffset, setScrollOffset] = useState(0)
|
|
99
111
|
const [transcript, setTranscript] = useState<TranscriptEntry[]>([])
|
|
100
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)
|
|
101
115
|
const [executionMode, setExecutionMode] = useState<"local" | "cloud">("local")
|
|
102
116
|
const [executionTarget, setExecutionTarget] = useState<string | null>(null)
|
|
103
117
|
const [supportedModels, setSupportedModels] = useState<string[]>([])
|
|
104
118
|
const [slashMenuReady, setSlashMenuReady] = useState(false)
|
|
119
|
+
const [startupHeader, setStartupHeader] = useState<string[]>([])
|
|
105
120
|
|
|
106
121
|
const followTranscript = useCallback(() => {
|
|
107
122
|
if (scrollPinnedRef.current) {
|
|
@@ -185,6 +200,14 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
185
200
|
streamingIdRef.current = null
|
|
186
201
|
}, [])
|
|
187
202
|
|
|
203
|
+
const openTuiStreamHandlers = useMemo(
|
|
204
|
+
() => ({
|
|
205
|
+
onAssistantDelta: upsertStreaming,
|
|
206
|
+
onClearAssistantStream: clearStreaming,
|
|
207
|
+
}),
|
|
208
|
+
[clearStreaming, upsertStreaming]
|
|
209
|
+
)
|
|
210
|
+
|
|
188
211
|
const refreshStatusMeta = useCallback(async () => {
|
|
189
212
|
const controller = controllerRef.current
|
|
190
213
|
if (!controller) {
|
|
@@ -204,7 +227,26 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
204
227
|
})
|
|
205
228
|
)
|
|
206
229
|
setExecutionMode(controller.session.getExecutionMode())
|
|
207
|
-
|
|
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)
|
|
208
250
|
|
|
209
251
|
const cloudGit = await importPatzeDist<
|
|
210
252
|
typeof import("../../dist/cli/interactive/cloud-git.js")
|
|
@@ -219,6 +261,18 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
219
261
|
}
|
|
220
262
|
}, [])
|
|
221
263
|
|
|
264
|
+
useEffect(() => {
|
|
265
|
+
if (!activityLabel) {
|
|
266
|
+
return
|
|
267
|
+
}
|
|
268
|
+
const timer = setInterval(() => {
|
|
269
|
+
setActivityFrame((frame) => frame + 1)
|
|
270
|
+
}, 80)
|
|
271
|
+
return () => {
|
|
272
|
+
clearInterval(timer)
|
|
273
|
+
}
|
|
274
|
+
}, [activityLabel])
|
|
275
|
+
|
|
222
276
|
useEffect(() => {
|
|
223
277
|
let cancelled = false
|
|
224
278
|
|
|
@@ -233,10 +287,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
233
287
|
const controller = (await sessionMod.prepareInteractiveController({
|
|
234
288
|
cwd,
|
|
235
289
|
interactive: true,
|
|
236
|
-
streamPartials:
|
|
237
|
-
onPartial: (chunk: string) => {
|
|
238
|
-
upsertStreaming(chunk)
|
|
239
|
-
},
|
|
290
|
+
streamPartials: false,
|
|
240
291
|
})) as InteractiveController
|
|
241
292
|
|
|
242
293
|
if (cancelled) {
|
|
@@ -244,21 +295,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
244
295
|
}
|
|
245
296
|
|
|
246
297
|
controllerRef.current = controller
|
|
247
|
-
|
|
248
|
-
const headerEntries = controller.renderHeaderLines().flatMap((line) => {
|
|
249
|
-
const parsed = parseTranscriptLine(line)
|
|
250
|
-
if (!parsed || parsed.continuation) {
|
|
251
|
-
return []
|
|
252
|
-
}
|
|
253
|
-
return [
|
|
254
|
-
{
|
|
255
|
-
id: nextId(),
|
|
256
|
-
kind: "meta" as const,
|
|
257
|
-
label: parsed.label || "info",
|
|
258
|
-
text: parsed.text || line,
|
|
259
|
-
},
|
|
260
|
-
]
|
|
261
|
-
})
|
|
298
|
+
setStartupHeader(controller.renderHeaderLines())
|
|
262
299
|
|
|
263
300
|
const restored: TranscriptEntry[] = []
|
|
264
301
|
for (const turn of controller.session.snapshot()) {
|
|
@@ -273,7 +310,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
273
310
|
}
|
|
274
311
|
}
|
|
275
312
|
|
|
276
|
-
setTranscript(
|
|
313
|
+
setTranscript(restored)
|
|
277
314
|
await refreshStatusMeta()
|
|
278
315
|
setReady(true)
|
|
279
316
|
} catch (error) {
|
|
@@ -285,7 +322,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
285
322
|
return () => {
|
|
286
323
|
cancelled = true
|
|
287
324
|
}
|
|
288
|
-
}, [cwd, nextId, refreshStatusMeta
|
|
325
|
+
}, [cwd, nextId, refreshStatusMeta])
|
|
289
326
|
|
|
290
327
|
const exitApp = useCallback(() => {
|
|
291
328
|
controllerRef.current?.persistSession()
|
|
@@ -299,15 +336,17 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
299
336
|
return
|
|
300
337
|
}
|
|
301
338
|
|
|
302
|
-
const value = rawLine
|
|
339
|
+
const value = trimComposerPrompt(rawLine)
|
|
303
340
|
if (!value) {
|
|
304
341
|
return
|
|
305
342
|
}
|
|
306
343
|
|
|
307
344
|
setBusy(true)
|
|
345
|
+
setActivityLabel(null)
|
|
308
346
|
clearStreaming()
|
|
309
347
|
markScrollPinned()
|
|
310
348
|
|
|
349
|
+
const turnAssistantId = nextId()
|
|
311
350
|
const abort = new AbortController()
|
|
312
351
|
activeAbortRef.current = abort
|
|
313
352
|
|
|
@@ -325,7 +364,18 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
325
364
|
})
|
|
326
365
|
|
|
327
366
|
try {
|
|
328
|
-
const result = await controller.processLine(value, sink, {
|
|
367
|
+
const result = await controller.processLine(value, sink, {
|
|
368
|
+
signal: abort.signal,
|
|
369
|
+
onActivity: setActivityLabel,
|
|
370
|
+
useActivitySpinner: false,
|
|
371
|
+
onAgentEvent: (event) => {
|
|
372
|
+
setActivityLabel(null)
|
|
373
|
+
setTranscript((items) =>
|
|
374
|
+
applyOpenTuiAgentEvent(items, event, turnAssistantId, openTuiStreamHandlers)
|
|
375
|
+
)
|
|
376
|
+
followTranscript()
|
|
377
|
+
},
|
|
378
|
+
})
|
|
329
379
|
if (result.streamed) {
|
|
330
380
|
clearStreaming()
|
|
331
381
|
}
|
|
@@ -336,6 +386,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
336
386
|
} finally {
|
|
337
387
|
activeAbortRef.current = null
|
|
338
388
|
setBusy(false)
|
|
389
|
+
setActivityLabel(null)
|
|
339
390
|
clearStreaming()
|
|
340
391
|
}
|
|
341
392
|
},
|
|
@@ -347,6 +398,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
347
398
|
followTranscript,
|
|
348
399
|
markScrollPinned,
|
|
349
400
|
nextId,
|
|
401
|
+
openTuiStreamHandlers,
|
|
350
402
|
refreshStatusMeta,
|
|
351
403
|
upsertTranscriptLine,
|
|
352
404
|
upsertStreaming,
|
|
@@ -358,6 +410,23 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
358
410
|
setMode("model")
|
|
359
411
|
}, [])
|
|
360
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
|
+
|
|
361
430
|
const runCommand = useCallback(
|
|
362
431
|
async (rawCommand: string) => {
|
|
363
432
|
const trimmed = rawCommand.trim()
|
|
@@ -398,7 +467,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
398
467
|
|
|
399
468
|
const submitInput = useCallback(
|
|
400
469
|
(value: string) => {
|
|
401
|
-
const prompt = value
|
|
470
|
+
const prompt = trimComposerPrompt(value)
|
|
402
471
|
setInput("")
|
|
403
472
|
|
|
404
473
|
if (!prompt || busy) {
|
|
@@ -440,41 +509,26 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
440
509
|
const modelSelectRows = Math.min(8, Math.max(3, rows - 10))
|
|
441
510
|
const commandPanelRows = 2 + commandSelectRows
|
|
442
511
|
const modelPanelRows = 3 + modelSelectRows
|
|
512
|
+
const headerRows = Math.max(1, startupHeader.length)
|
|
513
|
+
const composerChromeRows = 5
|
|
514
|
+
const bottomHintRows = 1
|
|
443
515
|
|
|
444
516
|
const transcriptViewportRows = Math.max(
|
|
445
517
|
4,
|
|
446
|
-
rows -
|
|
518
|
+
rows -
|
|
519
|
+
headerRows -
|
|
520
|
+
bottomHintRows -
|
|
521
|
+
(mode === "model"
|
|
522
|
+
? modelPanelRows + 2
|
|
523
|
+
: mode === "command"
|
|
524
|
+
? commandPanelRows + 2
|
|
525
|
+
: composerChromeRows)
|
|
447
526
|
)
|
|
448
527
|
|
|
449
|
-
const
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
id: "status-mode",
|
|
454
|
-
kind: "meta" as const,
|
|
455
|
-
label: "mode",
|
|
456
|
-
text: executionMode,
|
|
457
|
-
},
|
|
458
|
-
...(executionTarget
|
|
459
|
-
? [
|
|
460
|
-
{
|
|
461
|
-
id: "status-target",
|
|
462
|
-
kind: "meta" as const,
|
|
463
|
-
label: "target",
|
|
464
|
-
text: executionTarget,
|
|
465
|
-
},
|
|
466
|
-
]
|
|
467
|
-
: []),
|
|
468
|
-
{
|
|
469
|
-
id: "status-model",
|
|
470
|
-
kind: "meta" as const,
|
|
471
|
-
label: "model",
|
|
472
|
-
text: currentModel,
|
|
473
|
-
},
|
|
474
|
-
...transcript,
|
|
475
|
-
],
|
|
476
|
-
[cwd, currentModel, executionMode, executionTarget, transcript]
|
|
477
|
-
)
|
|
528
|
+
const composerModelLabel = `${currentModel}${modelThinking ? " · thinking" : ""}${modelFast ? " · fast" : ""}`
|
|
529
|
+
const composerPathLabel = shortenComposerPath(cwd)
|
|
530
|
+
|
|
531
|
+
const scrollableEntries = useMemo(() => transcript, [transcript])
|
|
478
532
|
|
|
479
533
|
const transcriptLines = useMemo(
|
|
480
534
|
() => buildTranscriptLines(scrollableEntries, columns),
|
|
@@ -538,6 +592,10 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
538
592
|
if (mode === "model") {
|
|
539
593
|
if (key.name === "backspace" || key.name === "delete") {
|
|
540
594
|
setModelSearch((value) => value.slice(0, -1))
|
|
595
|
+
} else if (character === "T") {
|
|
596
|
+
toggleModelPreference("thinking")
|
|
597
|
+
} else if (character === "F") {
|
|
598
|
+
toggleModelPreference("fast")
|
|
541
599
|
} else if (isSearchInput(character)) {
|
|
542
600
|
setModelSearch((value) => `${value}${character}`)
|
|
543
601
|
}
|
|
@@ -553,6 +611,11 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
553
611
|
if (mode === "input") {
|
|
554
612
|
const pageSize = Math.max(1, transcriptViewportRows - 1)
|
|
555
613
|
|
|
614
|
+
if (key.shift && (key.name === "return" || key.name === "enter")) {
|
|
615
|
+
setInput((value) => `${value}\n`)
|
|
616
|
+
return
|
|
617
|
+
}
|
|
618
|
+
|
|
556
619
|
if (key.name === "up") {
|
|
557
620
|
markScrollUnpinned()
|
|
558
621
|
setScrollOffset((offset) => Math.min(maxScrollOffset, offset + 1))
|
|
@@ -613,6 +676,15 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
613
676
|
return createElement(
|
|
614
677
|
"box",
|
|
615
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,
|
|
616
688
|
createElement(
|
|
617
689
|
"box",
|
|
618
690
|
{ flexDirection: "column", height: transcriptViewportRows },
|
|
@@ -672,7 +744,7 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
672
744
|
attributes: TextAttributes.BOLD,
|
|
673
745
|
}),
|
|
674
746
|
createElement("text", {
|
|
675
|
-
content:
|
|
747
|
+
content: `Type to search · T thinking ${modelThinking ? "on" : "off"} · F fast ${modelFast ? "on" : "off"} · Enter choose · Escape cancel`,
|
|
676
748
|
fg: "gray",
|
|
677
749
|
}),
|
|
678
750
|
createElement("text", {
|
|
@@ -695,40 +767,90 @@ export function App({ cwd: cwdArg }: { cwd?: string }) {
|
|
|
695
767
|
border: true,
|
|
696
768
|
borderStyle: "single",
|
|
697
769
|
borderColor: busy ? "yellow" : "green",
|
|
770
|
+
flexDirection: "column",
|
|
698
771
|
marginTop: 1,
|
|
699
772
|
paddingX: 1,
|
|
700
773
|
},
|
|
701
|
-
createElement(
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
:
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
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,
|
|
721
808
|
})
|
|
722
809
|
),
|
|
723
810
|
createElement("text", {
|
|
724
811
|
content: busy
|
|
725
|
-
? "Esc exit · Ctrl+C cancel run ·
|
|
726
|
-
: "Esc exit · Ctrl+C quit ·
|
|
812
|
+
? "Esc exit · Ctrl+C cancel run · agent executing"
|
|
813
|
+
: "Esc exit · Ctrl+C quit · /diff · /approve · /apply when patch ready",
|
|
727
814
|
attributes: TextAttributes.DIM,
|
|
728
815
|
})
|
|
729
816
|
)
|
|
730
817
|
}
|
|
731
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
|
+
|
|
732
854
|
function TranscriptLine({ line }: { line: TranscriptLine }) {
|
|
733
855
|
const color = {
|
|
734
856
|
assistant: "white",
|