jouzu 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +8 -6
  2. package/dist/args.d.ts +1 -0
  3. package/dist/args.d.ts.map +1 -1
  4. package/dist/args.js +8 -4
  5. package/dist/args.js.map +1 -1
  6. package/dist/cli.js +15 -3
  7. package/dist/cli.js.map +1 -1
  8. package/dist/doctor.d.ts +29 -0
  9. package/dist/doctor.d.ts.map +1 -1
  10. package/dist/doctor.js +140 -87
  11. package/dist/doctor.js.map +1 -1
  12. package/dist/help.d.ts +3 -0
  13. package/dist/help.d.ts.map +1 -0
  14. package/dist/help.js +42 -0
  15. package/dist/help.js.map +1 -0
  16. package/dist/keybindings.d.ts +1 -1
  17. package/dist/keybindings.d.ts.map +1 -1
  18. package/dist/keybindings.js +109 -28
  19. package/dist/keybindings.js.map +1 -1
  20. package/dist/metadata.d.ts +11 -0
  21. package/dist/metadata.d.ts.map +1 -1
  22. package/dist/metadata.js +54 -0
  23. package/dist/metadata.js.map +1 -1
  24. package/dist/model-picker-ranking.d.ts +37 -0
  25. package/dist/model-picker-ranking.d.ts.map +1 -0
  26. package/dist/model-picker-ranking.js +169 -0
  27. package/dist/model-picker-ranking.js.map +1 -0
  28. package/dist/model-picker-state.d.ts +64 -0
  29. package/dist/model-picker-state.d.ts.map +1 -0
  30. package/dist/model-picker-state.js +319 -0
  31. package/dist/model-picker-state.js.map +1 -0
  32. package/dist/model-picker.d.ts +65 -0
  33. package/dist/model-picker.d.ts.map +1 -0
  34. package/dist/model-picker.js +446 -0
  35. package/dist/model-picker.js.map +1 -0
  36. package/dist/palette.d.ts +36 -0
  37. package/dist/palette.d.ts.map +1 -0
  38. package/dist/palette.js +69 -0
  39. package/dist/palette.js.map +1 -0
  40. package/dist/pi.lock.json +7 -6
  41. package/dist/presentation.d.ts +4 -1
  42. package/dist/presentation.d.ts.map +1 -1
  43. package/dist/presentation.js +30 -31
  44. package/dist/presentation.js.map +1 -1
  45. package/dist/private-fs.d.ts +14 -0
  46. package/dist/private-fs.d.ts.map +1 -1
  47. package/dist/private-fs.js +35 -2
  48. package/dist/private-fs.js.map +1 -1
  49. package/dist/profile-choice.d.ts.map +1 -1
  50. package/dist/profile-choice.js +4 -20
  51. package/dist/profile-choice.js.map +1 -1
  52. package/dist/profile-manager.d.ts.map +1 -1
  53. package/dist/profile-manager.js +4 -22
  54. package/dist/profile-manager.js.map +1 -1
  55. package/dist/session-ui/THIRD_PARTY_NOTICES.md +30 -0
  56. package/dist/session-ui/color.js +76 -0
  57. package/dist/session-ui/color.js.map +1 -0
  58. package/dist/session-ui/contracts.js +4 -0
  59. package/dist/session-ui/contracts.js.map +1 -0
  60. package/dist/session-ui/controller.js +116 -0
  61. package/dist/session-ui/controller.js.map +1 -0
  62. package/dist/session-ui/extension.js +77 -0
  63. package/dist/session-ui/extension.js.map +1 -0
  64. package/dist/session-ui/identity.js +9 -0
  65. package/dist/session-ui/identity.js.map +1 -0
  66. package/dist/session-ui/index.js +15 -0
  67. package/dist/session-ui/index.js.map +1 -0
  68. package/dist/session-ui/layout.js +138 -0
  69. package/dist/session-ui/layout.js.map +1 -0
  70. package/dist/session-ui/prompt-frame.js +107 -0
  71. package/dist/session-ui/prompt-frame.js.map +1 -0
  72. package/dist/session-ui/session-line.js +82 -0
  73. package/dist/session-ui/session-line.js.map +1 -0
  74. package/dist/session-ui/snapshot.js +68 -0
  75. package/dist/session-ui/snapshot.js.map +1 -0
  76. package/dist/session-ui/sources/command.js +2 -0
  77. package/dist/session-ui/sources/command.js.map +1 -0
  78. package/dist/session-ui/sources/git.js +79 -0
  79. package/dist/session-ui/sources/git.js.map +1 -0
  80. package/dist/session-ui/sources/runtime.js +95 -0
  81. package/dist/session-ui/sources/runtime.js.map +1 -0
  82. package/dist/session-ui/status-bar.js +265 -0
  83. package/dist/session-ui/status-bar.js.map +1 -0
  84. package/dist/session-ui/styles.js +91 -0
  85. package/dist/session-ui/styles.js.map +1 -0
  86. package/dist/terminal-layout.d.ts +2 -0
  87. package/dist/terminal-layout.d.ts.map +1 -0
  88. package/dist/terminal-layout.js +2 -0
  89. package/dist/terminal-layout.js.map +1 -0
  90. package/dist/updater.d.ts +1 -0
  91. package/dist/updater.d.ts.map +1 -1
  92. package/dist/updater.js +18 -23
  93. package/dist/updater.js.map +1 -1
  94. package/package.json +5 -3
