@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookbook-feed-writer.js","sourceRoot":"","sources":["../../../src/cli/interactive/cookbook-feed-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookbook coding-agent-cli tool row formatting (tui/App.tsx).
|
|
3
|
+
* @see https://github.com/cursor/cookbook/tree/main/sdk/coding-agent-cli/src/tui/App.tsx
|
|
4
|
+
*/
|
|
5
|
+
export declare function normalizeCookbookToolStatus(status: string): string;
|
|
6
|
+
export declare function formatCookbookToolStatus(status: string): string;
|
|
7
|
+
export declare function formatCookbookToolIcon(name: string): string;
|
|
8
|
+
export declare function formatCookbookToolFeedLine(input: {
|
|
9
|
+
name: string;
|
|
10
|
+
status: string;
|
|
11
|
+
params?: string;
|
|
12
|
+
}): string;
|
|
13
|
+
//# sourceMappingURL=cookbook-tool-feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookbook-tool-feed.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/cookbook-tool-feed.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAelE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAa/D;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA6B3D;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,GAAG,MAAM,CAST"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookbook coding-agent-cli tool row formatting (tui/App.tsx).
|
|
3
|
+
* @see https://github.com/cursor/cookbook/tree/main/sdk/coding-agent-cli/src/tui/App.tsx
|
|
4
|
+
*/
|
|
5
|
+
export function normalizeCookbookToolStatus(status) {
|
|
6
|
+
const normalized = status.trim().toLowerCase();
|
|
7
|
+
if (normalized === "done" || normalized === "completed") {
|
|
8
|
+
return "completed";
|
|
9
|
+
}
|
|
10
|
+
if (normalized === "error" || normalized === "failed") {
|
|
11
|
+
return "error";
|
|
12
|
+
}
|
|
13
|
+
if (normalized === "requested") {
|
|
14
|
+
return "requested";
|
|
15
|
+
}
|
|
16
|
+
if (normalized === "running" || normalized === "in_progress") {
|
|
17
|
+
return "running";
|
|
18
|
+
}
|
|
19
|
+
return normalized || "running";
|
|
20
|
+
}
|
|
21
|
+
export function formatCookbookToolStatus(status) {
|
|
22
|
+
switch (normalizeCookbookToolStatus(status)) {
|
|
23
|
+
case "requested":
|
|
24
|
+
return "[ ]";
|
|
25
|
+
case "running":
|
|
26
|
+
return "[~]";
|
|
27
|
+
case "completed":
|
|
28
|
+
return "[x]";
|
|
29
|
+
case "error":
|
|
30
|
+
return "[!]";
|
|
31
|
+
default:
|
|
32
|
+
return status.toLowerCase();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function formatCookbookToolIcon(name) {
|
|
36
|
+
const key = name.toLowerCase();
|
|
37
|
+
if (key.includes("read")) {
|
|
38
|
+
return "[R]";
|
|
39
|
+
}
|
|
40
|
+
if (key.includes("glob") || key.includes("grep") || key.includes("search")) {
|
|
41
|
+
return "[S]";
|
|
42
|
+
}
|
|
43
|
+
if (key.includes("shell") || key.includes("terminal") || key.includes("command")) {
|
|
44
|
+
return "$";
|
|
45
|
+
}
|
|
46
|
+
if (key.includes("edit") ||
|
|
47
|
+
key.includes("write") ||
|
|
48
|
+
key.includes("patch") ||
|
|
49
|
+
key.includes("delete")) {
|
|
50
|
+
return "[E]";
|
|
51
|
+
}
|
|
52
|
+
if (key.includes("todo") || key.includes("task")) {
|
|
53
|
+
return "[T]";
|
|
54
|
+
}
|
|
55
|
+
return "[*]";
|
|
56
|
+
}
|
|
57
|
+
export function formatCookbookToolFeedLine(input) {
|
|
58
|
+
return [
|
|
59
|
+
formatCookbookToolStatus(input.status),
|
|
60
|
+
formatCookbookToolIcon(input.name),
|
|
61
|
+
input.name,
|
|
62
|
+
input.params?.trim(),
|
|
63
|
+
]
|
|
64
|
+
.filter(Boolean)
|
|
65
|
+
.join(" ");
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=cookbook-tool-feed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookbook-tool-feed.js","sourceRoot":"","sources":["../../../src/cli/interactive/cookbook-tool-feed.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACxD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC9C,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QACxD,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACtD,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,OAAO,UAAU,IAAI,SAAS,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,QAAQ,2BAA2B,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,KAAK,SAAS;YACZ,OAAO,KAAK,CAAA;QACd,KAAK,WAAW;YACd,OAAO,KAAK,CAAA;QACd,KAAK,OAAO;YACV,OAAO,KAAK,CAAA;QACd;YACE,OAAO,MAAM,CAAC,WAAW,EAAE,CAAA;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAE9B,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3E,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjF,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,IACE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACtB,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAI1C;IACC,OAAO;QACL,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC;QACtC,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC;QAClC,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;KACrB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type RunEditStats = {
|
|
2
|
+
editCount: number;
|
|
3
|
+
linesAdded: number;
|
|
4
|
+
linesRemoved: number;
|
|
5
|
+
paths: string[];
|
|
6
|
+
};
|
|
7
|
+
export declare function summarizeRunEditStats(trace: unknown[]): RunEditStats;
|
|
8
|
+
export declare function formatRunEditStatsLine(stats: RunEditStats): string | null;
|
|
9
|
+
//# sourceMappingURL=feed-run-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed-run-stats.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/feed-run-stats.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,YAAY,CAoCpE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAazE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { parseAgentTraceItem } from "../../backend/agent-trace.js";
|
|
2
|
+
import { parseTraceEditMeta } from "./trace-glyphs.js";
|
|
3
|
+
export function summarizeRunEditStats(trace) {
|
|
4
|
+
const paths = new Set();
|
|
5
|
+
let editCount = 0;
|
|
6
|
+
let linesAdded = 0;
|
|
7
|
+
let linesRemoved = 0;
|
|
8
|
+
for (const item of trace) {
|
|
9
|
+
const event = parseAgentTraceItem(item);
|
|
10
|
+
if (!event || event.kind !== "tool") {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const meta = parseTraceEditMeta(event);
|
|
14
|
+
if (!meta.action && meta.linesAdded === undefined && meta.linesRemoved === undefined) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
editCount += 1;
|
|
18
|
+
linesAdded += meta.linesAdded ?? 0;
|
|
19
|
+
linesRemoved += meta.linesRemoved ?? 0;
|
|
20
|
+
const raw = item && typeof item === "object" ? item : null;
|
|
21
|
+
const path = raw && typeof raw.path === "string"
|
|
22
|
+
? raw.path
|
|
23
|
+
: raw && typeof raw.file === "string"
|
|
24
|
+
? raw.file
|
|
25
|
+
: "";
|
|
26
|
+
if (path.trim()) {
|
|
27
|
+
paths.add(path.trim());
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
editCount,
|
|
32
|
+
linesAdded,
|
|
33
|
+
linesRemoved,
|
|
34
|
+
paths: [...paths],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function formatRunEditStatsLine(stats) {
|
|
38
|
+
if (stats.editCount === 0 && stats.linesAdded === 0 && stats.linesRemoved === 0) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const parts = [`${stats.editCount} edit${stats.editCount === 1 ? "" : "s"}`];
|
|
42
|
+
if (stats.linesAdded > 0 || stats.linesRemoved > 0) {
|
|
43
|
+
parts.push(`+${stats.linesAdded}/-${stats.linesRemoved}`);
|
|
44
|
+
}
|
|
45
|
+
if (stats.paths.length > 0) {
|
|
46
|
+
const shown = stats.paths.slice(0, 2).join(", ");
|
|
47
|
+
parts.push(stats.paths.length > 2 ? `${shown}…` : shown);
|
|
48
|
+
}
|
|
49
|
+
return parts.join(" · ");
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=feed-run-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed-run-stats.js","sourceRoot":"","sources":["../../../src/cli/interactive/feed-run-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import type { PermissionMode } from "../../runtime/permissions.js";
|
|
2
2
|
import type { ExecutionMode } from "./session-store.js";
|
|
3
|
+
export type HeaderStyle = "compact" | "verbose";
|
|
3
4
|
export type HeaderOptions = {
|
|
4
5
|
width?: number;
|
|
5
6
|
color?: boolean;
|
|
7
|
+
style?: HeaderStyle;
|
|
6
8
|
};
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
+
export type HeaderSmartState = {
|
|
10
|
+
modelThinking?: boolean | null;
|
|
11
|
+
modelFast?: boolean | null;
|
|
12
|
+
cursorAgentId?: string | null;
|
|
13
|
+
};
|
|
14
|
+
export declare function buildContextualStartupTip(authReady: boolean, executionMode: ExecutionMode): string;
|
|
15
|
+
export declare function renderInteractiveHeader(cwd: string, permissionMode?: PermissionMode, modelOverride?: string | null, executionMode?: ExecutionMode, options?: HeaderOptions, smart?: HeaderSmartState): string[];
|
|
16
|
+
export declare const INTERACTIVE_PROMPT = "> ";
|
|
9
17
|
//# sourceMappingURL=header.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/header.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/header.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAUlE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAQvD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAA;AAE/C,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB,CAAA;AAoBD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B,CAAA;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,OAAO,EAClB,aAAa,EAAE,aAAa,GAC3B,MAAM,CAQR;AAED,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,cAAc,CAAC,EAAE,cAAc,EAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,EAC7B,aAAa,GAAE,aAAuB,EACtC,OAAO,GAAE,aAAkB,EAC3B,KAAK,GAAE,gBAAqB,GAC3B,MAAM,EAAE,CAoBV;AAiID,eAAO,MAAM,kBAAkB,OAAO,CAAA"}
|
|
@@ -5,6 +5,8 @@ import { resolveApproval } from "../../runtime/approvals.js";
|
|
|
5
5
|
import { resolveSandbox } from "../../runtime/sandbox.js";
|
|
6
6
|
import { guessWorkspaceRoot } from "../../runtime/workspace.js";
|
|
7
7
|
import { resolveEffectiveModel } from "../../config/models.js";
|
|
8
|
+
import { formatModelDisplay } from "../../config/model-preferences.js";
|
|
9
|
+
import { shortenPathForComposer } from "./composer-chrome.js";
|
|
8
10
|
import { CLI_VERSION } from "../../version.js";
|
|
9
11
|
import { renderCard } from "../ui/box.js";
|
|
10
12
|
const YELLOW = "\x1b[33m";
|
|
@@ -16,7 +18,72 @@ function detectColor() {
|
|
|
16
18
|
function detectWidth() {
|
|
17
19
|
return typeof process.stdout.columns === "number" ? process.stdout.columns : 0;
|
|
18
20
|
}
|
|
19
|
-
|
|
21
|
+
function resolveHeaderStyle(options) {
|
|
22
|
+
if (options.style) {
|
|
23
|
+
return options.style;
|
|
24
|
+
}
|
|
25
|
+
if (process.env.PATZE_HEADER_VERBOSE === "1") {
|
|
26
|
+
return "verbose";
|
|
27
|
+
}
|
|
28
|
+
return "compact";
|
|
29
|
+
}
|
|
30
|
+
export function buildContextualStartupTip(authReady, executionMode) {
|
|
31
|
+
if (!authReady) {
|
|
32
|
+
return "Tip: run `patze login <api> <token> [userId]` then `/status --check`";
|
|
33
|
+
}
|
|
34
|
+
if (executionMode === "cloud") {
|
|
35
|
+
return "Tip: cloud mode · `/local` for pinned cwd · `/model` to switch";
|
|
36
|
+
}
|
|
37
|
+
return 'Tip: patze "<task>" one-shot · `/model` to switch · `/help` for commands';
|
|
38
|
+
}
|
|
39
|
+
export function renderInteractiveHeader(cwd, permissionMode, modelOverride, executionMode = "local", options = {}, smart = {}) {
|
|
40
|
+
const style = resolveHeaderStyle(options);
|
|
41
|
+
if (style === "verbose") {
|
|
42
|
+
return renderVerboseInteractiveHeader(cwd, permissionMode, modelOverride, executionMode, options, smart);
|
|
43
|
+
}
|
|
44
|
+
return renderCompactInteractiveHeader(cwd, permissionMode, modelOverride, executionMode, options, smart);
|
|
45
|
+
}
|
|
46
|
+
function renderCompactInteractiveHeader(cwd, permissionMode, modelOverride, executionMode, options, smart) {
|
|
47
|
+
const color = options.color ?? detectColor();
|
|
48
|
+
const width = options.width ?? detectWidth();
|
|
49
|
+
const config = loadConfig(cwd);
|
|
50
|
+
const authReady = isAuthConfigured(config);
|
|
51
|
+
const workspace = guessWorkspaceRoot(cwd) || cwd;
|
|
52
|
+
const mode = permissionMode ?? "read-only";
|
|
53
|
+
const permission = getPermissionModeDef(mode).label;
|
|
54
|
+
const model = formatModelDisplay(resolveEffectiveModel({
|
|
55
|
+
sessionOverride: modelOverride,
|
|
56
|
+
configModel: config.model,
|
|
57
|
+
}), {
|
|
58
|
+
thinking: smart.modelThinking ?? null,
|
|
59
|
+
fast: smart.modelFast ?? null,
|
|
60
|
+
}, smart.cursorAgentId);
|
|
61
|
+
const card = renderCard({
|
|
62
|
+
title: `>_ Patze Code (v${CLI_VERSION})`,
|
|
63
|
+
rows: [
|
|
64
|
+
{ label: "model", value: `${model} /model to change` },
|
|
65
|
+
{ label: "directory", value: shortenPathForComposer(workspace, 52) || workspace },
|
|
66
|
+
{
|
|
67
|
+
label: "session",
|
|
68
|
+
value: `${permission} · ${executionMode}${authReady ? "" : " · auth incomplete"}`,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
width,
|
|
72
|
+
color,
|
|
73
|
+
minInnerWidth: 36,
|
|
74
|
+
});
|
|
75
|
+
const lines = [...card];
|
|
76
|
+
const tip = buildContextualStartupTip(authReady, executionMode);
|
|
77
|
+
lines.push(color ? `${DIM}${tip}${RESET}` : tip);
|
|
78
|
+
if (!authReady) {
|
|
79
|
+
const warn = "Heads up: auth incomplete — run `patze login` or set PATZE_CODE_* env";
|
|
80
|
+
lines.push(color ? `${YELLOW}${warn}${RESET}` : warn);
|
|
81
|
+
}
|
|
82
|
+
lines.push(color ? `${DIM}${STAGE_NOTICE}${RESET}` : STAGE_NOTICE);
|
|
83
|
+
lines.push("");
|
|
84
|
+
return lines;
|
|
85
|
+
}
|
|
86
|
+
function renderVerboseInteractiveHeader(cwd, permissionMode, modelOverride, executionMode, options, smart) {
|
|
20
87
|
const color = options.color ?? detectColor();
|
|
21
88
|
const width = options.width ?? detectWidth();
|
|
22
89
|
const config = loadConfig(cwd);
|
|
@@ -26,10 +93,13 @@ export function renderInteractiveHeader(cwd, permissionMode, modelOverride, exec
|
|
|
26
93
|
const workspace = guessWorkspaceRoot(cwd);
|
|
27
94
|
const mode = permissionMode ?? "read-only";
|
|
28
95
|
const permission = getPermissionModeDef(mode).label;
|
|
29
|
-
const model = resolveEffectiveModel({
|
|
96
|
+
const model = formatModelDisplay(resolveEffectiveModel({
|
|
30
97
|
sessionOverride: modelOverride,
|
|
31
98
|
configModel: config.model,
|
|
32
|
-
})
|
|
99
|
+
}), {
|
|
100
|
+
thinking: smart.modelThinking ?? null,
|
|
101
|
+
fast: smart.modelFast ?? null,
|
|
102
|
+
}, smart.cursorAgentId);
|
|
33
103
|
const card = renderCard({
|
|
34
104
|
title: `Patze Code · v${CLI_VERSION}`,
|
|
35
105
|
rows: [
|
|
@@ -64,5 +134,5 @@ const HEADER_TIPS = [
|
|
|
64
134
|
"Cookbook feed: run · tool · agent stream (SSE) when logged in",
|
|
65
135
|
"/login <api> <token> · /status --check to verify",
|
|
66
136
|
];
|
|
67
|
-
export const INTERACTIVE_PROMPT = "
|
|
137
|
+
export const INTERACTIVE_PROMPT = "> ";
|
|
68
138
|
//# sourceMappingURL=header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/cli/interactive/header.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/cli/interactive/header.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AgentEvent } from "./agent-events.js";
|
|
2
|
+
export type JsonAgentStreamWriter = {
|
|
3
|
+
write: (event: AgentEvent) => void;
|
|
4
|
+
writeRaw: (payload: Record<string, unknown>) => void;
|
|
5
|
+
flush: () => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function createJsonAgentStreamWriter(writeLine?: (line: string) => void): JsonAgentStreamWriter;
|
|
8
|
+
//# sourceMappingURL=json-agent-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-agent-stream.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/json-agent-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IAClC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACpD,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAED,wBAAgB,2BAA2B,CACzC,SAAS,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkD,GAC9E,qBAAqB,CAYvB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function createJsonAgentStreamWriter(writeLine = (line) => process.stdout.write(`${line}\n`)) {
|
|
2
|
+
return {
|
|
3
|
+
write(event) {
|
|
4
|
+
writeLine(JSON.stringify({ ...event, ts: Date.now() }));
|
|
5
|
+
},
|
|
6
|
+
writeRaw(payload) {
|
|
7
|
+
writeLine(JSON.stringify({ ...payload, ts: Date.now() }));
|
|
8
|
+
},
|
|
9
|
+
flush() {
|
|
10
|
+
// stdout is line-buffered for JSONL consumers
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=json-agent-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-agent-stream.js","sourceRoot":"","sources":["../../../src/cli/interactive/json-agent-stream.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,2BAA2B,CACzC,YAAoC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;IAE/E,OAAO;QACL,KAAK,CAAC,KAAiB;YACrB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;QACzD,CAAC;QACD,QAAQ,CAAC,OAAgC;YACvC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;QAC3D,CAAC;QACD,KAAK;YACH,8CAA8C;QAChD,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { isComposerNewlineKey, isComposerSubmitKey } from "./composer-keys.js";
|
|
2
|
+
import { type ComposerChrome } from "./composer-chrome.js";
|
|
2
3
|
export type LineEditorOptions = {
|
|
3
4
|
prompt: string;
|
|
4
5
|
color: boolean;
|
|
5
6
|
input?: NodeJS.ReadStream;
|
|
6
7
|
output?: NodeJS.WriteStream;
|
|
8
|
+
getChrome?: ComposerChrome | (() => ComposerChrome);
|
|
7
9
|
};
|
|
8
10
|
export type SubmitResult = {
|
|
9
11
|
type: "line";
|
|
@@ -23,6 +25,7 @@ export declare class SlashLineEditor {
|
|
|
23
25
|
private readonly output;
|
|
24
26
|
private readonly prompt;
|
|
25
27
|
private readonly color;
|
|
28
|
+
private readonly getChrome?;
|
|
26
29
|
private readonly history;
|
|
27
30
|
private buffer;
|
|
28
31
|
private cursor;
|
|
@@ -30,6 +33,8 @@ export declare class SlashLineEditor {
|
|
|
30
33
|
private menuDismissed;
|
|
31
34
|
private historyIndex;
|
|
32
35
|
private stashedBuffer;
|
|
36
|
+
private pasteMode;
|
|
37
|
+
private pasteBuffer;
|
|
33
38
|
/** Total lines in the last drawn composer frame (box + slash menu). */
|
|
34
39
|
private renderedFrameRows;
|
|
35
40
|
/** Cursor row within the last drawn frame (used for accurate rewind). */
|
|
@@ -45,6 +50,9 @@ export declare class SlashLineEditor {
|
|
|
45
50
|
private historyNext;
|
|
46
51
|
private pushHistory;
|
|
47
52
|
private insertNewline;
|
|
53
|
+
private insertBulk;
|
|
54
|
+
private handleBracketedPasteChunk;
|
|
55
|
+
private finishBracketedPaste;
|
|
48
56
|
private cursorLineCol;
|
|
49
57
|
private render;
|
|
50
58
|
private commitLine;
|
|
@@ -67,6 +75,7 @@ declare function buildComposerFrameLines(input: {
|
|
|
67
75
|
buffer: string;
|
|
68
76
|
color?: boolean;
|
|
69
77
|
menuLines?: string[];
|
|
78
|
+
chrome?: ComposerChrome;
|
|
70
79
|
}): string[];
|
|
71
80
|
export { buildComposerFrameLines, formatComposerRow, isComposerNewlineKey, isComposerSubmitKey, padVisible, stripAnsi };
|
|
72
81
|
//# sourceMappingURL=line-editor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"line-editor.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/line-editor.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"line-editor.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/line-editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { emitKeypressEvents } from "node:readline";
|
|
2
2
|
import { isComposerNewlineKey, isComposerSubmitKey, } from "./composer-keys.js";
|
|
3
|
+
import { formatComposerFooterRow, resolveComposerChrome, } from "./composer-chrome.js";
|
|
3
4
|
import { clampSelection, commandRequiresArg, computeSlashMenuItems, moveSelection, renderSlashMenu, } from "./slash-menu.js";
|
|
4
5
|
import { isHistorySafe } from "./redact-input.js";
|
|
5
6
|
const PLACEHOLDER = "Ask anything…";
|
|
@@ -7,6 +8,10 @@ const DIM = "\x1b[2m";
|
|
|
7
8
|
const RESET = "\x1b[0m";
|
|
8
9
|
const BORDER = "\x1b[2m";
|
|
9
10
|
const BORDER_ACTIVE = "\x1b[32m";
|
|
11
|
+
const HIDE_CURSOR = "\x1b[?25l";
|
|
12
|
+
const SHOW_CURSOR = "\x1b[?25h";
|
|
13
|
+
const BRACKETED_PASTE_START = "\x1b[200~";
|
|
14
|
+
const BRACKETED_PASTE_END = "\x1b[201~";
|
|
10
15
|
/**
|
|
11
16
|
* A minimal raw-mode line editor with a live slash-command menu.
|
|
12
17
|
* TTY-only; the piped / scripted path keeps using readline elsewhere,
|
|
@@ -19,6 +24,7 @@ export class SlashLineEditor {
|
|
|
19
24
|
output;
|
|
20
25
|
prompt;
|
|
21
26
|
color;
|
|
27
|
+
getChrome;
|
|
22
28
|
history = [];
|
|
23
29
|
buffer = "";
|
|
24
30
|
cursor = 0;
|
|
@@ -26,6 +32,8 @@ export class SlashLineEditor {
|
|
|
26
32
|
menuDismissed = false;
|
|
27
33
|
historyIndex = -1;
|
|
28
34
|
stashedBuffer = "";
|
|
35
|
+
pasteMode = false;
|
|
36
|
+
pasteBuffer = "";
|
|
29
37
|
/** Total lines in the last drawn composer frame (box + slash menu). */
|
|
30
38
|
renderedFrameRows = 0;
|
|
31
39
|
/** Cursor row within the last drawn frame (used for accurate rewind). */
|
|
@@ -35,6 +43,7 @@ export class SlashLineEditor {
|
|
|
35
43
|
this.output = options.output ?? process.stdout;
|
|
36
44
|
this.prompt = options.prompt;
|
|
37
45
|
this.color = options.color;
|
|
46
|
+
this.getChrome = options.getChrome;
|
|
38
47
|
}
|
|
39
48
|
async readLine() {
|
|
40
49
|
this.buffer = "";
|
|
@@ -43,6 +52,8 @@ export class SlashLineEditor {
|
|
|
43
52
|
this.menuDismissed = false;
|
|
44
53
|
this.historyIndex = -1;
|
|
45
54
|
this.stashedBuffer = "";
|
|
55
|
+
this.pasteMode = false;
|
|
56
|
+
this.pasteBuffer = "";
|
|
46
57
|
this.renderedFrameRows = 0;
|
|
47
58
|
this.lastCursorFrameRow = 0;
|
|
48
59
|
emitKeypressEvents(this.input);
|
|
@@ -58,6 +69,7 @@ export class SlashLineEditor {
|
|
|
58
69
|
this.input.setRawMode(wasRaw);
|
|
59
70
|
}
|
|
60
71
|
this.input.pause();
|
|
72
|
+
this.output.write(SHOW_CURSOR);
|
|
61
73
|
resolvePromise(result);
|
|
62
74
|
};
|
|
63
75
|
const onKeypress = (str, key) => {
|
|
@@ -179,7 +191,24 @@ export class SlashLineEditor {
|
|
|
179
191
|
}
|
|
180
192
|
return "none";
|
|
181
193
|
}
|
|
194
|
+
if (this.pasteMode && str) {
|
|
195
|
+
this.handleBracketedPasteChunk(str);
|
|
196
|
+
return "none";
|
|
197
|
+
}
|
|
198
|
+
if (str?.includes(BRACKETED_PASTE_START)) {
|
|
199
|
+
this.pasteMode = true;
|
|
200
|
+
const startIndex = str.indexOf(BRACKETED_PASTE_START);
|
|
201
|
+
this.pasteBuffer = str.slice(startIndex + BRACKETED_PASTE_START.length);
|
|
202
|
+
if (this.pasteBuffer.includes(BRACKETED_PASTE_END)) {
|
|
203
|
+
this.finishBracketedPaste();
|
|
204
|
+
}
|
|
205
|
+
return "none";
|
|
206
|
+
}
|
|
182
207
|
if (str && !key.ctrl && !key.meta && isPrintable(str)) {
|
|
208
|
+
if (str.length > 1) {
|
|
209
|
+
this.insertBulk(str);
|
|
210
|
+
return "none";
|
|
211
|
+
}
|
|
183
212
|
this.buffer = this.buffer.slice(0, this.cursor) + str + this.buffer.slice(this.cursor);
|
|
184
213
|
this.cursor += str.length;
|
|
185
214
|
this.afterEdit();
|
|
@@ -251,6 +280,28 @@ export class SlashLineEditor {
|
|
|
251
280
|
this.cursor += 1;
|
|
252
281
|
this.afterEdit();
|
|
253
282
|
}
|
|
283
|
+
insertBulk(text) {
|
|
284
|
+
const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
285
|
+
if (!normalized) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
this.buffer = this.buffer.slice(0, this.cursor) + normalized + this.buffer.slice(this.cursor);
|
|
289
|
+
this.cursor += normalized.length;
|
|
290
|
+
this.afterEdit();
|
|
291
|
+
}
|
|
292
|
+
handleBracketedPasteChunk(str) {
|
|
293
|
+
this.pasteBuffer += str;
|
|
294
|
+
if (this.pasteBuffer.includes(BRACKETED_PASTE_END)) {
|
|
295
|
+
this.finishBracketedPaste();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
finishBracketedPaste() {
|
|
299
|
+
const endIndex = this.pasteBuffer.indexOf(BRACKETED_PASTE_END);
|
|
300
|
+
const content = this.pasteBuffer.slice(0, endIndex);
|
|
301
|
+
this.pasteMode = false;
|
|
302
|
+
this.pasteBuffer = "";
|
|
303
|
+
this.insertBulk(content);
|
|
304
|
+
}
|
|
254
305
|
cursorLineCol() {
|
|
255
306
|
const before = this.buffer.slice(0, this.cursor);
|
|
256
307
|
const line = before.split("\n").length - 1;
|
|
@@ -293,9 +344,18 @@ export class SlashLineEditor {
|
|
|
293
344
|
const top = `${borderColor}╭${"─".repeat(Math.max(1, width - 2))}╮${borderReset}`;
|
|
294
345
|
const mids = inputRows.map((rowText) => `${borderColor}│${borderReset} ${rowText} ${borderColor}│${borderReset}`);
|
|
295
346
|
const bottom = `${borderColor}╰${"─".repeat(Math.max(1, width - 2))}╯${borderReset}`;
|
|
296
|
-
const
|
|
347
|
+
const chrome = resolveComposerChrome(this.getChrome);
|
|
348
|
+
const footerText = formatComposerFooterRow({
|
|
349
|
+
innerWidth,
|
|
350
|
+
left: chrome.left,
|
|
351
|
+
right: chrome.right,
|
|
352
|
+
dim: DIM,
|
|
353
|
+
reset: RESET,
|
|
354
|
+
});
|
|
355
|
+
const footer = `${borderColor}│${borderReset} ${footerText} ${borderColor}│${borderReset}`;
|
|
356
|
+
const frameRows = 3 + inputRows.length + menuLines.length;
|
|
297
357
|
const previousFrameRows = this.renderedFrameRows;
|
|
298
|
-
let out =
|
|
358
|
+
let out = HIDE_CURSOR;
|
|
299
359
|
if (previousFrameRows > 0) {
|
|
300
360
|
out += `\x1b[${this.lastCursorFrameRow}A`;
|
|
301
361
|
out += "\r\x1b[J";
|
|
@@ -303,11 +363,11 @@ export class SlashLineEditor {
|
|
|
303
363
|
else {
|
|
304
364
|
out += "\r";
|
|
305
365
|
}
|
|
306
|
-
out += `${top}\n${mids.join("\n")}\n${bottom}`;
|
|
366
|
+
out += `${top}\n${mids.join("\n")}\n${footer}\n${bottom}`;
|
|
307
367
|
for (const line of menuLines) {
|
|
308
368
|
out += `\n${line}`;
|
|
309
369
|
}
|
|
310
|
-
const cursorUp = menuLines.length +
|
|
370
|
+
const cursorUp = menuLines.length + 2 + (inputRows.length - 1 - cursorLine);
|
|
311
371
|
if (cursorUp > 0) {
|
|
312
372
|
out += `\x1b[${cursorUp}A`;
|
|
313
373
|
}
|
|
@@ -316,6 +376,7 @@ export class SlashLineEditor {
|
|
|
316
376
|
if (col > 0) {
|
|
317
377
|
out += `\x1b[${col}C`;
|
|
318
378
|
}
|
|
379
|
+
out += SHOW_CURSOR;
|
|
319
380
|
this.output.write(out);
|
|
320
381
|
this.renderedFrameRows = frameRows;
|
|
321
382
|
this.lastCursorFrameRow = 1 + cursorLine;
|
|
@@ -327,7 +388,7 @@ export class SlashLineEditor {
|
|
|
327
388
|
else {
|
|
328
389
|
this.output.write("\r\x1b[J");
|
|
329
390
|
}
|
|
330
|
-
this.output.write(
|
|
391
|
+
this.output.write(`${SHOW_CURSOR}\n`);
|
|
331
392
|
this.renderedFrameRows = 0;
|
|
332
393
|
this.lastCursorFrameRow = 0;
|
|
333
394
|
}
|
|
@@ -409,8 +470,17 @@ function buildComposerFrameLines(input) {
|
|
|
409
470
|
const borderReset = color ? RESET : "";
|
|
410
471
|
const top = `${borderColor}╭${"─".repeat(Math.max(1, width - 2))}╮${borderReset}`;
|
|
411
472
|
const mids = inputRows.map((rowText) => `${borderColor}│${borderReset} ${rowText} ${borderColor}│${borderReset}`);
|
|
473
|
+
const chrome = resolveComposerChrome(input.chrome);
|
|
474
|
+
const footerText = formatComposerFooterRow({
|
|
475
|
+
innerWidth,
|
|
476
|
+
left: chrome.left,
|
|
477
|
+
right: chrome.right,
|
|
478
|
+
dim: DIM,
|
|
479
|
+
reset: RESET,
|
|
480
|
+
});
|
|
481
|
+
const footer = `${borderColor}│${borderReset} ${footerText} ${borderColor}│${borderReset}`;
|
|
412
482
|
const bottom = `${borderColor}╰${"─".repeat(Math.max(1, width - 2))}╯${borderReset}`;
|
|
413
|
-
return [top, ...mids, bottom, ...menuLines];
|
|
483
|
+
return [top, ...mids, footer, bottom, ...menuLines];
|
|
414
484
|
}
|
|
415
485
|
export { buildComposerFrameLines, formatComposerRow, isComposerNewlineKey, isComposerSubmitKey, padVisible, stripAnsi };
|
|
416
486
|
//# sourceMappingURL=line-editor.js.map
|