@@ -0,0 +1,68 @@
1
+ import { basename } from "node:path";
2
+ import { SYSTEM_SESSION_UI_CLOCK } from "./contracts.js";
3
+ function usageFromBranch(ctx, observedAt) {
4
+ let inputTokens = 0;
5
+ let outputTokens = 0;
6
+ let unknownMessageCount = 0;
7
+ for (const entry of ctx.sessionManager.getBranch()) {
8
+ const usage = entry.type === "message"
9
+ ? entry.message.usage
10
+ : entry.type === "compaction" || entry.type === "branch_summary"
11
+ ? entry.usage
12
+ : undefined;
13
+ if (!usage) {
14
+ if (entry.type === "message" && entry.message.role === "assistant")
15
+ unknownMessageCount += 1;
16
+ continue;
17
+ }
18
+ inputTokens += Number.isFinite(usage.input) ? (usage.input ?? 0) : 0;
19
+ outputTokens += Number.isFinite(usage.output) ? (usage.output ?? 0) : 0;
20
+ }
21
+ return {
22
+ status: unknownMessageCount > 0 ? "partial" : "known",
23
+ observedAt,
24
+ value: { scope: "active_branch", inputTokens, outputTokens, unknownMessageCount },
25
+ };
26
+ }
27
+ function contextFrom(ctx, observedAt) {
28
+ const usage = ctx.getContextUsage();
29
+ const window = usage?.contextWindow ?? ctx.model?.contextWindow;
30
+ if (!usage || !window || window <= 0)
31
+ return { status: "unknown", observedAt };
32
+ const percent = usage.percent;
33
+ const tokens = usage.tokens;
34
+ const value = { window };
35
+ if (tokens !== null)
36
+ value.tokens = tokens;
37
+ if (percent !== null)
38
+ value.percent = percent;
39
+ return {
40
+ status: tokens === null || percent === null ? "partial" : "known",
41
+ observedAt,
42
+ value,
43
+ };
44
+ }
45
+ export function createSessionStatusSnapshot(ctx, options = {}) {
46
+ const clock = options.clock ?? SYSTEM_SESSION_UI_CLOCK;
47
+ const observedAt = clock.now();
48
+ const idle = ctx.isIdle();
49
+ return {
50
+ schemaVersion: 1,
51
+ observedAt,
52
+ workspace: { label: basename(ctx.cwd) || "workspace" },
53
+ activity: {
54
+ idle,
55
+ ...(idle && options.idleSince !== undefined ? { idleSince: options.idleSince } : {}),
56
+ },
57
+ model: {
58
+ ...(ctx.model ? { providerId: ctx.model.provider, modelId: ctx.model.id, displayName: ctx.model.name } : {}),
59
+ ...(ctx.thinkingLevel ? { thinkingLevel: ctx.thinkingLevel } : {}),
60
+ scopedModelCount: ctx.scopedModels.length,
61
+ },
62
+ context: contextFrom(ctx, observedAt),
63
+ usage: usageFromBranch(ctx, observedAt),
64
+ git: options.git ?? { status: "unknown", observedAt },
65
+ runtime: options.runtime ?? { status: "unknown", observedAt },
66
+ };
67
+ }
68
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/sources/command.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ export const GIT_STATUS_ARGS = ["--no-optional-locks", "status", "--porcelain=2", "--branch", "--show-stash"];
2
+ export function emptyGitStatus() {
3
+ return {
4
+ dirty: false,
5
+ ahead: 0,
6
+ behind: 0,
7
+ conflicted: 0,
8
+ untracked: 0,
9
+ stashed: 0,
10
+ modified: 0,
11
+ staged: 0,
12
+ renamed: 0,
13
+ deleted: 0,
14
+ typeChanged: 0,
15
+ };
16
+ }
17
+ export function parseGitStatus(output) {
18
+ const status = emptyGitStatus();
19
+ for (const line of output.split(/\r?\n/)) {
20
+ if (!line)
21
+ continue;
22
+ if (line.startsWith("# branch.head ")) {
23
+ const branch = line.slice("# branch.head ".length).trim();
24
+ if (branch && branch !== "(detached)")
25
+ status.branch = branch;
26
+ continue;
27
+ }
28
+ if (line.startsWith("# branch.ab ")) {
29
+ const match = line.match(/\+(\d+)\s+-(\d+)/);
30
+ if (match) {
31
+ status.ahead = Number(match[1]);
32
+ status.behind = Number(match[2]);
33
+ }
34
+ continue;
35
+ }
36
+ if (line.startsWith("# stash ")) {
37
+ status.stashed = Number(line.slice("# stash ".length)) || 0;
38
+ continue;
39
+ }
40
+ if (line.startsWith("#"))
41
+ continue;
42
+ status.dirty = true;
43
+ if (line.startsWith("? ")) {
44
+ status.untracked += 1;
45
+ continue;
46
+ }
47
+ if (line.startsWith("u ")) {
48
+ status.conflicted += 1;
49
+ continue;
50
+ }
51
+ if (!(line.startsWith("1 ") || line.startsWith("2 ")))
52
+ continue;
53
+ const xy = line.split(" ")[1] ?? "..";
54
+ const indexState = xy[0] ?? ".";
55
+ const worktreeState = xy[1] ?? ".";
56
+ if (indexState === "R")
57
+ status.renamed += 1;
58
+ else if (indexState === "D")
59
+ status.deleted += 1;
60
+ else if (indexState === "T")
61
+ status.typeChanged += 1;
62
+ else if (indexState !== "." && indexState !== " ")
63
+ status.staged += 1;
64
+ if (worktreeState === "M")
65
+ status.modified += 1;
66
+ else if (worktreeState === "D")
67
+ status.deleted += 1;
68
+ else if (worktreeState === "T")
69
+ status.typeChanged += 1;
70
+ }
71
+ return status;
72
+ }
73
+ export async function readGitStatus(cwd, run, signal) {
74
+ const result = await run("git", [...GIT_STATUS_ARGS], { cwd, timeout: 3000, ...(signal ? { signal } : {}) });
75
+ if (result.code !== 0 || result.killed)
76
+ return undefined;
77
+ return parseGitStatus(result.stdout);
78
+ }
79
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/sources/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { readdir } from "node:fs/promises";
2
+ const firstVersion = (pattern) => (output) => output.match(pattern)?.[1];
3
+ const plainVersion = (output) => output.trim().split(/\s+/)[0] || undefined;
4
+ const RUNTIMES = [
5
+ { id: "bun", markers: ["bun.lock", "bun.lockb"], command: "bun", args: ["--version"], parse: plainVersion },
6
+ {
7
+ id: "deno",
8
+ markers: ["deno.json", "deno.jsonc", "deno.lock"],
9
+ command: "deno",
10
+ args: ["--version"],
11
+ parse: firstVersion(/deno\s+([^\s]+)/i),
12
+ },
13
+ {
14
+ id: "node",
15
+ markers: ["package.json", ".nvmrc", ".node-version"],
16
+ command: "node",
17
+ args: ["--version"],
18
+ parse: plainVersion,
19
+ },
20
+ {
21
+ id: "python",
22
+ markers: ["pyproject.toml", "requirements.txt", "setup.py", "setup.cfg", "Pipfile", ".python-version"],
23
+ command: "python3",
24
+ args: ["--version"],
25
+ parse: firstVersion(/Python\s+([^\s]+)/i),
26
+ },
27
+ {
28
+ id: "go",
29
+ markers: ["go.mod"],
30
+ command: "go",
31
+ args: ["version"],
32
+ parse: firstVersion(/go version go([^\s]+)/i),
33
+ },
34
+ {
35
+ id: "rust",
36
+ markers: ["Cargo.toml"],
37
+ command: "rustc",
38
+ args: ["--version"],
39
+ parse: firstVersion(/rustc\s+([^\s]+)/i),
40
+ },
41
+ {
42
+ id: "java",
43
+ markers: ["pom.xml", "build.gradle", "build.gradle.kts"],
44
+ command: "java",
45
+ args: ["-version"],
46
+ parse: (output) => output.match(/"([^"]+)"/)?.[1] ?? output.match(/version\s+([^\s]+)/i)?.[1],
47
+ },
48
+ {
49
+ id: "ruby",
50
+ markers: ["Gemfile", ".ruby-version"],
51
+ command: "ruby",
52
+ args: ["--version"],
53
+ parse: firstVersion(/ruby\s+([^\s]+)/i),
54
+ },
55
+ {
56
+ id: "php",
57
+ markers: ["composer.json"],
58
+ command: "php",
59
+ args: ["--version"],
60
+ parse: firstVersion(/PHP\s+([^\s]+)/i),
61
+ },
62
+ {
63
+ id: "lua",
64
+ markers: ["stylua.toml", ".stylua.toml", ".luarc.json", ".luarc.jsonc", "init.lua", "lua"],
65
+ command: "lua",
66
+ args: ["-v"],
67
+ parse: firstVersion(/Lua\s+([^\s]+)/i),
68
+ },
69
+ ];
70
+ export function detectRuntime(entries) {
71
+ const names = new Set(entries);
72
+ return RUNTIMES.find((runtime) => runtime.markers.some((marker) => names.has(marker)));
73
+ }
74
+ export async function readRuntimeSnapshot(cwd, run, signal) {
75
+ let entries;
76
+ try {
77
+ entries = await readdir(cwd);
78
+ }
79
+ catch {
80
+ return undefined;
81
+ }
82
+ const runtime = detectRuntime(entries);
83
+ if (!runtime)
84
+ return undefined;
85
+ const result = await run(runtime.command, [...runtime.args], {
86
+ cwd,
87
+ timeout: 2500,
88
+ ...(signal ? { signal } : {}),
89
+ });
90
+ if (result.code !== 0 || result.killed)
91
+ return { id: runtime.id };
92
+ const version = runtime.parse(`${result.stdout}\n${result.stderr}`.trim());
93
+ return { id: runtime.id, ...(version ? { version: version.startsWith("v") ? version : `v${version}` } : {}) };
94
+ }
95
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/sources/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,265 @@
1
+ import { fitTerminalText, padTerminalText, sanitizeTerminalText, terminalTextWidth } from "./layout.js";
2
+ function compactCount(value) {
3
+ if (value >= 1_000_000)
4
+ return `${Math.round(value / 100_000) / 10}m`;
5
+ if (value >= 10_000)
6
+ return `${Math.round(value / 1000)}k`;
7
+ if (value >= 1000)
8
+ return `${Math.round(value / 100) / 10}k`;
9
+ return String(value);
10
+ }
11
+ function gitFlags(snapshot) {
12
+ const git = snapshot.git.value;
13
+ if (!git)
14
+ return "";
15
+ const states = [
16
+ git.conflicted > 0 ? "=" : "",
17
+ git.stashed > 0 ? "$" : "",
18
+ git.deleted > 0 ? "✘" : "",
19
+ git.renamed > 0 ? "»" : "",
20
+ git.modified > 0 ? "!" : "",
21
+ git.typeChanged > 0 ? "T" : "",
22
+ git.staged > 0 ? "+" : "",
23
+ git.untracked > 0 ? "?" : "",
24
+ ].join("");
25
+ const relation = git.ahead > 0 && git.behind > 0 ? "⇕" : git.ahead > 0 ? "↑" : git.behind > 0 ? "↓" : "";
26
+ return `${states}${relation}`;
27
+ }
28
+ function runtimeStyle(id) {
29
+ switch (id) {
30
+ case "node":
31
+ return "status.runtime.node";
32
+ case "deno":
33
+ return "status.runtime.deno";
34
+ case "bun":
35
+ return "status.runtime.bun";
36
+ case "python":
37
+ return "status.runtime.python";
38
+ case "java":
39
+ return "status.runtime.java";
40
+ case "rust":
41
+ return "status.runtime.rust";
42
+ case "ruby":
43
+ return "status.runtime.ruby";
44
+ case "go":
45
+ return "status.runtime.go";
46
+ case "lua":
47
+ return "status.runtime.lua";
48
+ case "php":
49
+ return "status.runtime.php";
50
+ default:
51
+ return "status.runtime.default";
52
+ }
53
+ }
54
+ export function buildStatusBarSegments(snapshot) {
55
+ const segments = [];
56
+ if (snapshot.git.status === "error" || snapshot.runtime.status === "error") {
57
+ segments.push({
58
+ id: "health",
59
+ side: "left",
60
+ order: 0,
61
+ priority: 1000,
62
+ style: "status.health",
63
+ value: "! status",
64
+ compactValue: "!",
65
+ required: true,
66
+ });
67
+ }
68
+ segments.push({
69
+ id: "workspace",
70
+ side: "left",
71
+ order: 10,
72
+ priority: 700,
73
+ style: "status.workspace",
74
+ value: snapshot.workspace.label,
75
+ });
76
+ if (snapshot.git.value) {
77
+ const flags = gitFlags(snapshot);
78
+ const branch = sanitizeTerminalText(snapshot.git.value.branch ?? "detached");
79
+ const changes = flags ? ` [${flags}]` : "";
80
+ segments.push({
81
+ id: "git",
82
+ side: "left",
83
+ order: 20,
84
+ priority: 650,
85
+ style: "status.git.branch",
86
+ value: `${branch}${changes}`,
87
+ fragments: [
88
+ { value: branch, style: "status.git.branch" },
89
+ ...(changes ? [{ value: changes, style: "status.git.changes" }] : []),
90
+ ],
91
+ compactValue: flags ? `[${flags}]` : branch,
92
+ compactFragments: flags
93
+ ? [{ value: `[${flags}]`, style: "status.git.changes" }]
94
+ : [{ value: branch, style: "status.git.branch" }],
95
+ });
96
+ }
97
+ if (snapshot.runtime.value) {
98
+ const runtime = snapshot.runtime.value;
99
+ segments.push({
100
+ id: "runtime",
101
+ side: "left",
102
+ order: 30,
103
+ priority: 300,
104
+ style: runtimeStyle(runtime.id),
105
+ value: `${runtime.id}${runtime.version ? ` ${runtime.version}` : ""}`,
106
+ compactValue: runtime.id,
107
+ });
108
+ }
109
+ const context = snapshot.context.value;
110
+ const percent = context?.percent;
111
+ segments.push({
112
+ id: "context",
113
+ side: "right",
114
+ order: 10,
115
+ priority: 900,
116
+ style: percent !== undefined && percent >= 90
117
+ ? "status.context.error"
118
+ : percent !== undefined && percent >= 70
119
+ ? "status.context.warning"
120
+ : "status.context.normal",
121
+ value: context ? `${percent === undefined ? "?" : Math.round(percent)}%/${compactCount(context.window)}` : "ctx ?",
122
+ compactValue: context ? `${percent === undefined ? "?" : Math.round(percent)}%` : "?",
123
+ required: true,
124
+ });
125
+ if (snapshot.usage.value) {
126
+ const usage = snapshot.usage.value;
127
+ const tokenValue = `↑${compactCount(usage.inputTokens)} ↓${compactCount(usage.outputTokens)}`;
128
+ const compactTokenValue = `↑${compactCount(usage.inputTokens)}`;
129
+ const unknown = usage.unknownMessageCount > 0 ? " ?" : "";
130
+ segments.push({
131
+ id: "tokens",
132
+ side: "right",
133
+ order: 20,
134
+ priority: 500,
135
+ style: "status.tokens",
136
+ value: `${tokenValue}${unknown}`,
137
+ fragments: [
138
+ { value: tokenValue, style: "status.tokens" },
139
+ ...(unknown ? [{ value: unknown, style: "status.unknown" }] : []),
140
+ ],
141
+ compactValue: `${compactTokenValue}${unknown}`,
142
+ compactFragments: [
143
+ { value: compactTokenValue, style: "status.tokens" },
144
+ ...(unknown ? [{ value: unknown, style: "status.unknown" }] : []),
145
+ ],
146
+ });
147
+ }
148
+ return segments;
149
+ }
150
+ function preparedWidth(segments, separator) {
151
+ const active = segments.filter((segment) => !segment.removed);
152
+ return active.reduce((total, segment, index) => {
153
+ const value = segment.compact ? (segment.compactValue ?? segment.value) : segment.value;
154
+ return total + terminalTextWidth(value) + (index > 0 ? terminalTextWidth(separator) : 0);
155
+ }, 0);
156
+ }
157
+ function sanitizeFragments(fragments, value) {
158
+ if (!fragments)
159
+ return undefined;
160
+ const safe = fragments.map((fragment) => ({ ...fragment, value: sanitizeTerminalText(fragment.value) }));
161
+ return safe.map((fragment) => fragment.value).join("") === value ? safe : undefined;
162
+ }
163
+ function renderPreparedSegment(segment, styles) {
164
+ const value = segment.compact ? (segment.compactValue ?? segment.value) : segment.value;
165
+ const fragments = segment.compact ? segment.compactFragments : segment.fragments;
166
+ if (!fragments)
167
+ return styles.apply(segment.style, value);
168
+ return fragments.map((fragment) => styles.apply(fragment.style, fragment.value)).join("");
169
+ }
170
+ export function renderStatusBarSegments(segments, width, styles) {
171
+ if (width <= 0)
172
+ return "";
173
+ const prepared = segments.map((segment) => {
174
+ const { value: rawValue, compactValue: rawCompactValue, fragments: rawFragments, compactFragments: rawCompactFragments, ...rest } = segment;
175
+ const value = sanitizeTerminalText(rawValue);
176
+ const compactValue = rawCompactValue === undefined ? undefined : sanitizeTerminalText(rawCompactValue);
177
+ const fragments = sanitizeFragments(rawFragments, value);
178
+ const compactFragments = compactValue === undefined ? undefined : sanitizeFragments(rawCompactFragments, compactValue);
179
+ return {
180
+ ...rest,
181
+ value,
182
+ ...(compactValue !== undefined ? { compactValue } : {}),
183
+ ...(fragments ? { fragments } : {}),
184
+ ...(compactFragments ? { compactFragments } : {}),
185
+ compact: false,
186
+ removed: false,
187
+ };
188
+ });
189
+ const leftSeparator = " · ";
190
+ const rightSeparator = " | ";
191
+ const totalWidth = () => {
192
+ const left = preparedWidth(prepared.filter((segment) => segment.side === "left"), leftSeparator);
193
+ const right = preparedWidth(prepared.filter((segment) => segment.side === "right"), rightSeparator);
194
+ return left + right + (left > 0 && right > 0 ? 1 : 0);
195
+ };
196
+ while (totalWidth() > width) {
197
+ const compactable = prepared
198
+ .filter((segment) => !segment.removed &&
199
+ !segment.compact &&
200
+ segment.compactValue !== undefined &&
201
+ terminalTextWidth(segment.compactValue) < terminalTextWidth(segment.value))
202
+ .sort((left, right) => left.priority - right.priority)[0];
203
+ if (compactable) {
204
+ compactable.compact = true;
205
+ continue;
206
+ }
207
+ const removable = prepared
208
+ .filter((segment) => !segment.removed && !segment.required)
209
+ .sort((left, right) => left.priority - right.priority)[0];
210
+ if (removable) {
211
+ removable.removed = true;
212
+ continue;
213
+ }
214
+ break;
215
+ }
216
+ if (totalWidth() > width) {
217
+ const protectedSegment = prepared
218
+ .filter((segment) => !segment.removed && segment.required)
219
+ .sort((left, right) => right.priority - left.priority)[0];
220
+ if (!protectedSegment)
221
+ return " ".repeat(width);
222
+ const rendered = fitTerminalText(renderPreparedSegment(protectedSegment, styles), width);
223
+ return padTerminalText(rendered, width, {
224
+ alignment: protectedSegment.side === "right" ? "right" : "left",
225
+ });
226
+ }
227
+ const renderSide = (side, separator) => {
228
+ const active = prepared
229
+ .filter((segment) => segment.side === side && !segment.removed)
230
+ .sort((left, right) => left.order - right.order);
231
+ return active
232
+ .map((segment) => renderPreparedSegment(segment, styles))
233
+ .join(styles.apply("status.separator", separator));
234
+ };
235
+ const left = renderSide("left", leftSeparator);
236
+ const right = renderSide("right", rightSeparator);
237
+ if (!left)
238
+ return padTerminalText(right, width, { alignment: "right" });
239
+ if (!right)
240
+ return padTerminalText(left, width);
241
+ return `${left}${" ".repeat(width - terminalTextWidth(left) - terminalTextWidth(right))}${right}`;
242
+ }
243
+ export function renderStatusBar(snapshot, width, styles) {
244
+ return renderStatusBarSegments(buildStatusBarSegments(snapshot), width, styles);
245
+ }
246
+ export class StatusBarComponent {
247
+ styles;
248
+ snapshot;
249
+ unsubscribe;
250
+ constructor(controller, styles, requestRender) {
251
+ this.styles = styles;
252
+ this.unsubscribe = controller.subscribe((snapshot) => {
253
+ this.snapshot = snapshot;
254
+ requestRender();
255
+ });
256
+ }
257
+ render(width) {
258
+ return [this.snapshot ? renderStatusBar(this.snapshot, width, this.styles) : ""];
259
+ }
260
+ invalidate() { }
261
+ dispose() {
262
+ this.unsubscribe();
263
+ }
264
+ }
265
+ //# sourceMappingURL=status-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-bar.js","sourceRoot":"","sources":["../src/status-bar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { detectTerminalColorMode, renderTerminalRgb } from "./color.js";
2
+ const theme = (value) => Object.freeze({ source: "theme", value });
3
+ const rgb = (red, green, blue) => Object.freeze({ source: "rgb", red, green, blue });
4
+ /** Jouzu brand accents, shared by the prompt rail and the Palette so one capability policy covers both. */
5
+ const BRAND_BLUE = rgb(103, 232, 249);
6
+ const BRAND_PINK = rgb(244, 114, 182);
7
+ /** Jouzu-owned semantic roles with defaults matched to the retained Session UI baseline. */
8
+ export const DEFAULT_SESSION_UI_STYLE_SCHEME = Object.freeze({
9
+ "prompt.border": theme("borderMuted"),
10
+ "prompt.rail": BRAND_BLUE,
11
+ "session.hint.text": theme("text"),
12
+ "session.hint.muted": theme("muted"),
13
+ "session.hint.accent": theme("accent"),
14
+ "session.hint.success": theme("success"),
15
+ "session.hint.warning": theme("warning"),
16
+ "session.hint.error": theme("error"),
17
+ "session.provider": theme("dim"),
18
+ "session.model": theme("mdCode"),
19
+ "status.text": theme("text"),
20
+ "status.muted": theme("muted"),
21
+ "status.accent": theme("accent"),
22
+ "status.success": theme("success"),
23
+ "status.warning": theme("warning"),
24
+ "status.error": theme("error"),
25
+ "status.workspace": rgb(215, 215, 255),
26
+ "status.git.branch": theme("syntaxKeyword"),
27
+ "status.git.changes": theme("error"),
28
+ "status.runtime.default": theme("text"),
29
+ "status.runtime.node": theme("success"),
30
+ "status.runtime.deno": theme("syntaxType"),
31
+ "status.runtime.bun": theme("warning"),
32
+ "status.runtime.python": theme("warning"),
33
+ "status.runtime.java": theme("warning"),
34
+ "status.runtime.rust": theme("error"),
35
+ "status.runtime.ruby": theme("error"),
36
+ "status.runtime.go": theme("syntaxType"),
37
+ "status.runtime.lua": theme("accent"),
38
+ "status.runtime.php": theme("accent"),
39
+ "status.context.normal": rgb(250, 204, 21),
40
+ "status.context.warning": theme("warning"),
41
+ "status.context.error": theme("error"),
42
+ "status.tokens": rgb(255, 175, 215),
43
+ "status.separator": theme("borderMuted"),
44
+ "status.health": theme("error"),
45
+ "status.unknown": theme("warning"),
46
+ "palette.border": theme("borderAccent"),
47
+ "palette.title": theme("accent"),
48
+ "palette.count": theme("muted"),
49
+ "palette.marker": BRAND_BLUE,
50
+ "palette.identity": theme("text"),
51
+ "palette.identity.selected": BRAND_BLUE,
52
+ "palette.favorite": theme("warning"),
53
+ "palette.default": theme("success"),
54
+ "palette.unavailable": theme("error"),
55
+ "palette.context.small": theme("warning"),
56
+ "palette.section": theme("muted"),
57
+ "palette.section.current": BRAND_PINK,
58
+ "palette.detail": BRAND_BLUE,
59
+ "palette.tab.active": theme("accent"),
60
+ "palette.empty": theme("muted"),
61
+ "palette.message.error": theme("error"),
62
+ "palette.message.info": theme("muted"),
63
+ "palette.hint": theme("dim"),
64
+ });
65
+ function themeSupportsColor(themeValue) {
66
+ const probe = "jouzu-color-probe";
67
+ return themeValue.fg("accent", probe) !== probe;
68
+ }
69
+ export function createSessionUiStyles(themeValue, options = {}) {
70
+ const env = options.env ?? process.env;
71
+ const colorEnabled = options.colorEnabled ?? (env.NO_COLOR === undefined && env.TERM !== "dumb" && themeSupportsColor(themeValue));
72
+ const detectedMode = detectTerminalColorMode({
73
+ env,
74
+ ...(options.colorDepth !== undefined ? { colorDepth: options.colorDepth } : {}),
75
+ ...(options.stdoutIsTTY !== undefined ? { stdoutIsTTY: options.stdoutIsTTY } : {}),
76
+ });
77
+ const colorMode = options.colorMode ?? (options.colorEnabled === true && detectedMode === "none" ? "truecolor" : detectedMode);
78
+ const scheme = options.scheme ?? DEFAULT_SESSION_UI_STYLE_SCHEME;
79
+ return Object.freeze({
80
+ scheme,
81
+ apply(role, value) {
82
+ if (!colorEnabled || value.length === 0)
83
+ return value;
84
+ const color = scheme[role];
85
+ if (color.source === "theme")
86
+ return themeValue.fg(color.value, value);
87
+ return renderTerminalRgb(value, color, colorMode);
88
+ },
89
+ });
90
+ }
91
+ //# sourceMappingURL=styles.js.map