@jx-grxf/patchpilot 0.4.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.env.example +17 -1
  2. package/README.md +113 -23
  3. package/SECURITY.md +7 -1
  4. package/dist/cli.js +103 -14
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/agent.d.ts +47 -1
  7. package/dist/core/agent.js +667 -76
  8. package/dist/core/agent.js.map +1 -1
  9. package/dist/core/cleanup.d.ts +3 -0
  10. package/dist/core/cleanup.js +29 -0
  11. package/dist/core/cleanup.js.map +1 -0
  12. package/dist/core/clipboard.d.ts +14 -0
  13. package/dist/core/clipboard.js +134 -0
  14. package/dist/core/clipboard.js.map +1 -0
  15. package/dist/core/codex.d.ts +8 -0
  16. package/dist/core/codex.js +28 -2
  17. package/dist/core/codex.js.map +1 -1
  18. package/dist/core/compaction.d.ts +23 -0
  19. package/dist/core/compaction.js +145 -0
  20. package/dist/core/compaction.js.map +1 -0
  21. package/dist/core/contextFormat.d.ts +21 -0
  22. package/dist/core/contextFormat.js +87 -0
  23. package/dist/core/contextFormat.js.map +1 -0
  24. package/dist/core/contextItem.d.ts +41 -0
  25. package/dist/core/contextItem.js +93 -0
  26. package/dist/core/contextItem.js.map +1 -0
  27. package/dist/core/contextStore.d.ts +48 -0
  28. package/dist/core/contextStore.js +306 -0
  29. package/dist/core/contextStore.js.map +1 -0
  30. package/dist/core/doctor.d.ts +4 -1
  31. package/dist/core/doctor.js +122 -3
  32. package/dist/core/doctor.js.map +1 -1
  33. package/dist/core/gemini.js +10 -4
  34. package/dist/core/gemini.js.map +1 -1
  35. package/dist/core/geminiWrapper.d.ts +92 -0
  36. package/dist/core/geminiWrapper.js +1258 -0
  37. package/dist/core/geminiWrapper.js.map +1 -0
  38. package/dist/core/http.js +70 -6
  39. package/dist/core/http.js.map +1 -1
  40. package/dist/core/json.d.ts +1 -1
  41. package/dist/core/json.js +81 -19
  42. package/dist/core/json.js.map +1 -1
  43. package/dist/core/memory.d.ts +16 -0
  44. package/dist/core/memory.js +108 -0
  45. package/dist/core/memory.js.map +1 -0
  46. package/dist/core/modelClient.js +7 -0
  47. package/dist/core/modelClient.js.map +1 -1
  48. package/dist/core/nvidia.d.ts +1 -1
  49. package/dist/core/nvidia.js +13 -4
  50. package/dist/core/nvidia.js.map +1 -1
  51. package/dist/core/ollama.js +13 -3
  52. package/dist/core/ollama.js.map +1 -1
  53. package/dist/core/openrouter.js +15 -6
  54. package/dist/core/openrouter.js.map +1 -1
  55. package/dist/core/projectInit.d.ts +6 -0
  56. package/dist/core/projectInit.js +44 -0
  57. package/dist/core/projectInit.js.map +1 -0
  58. package/dist/core/reasoning.js +6 -0
  59. package/dist/core/reasoning.js.map +1 -1
  60. package/dist/core/session.d.ts +1 -0
  61. package/dist/core/session.js +55 -3
  62. package/dist/core/session.js.map +1 -1
  63. package/dist/core/tokenAccounting.d.ts +4 -0
  64. package/dist/core/tokenAccounting.js +75 -13
  65. package/dist/core/tokenAccounting.js.map +1 -1
  66. package/dist/core/types.d.ts +65 -5
  67. package/dist/core/types.js +30 -1
  68. package/dist/core/types.js.map +1 -1
  69. package/dist/core/updateCheck.d.ts +19 -0
  70. package/dist/core/updateCheck.js +103 -0
  71. package/dist/core/updateCheck.js.map +1 -0
  72. package/dist/core/workspace.d.ts +37 -0
  73. package/dist/core/workspace.js +1535 -84
  74. package/dist/core/workspace.js.map +1 -1
  75. package/dist/tui/App.d.ts +1 -0
  76. package/dist/tui/App.js +1841 -140
  77. package/dist/tui/App.js.map +1 -1
  78. package/dist/tui/commands.js +141 -9
  79. package/dist/tui/commands.js.map +1 -1
  80. package/dist/tui/components/ApprovalPanel.js +16 -1
  81. package/dist/tui/components/ApprovalPanel.js.map +1 -1
  82. package/dist/tui/components/CommandSuggestions.js +33 -5
  83. package/dist/tui/components/CommandSuggestions.js.map +1 -1
  84. package/dist/tui/components/Composer.d.ts +3 -0
  85. package/dist/tui/components/Composer.js +57 -5
  86. package/dist/tui/components/Composer.js.map +1 -1
  87. package/dist/tui/components/ExperimentalPanel.d.ts +10 -0
  88. package/dist/tui/components/ExperimentalPanel.js +38 -0
  89. package/dist/tui/components/ExperimentalPanel.js.map +1 -0
  90. package/dist/tui/components/Header.js +3 -3
  91. package/dist/tui/components/Header.js.map +1 -1
  92. package/dist/tui/components/OnboardingPanel.d.ts +25 -1
  93. package/dist/tui/components/OnboardingPanel.js +87 -25
  94. package/dist/tui/components/OnboardingPanel.js.map +1 -1
  95. package/dist/tui/components/Sidebar.js +17 -13
  96. package/dist/tui/components/Sidebar.js.map +1 -1
  97. package/dist/tui/components/StartupBanner.d.ts +4 -0
  98. package/dist/tui/components/StartupBanner.js +9 -0
  99. package/dist/tui/components/StartupBanner.js.map +1 -0
  100. package/dist/tui/components/Transcript.d.ts +7 -0
  101. package/dist/tui/components/Transcript.js +87 -17
  102. package/dist/tui/components/Transcript.js.map +1 -1
  103. package/dist/tui/contextCommands.d.ts +8 -0
  104. package/dist/tui/contextCommands.js +205 -0
  105. package/dist/tui/contextCommands.js.map +1 -0
  106. package/dist/tui/experimental/AnimatedText.d.ts +38 -0
  107. package/dist/tui/experimental/AnimatedText.js +55 -0
  108. package/dist/tui/experimental/AnimatedText.js.map +1 -0
  109. package/dist/tui/experimental/Banner.d.ts +10 -0
  110. package/dist/tui/experimental/Banner.js +33 -0
  111. package/dist/tui/experimental/Banner.js.map +1 -0
  112. package/dist/tui/experimental/CommandPalette.d.ts +11 -0
  113. package/dist/tui/experimental/CommandPalette.js +25 -0
  114. package/dist/tui/experimental/CommandPalette.js.map +1 -0
  115. package/dist/tui/experimental/ExperimentalShell.d.ts +58 -0
  116. package/dist/tui/experimental/ExperimentalShell.js +366 -0
  117. package/dist/tui/experimental/ExperimentalShell.js.map +1 -0
  118. package/dist/tui/experimental/ThemePicker.d.ts +13 -0
  119. package/dist/tui/experimental/ThemePicker.js +12 -0
  120. package/dist/tui/experimental/ThemePicker.js.map +1 -0
  121. package/dist/tui/experimental/attachments.d.ts +35 -0
  122. package/dist/tui/experimental/attachments.js +244 -0
  123. package/dist/tui/experimental/attachments.js.map +1 -0
  124. package/dist/tui/experimental/composer.d.ts +24 -0
  125. package/dist/tui/experimental/composer.js +84 -0
  126. package/dist/tui/experimental/composer.js.map +1 -0
  127. package/dist/tui/experimental/geminiPricing.d.ts +16 -0
  128. package/dist/tui/experimental/geminiPricing.js +39 -0
  129. package/dist/tui/experimental/geminiPricing.js.map +1 -0
  130. package/dist/tui/experimental/layout.d.ts +46 -0
  131. package/dist/tui/experimental/layout.js +112 -0
  132. package/dist/tui/experimental/layout.js.map +1 -0
  133. package/dist/tui/experimental/theme.d.ts +35 -0
  134. package/dist/tui/experimental/theme.js +86 -0
  135. package/dist/tui/experimental/theme.js.map +1 -0
  136. package/dist/tui/experimental/transcriptRows.d.ts +20 -0
  137. package/dist/tui/experimental/transcriptRows.js +169 -0
  138. package/dist/tui/experimental/transcriptRows.js.map +1 -0
  139. package/dist/tui/experimental/ultraModes.d.ts +46 -0
  140. package/dist/tui/experimental/ultraModes.js +95 -0
  141. package/dist/tui/experimental/ultraModes.js.map +1 -0
  142. package/dist/tui/experimental/ultramaxx.d.ts +19 -0
  143. package/dist/tui/experimental/ultramaxx.js +43 -0
  144. package/dist/tui/experimental/ultramaxx.js.map +1 -0
  145. package/dist/tui/format.d.ts +4 -2
  146. package/dist/tui/format.js +21 -7
  147. package/dist/tui/format.js.map +1 -1
  148. package/dist/tui/hosts.js +7 -1
  149. package/dist/tui/hosts.js.map +1 -1
  150. package/dist/tui/layout.d.ts +26 -0
  151. package/dist/tui/layout.js +66 -0
  152. package/dist/tui/layout.js.map +1 -0
  153. package/dist/tui/modelSelection.d.ts +1 -1
  154. package/dist/tui/modelSelection.js +8 -6
  155. package/dist/tui/modelSelection.js.map +1 -1
  156. package/dist/tui/modes.d.ts +8 -1
  157. package/dist/tui/modes.js +20 -2
  158. package/dist/tui/modes.js.map +1 -1
  159. package/dist/tui/onboardingPreferences.d.ts +37 -0
  160. package/dist/tui/onboardingPreferences.js +118 -0
  161. package/dist/tui/onboardingPreferences.js.map +1 -0
  162. package/dist/tui/runStatus.d.ts +50 -0
  163. package/dist/tui/runStatus.js +164 -0
  164. package/dist/tui/runStatus.js.map +1 -0
  165. package/dist/tui/types.d.ts +8 -0
  166. package/dist/tui/types.js.map +1 -1
  167. package/docs/architecture.md +115 -0
  168. package/docs/gemini-wrapper.md +110 -0
  169. package/docs/product-context.md +43 -0
  170. package/docs/releases/v0.1.1-beta.md +18 -0
  171. package/docs/releases/v0.2.1.md +1 -1
  172. package/docs/releases/v0.3.1-beta.md +4 -0
  173. package/docs/releases/v0.4.0.md +1 -1
  174. package/docs/releases/v1.0.0.md +28 -0
  175. package/docs/releases/v1.0.1.md +25 -0
  176. package/docs/releases/v1.1.0.md +30 -0
  177. package/docs/releases/v1.2.0.md +28 -0
  178. package/docs/showcase/patchpilot-banner.png +0 -0
  179. package/docs/showcase/patchpilot-logo.png +0 -0
  180. package/package.json +8 -3
@@ -1,8 +1,13 @@
1
1
  import React from "react";
2
2
  import type { ModelProvider } from "../../core/types.js";
3
3
  import type { OllamaHost } from "../hosts.js";
4
- export type ApiKeyProvider = "gemini" | "openrouter" | "nvidia";
4
+ import { type OnboardingPreferences } from "../onboardingPreferences.js";
5
+ export type ApiKeyProvider = "gemini" | "gemini-wrapper" | "openrouter" | "nvidia";
5
6
  export type OnboardingState = {
7
+ step: "welcome";
8
+ } | {
9
+ step: "disclaimer";
10
+ } | {
6
11
  step: "entry";
7
12
  } | {
8
13
  step: "host";
@@ -15,6 +20,18 @@ export type OnboardingState = {
15
20
  hasExistingKey: boolean;
16
21
  } | {
17
22
  step: "gemini-key";
23
+ } | {
24
+ step: "gemini-wrapper-url";
25
+ } | {
26
+ step: "gemini-wrapper-psid";
27
+ } | {
28
+ step: "gemini-wrapper-psidts";
29
+ secure1psid: string;
30
+ } | {
31
+ step: "gemini-wrapper-model-mode";
32
+ } | {
33
+ step: "gemini-wrapper-key";
34
+ baseUrl: string;
18
35
  } | {
19
36
  step: "openrouter-key";
20
37
  } | {
@@ -26,6 +43,11 @@ export type OnboardingState = {
26
43
  provider: ModelProvider;
27
44
  models: string[];
28
45
  deviceName?: string;
46
+ } | {
47
+ step: "preferences";
48
+ provider: ModelProvider;
49
+ model: string;
50
+ preferences: OnboardingPreferences;
29
51
  };
30
52
  export declare function OnboardingPanel(props: {
31
53
  state: OnboardingState;
@@ -38,6 +60,8 @@ export declare function OnboardingPanel(props: {
38
60
  text: string;
39
61
  detail?: string;
40
62
  } | null;
63
+ formatModelLabel?: (model: string) => string;
64
+ formatModelDescription?: (model: string) => string;
41
65
  onInputChange: (value: string) => void;
42
66
  onInputSubmit: (value: string) => void;
43
67
  }): React.ReactElement;
@@ -1,44 +1,61 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { Box, Text } from "ink";
3
3
  import TextInput from "ink-text-input";
4
4
  import { selectableModels } from "../modelSelection.js";
5
+ import { symbols } from "../experimental/theme.js";
6
+ import { describePreferenceValue, preferenceRows, preferenceValueString, } from "../onboardingPreferences.js";
5
7
  const entryOptions = [
6
8
  {
7
9
  label: "This Device",
8
- description: "Run Ollama locally on this machine"
10
+ description: "Run Ollama locally fully offline, nothing leaves the machine"
9
11
  },
10
12
  {
11
13
  label: "Remote Host",
12
- description: "Use Ollama from another LAN or Tailscale machine"
14
+ description: "Reach Ollama on another LAN or Tailscale machine"
13
15
  },
14
16
  {
15
17
  label: "Gemini",
16
- description: "Use the Google Gemini API key from PatchPilot config"
18
+ description: "Google Gemini API fast hosted models with an API key"
19
+ },
20
+ {
21
+ label: "Gemini-Wrapper",
22
+ description: "Local Gemini Web bridge driven by pasted browser cookies"
17
23
  },
18
24
  {
19
25
  label: "OpenRouter",
20
- description: "Use OpenRouter models, including auto and free variants"
26
+ description: "One key, many models including auto-routed and free tiers"
21
27
  },
22
28
  {
23
29
  label: "NVIDIA",
24
- description: "Use NVIDIA NIM OpenAI-compatible endpoints"
30
+ description: "NVIDIA NIM OpenAI-compatible inference endpoints"
25
31
  },
26
32
  {
27
33
  label: "Codex",
28
- description: "Use the ChatGPT login through Codex CLI"
34
+ description: "Sign in with your ChatGPT account through the Codex CLI"
29
35
  }
30
36
  ];
37
+ const stepFlow = ["workflow", "host", "auth", "model", "tune"];
31
38
  export function OnboardingPanel(props) {
32
- const currentStepIndex = props.state.step === "entry"
39
+ const currentStepIndex = props.state.step === "welcome" || props.state.step === "disclaimer" || props.state.step === "entry"
33
40
  ? 0
34
41
  : props.state.step === "host" || props.state.step === "host-input"
35
42
  ? 1
36
- : props.state.step === "api-key-choice" || props.state.step === "gemini-key" || props.state.step === "openrouter-key" || props.state.step === "nvidia-key" || props.state.step === "codex-login"
43
+ : props.state.step === "api-key-choice" || props.state.step === "gemini-key" || props.state.step === "gemini-wrapper-url" || props.state.step === "gemini-wrapper-psid" || props.state.step === "gemini-wrapper-psidts" || props.state.step === "gemini-wrapper-model-mode" || props.state.step === "gemini-wrapper-key" || props.state.step === "openrouter-key" || props.state.step === "nvidia-key" || props.state.step === "codex-login"
37
44
  ? 2
38
- : 3;
39
- const visibleModels = props.state.step === "model" ? selectableModels(props.input, props.state.models) : [];
45
+ : props.state.step === "model"
46
+ ? 3
47
+ : 4;
48
+ const formatModelLabel = props.formatModelLabel ?? ((model) => model);
49
+ const formatModelDescription = props.formatModelDescription ?? (() => "");
50
+ const visibleModels = props.state.step === "model" ? selectableModels(props.input, props.state.models, formatModelLabel) : [];
40
51
  const selectedModel = props.state.step === "model" ? visibleModels[props.selectedIndex] ?? null : null;
41
- return (_jsxs(Box, { borderStyle: "round", borderColor: "cyan", flexDirection: "column", paddingX: 2, height: props.height, overflowY: "hidden", children: [_jsx(Text, { color: "cyan", bold: true, children: "PatchPilot Setup" }), _jsx(Text, { color: "gray", children: "Choose where inference runs before the workspace session starts." }), _jsx(Box, { marginTop: 1, children: ["mode", "host", "auth", "model"].map((step, index) => (_jsxs(Text, { color: index <= currentStepIndex ? "cyan" : "gray", children: [index > 0 ? " " : "", "[", index + 1, "] ", step] }, step))) }), props.busyMessage ? (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "yellow", children: props.busyMessage }) })) : null, props.notice ? (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: props.notice.tone === "success" ? "green" : props.notice.tone === "warning" ? "yellow" : "red", children: props.notice.text }), props.notice.detail ? _jsx(Text, { color: "gray", children: props.notice.detail }) : null] })) : null, props.state.step === "entry" ? (_jsx(SelectionList, { title: "Where should the model run?", subtitle: "Use up/down and Enter. Escape skips setup.", rows: entryOptions, selectedIndex: props.selectedIndex })) : null, props.state.step === "host" ? (_jsx(SelectionList, { title: "Choose a host", subtitle: "Top item lets you enter a host manually. Left arrow goes back.", rows: [
52
+ return (_jsxs(Box, { borderStyle: "round", borderColor: "cyan", flexDirection: "column", paddingX: 2, paddingY: 1, height: props.height, overflowY: "hidden", children: [_jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: "cyan", bold: true, children: [symbols.assistant, " PatchPilot"] }), _jsx(Text, { color: "gray", children: " \u2014 first-run setup" })] }), _jsxs(Text, { color: "gray", children: ["A few quick choices, then you are ready to ship. ", symbols.bullet, " reopen anytime with /onboarding"] }), _jsx(Box, { marginTop: 1, flexDirection: "row", children: stepFlow.map((step, index) => {
53
+ const done = index < currentStepIndex;
54
+ const active = index === currentStepIndex;
55
+ const glyph = done ? symbols.todoDone : active ? symbols.todoActive : symbols.todoPending;
56
+ const color = done ? "green" : active ? "cyan" : "gray";
57
+ return (_jsxs(Text, { color: color, bold: active, children: [index > 0 ? " " : "", glyph, " ", step] }, step));
58
+ }) }), props.busyMessage ? (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "yellow", children: [symbols.status, " ", props.busyMessage] }) })) : null, props.notice ? (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: props.notice.tone === "success" ? "green" : props.notice.tone === "warning" ? "yellow" : "red", children: [props.notice.tone === "success" ? symbols.final : props.notice.tone === "warning" ? symbols.approval : symbols.error, " ", props.notice.text] }), props.notice.detail ? _jsxs(Text, { color: "gray", children: [" ", props.notice.detail] }) : null] })) : null, props.state.step === "welcome" ? (_jsx(WelcomeStep, {})) : null, props.state.step === "disclaimer" ? (_jsx(DisclaimerStep, {})) : null, props.state.step === "entry" ? (_jsx(SelectionList, { title: "Where should the model run?", subtitle: `${symbols.arrow} up/down to move ${symbols.bullet} enter to pick ${symbols.bullet} esc skips setup`, rows: entryOptions, selectedIndex: props.selectedIndex })) : null, props.state.step === "host" ? (_jsx(SelectionList, { title: "Choose a host", subtitle: `Top row enters a host by hand ${symbols.bullet} ${symbols.arrow} left goes back`, rows: [
42
59
  {
43
60
  label: "Enter Host Manually",
44
61
  description: "Type a LAN IP, Tailscale IP, MagicDNS name, or full URL"
@@ -47,37 +64,82 @@ export function OnboardingPanel(props) {
47
64
  label: host.deviceName,
48
65
  description: `${host.kind} ${host.url}${host.version ? ` Ollama ${host.version}` : ""}`
49
66
  }))
50
- ], selectedIndex: props.selectedIndex })) : null, props.state.step === "host-input" ? (_jsx(InputStep, { title: "Connect to a host", description: "Enter a LAN IP, Tailscale IP, MagicDNS name, or full URL.", prompt: "host > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit })) : null, props.state.step === "api-key-choice" ? (_jsx(SelectionList, { title: `${providerLabel(props.state.provider)} API key`, subtitle: "Use up/down and Enter. Existing keys stay in PatchPilot config.", rows: [
67
+ ], selectedIndex: props.selectedIndex })) : null, props.state.step === "host-input" ? (_jsx(InputStep, { title: "Connect to a host", description: "Enter a LAN IP, Tailscale IP, MagicDNS name, or full URL.", prompt: "host > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit })) : null, props.state.step === "api-key-choice" ? (_jsx(SelectionList, { title: props.state.provider === "gemini-wrapper" ? "Gemini-Wrapper bridge auth" : `${providerLabel(props.state.provider)} API key`, subtitle: props.state.provider === "gemini-wrapper" ? "Saved cookies stay in PatchPilot config, never the repo." : "Existing keys stay in PatchPilot config, never the repo.", rows: [
51
68
  ...(props.state.hasExistingKey
52
69
  ? [
53
70
  {
54
- label: "Use Existing Key",
55
- description: "Continue with the saved key"
71
+ label: props.state.provider === "gemini-wrapper" ? "Use Saved Bridge" : "Use Existing Key",
72
+ description: props.state.provider === "gemini-wrapper" ? "Continue with the saved cookie file" : "Continue with the saved key"
73
+ }
74
+ ]
75
+ : []),
76
+ ...(props.state.provider === "gemini-wrapper"
77
+ ? [
78
+ {
79
+ label: "Import From Browser",
80
+ description: "Read Gemini Web cookies locally after this explicit choice"
56
81
  }
57
82
  ]
58
83
  : []),
59
84
  {
60
- label: "Enter New Key",
61
- description: "Replace or add the key in PatchPilot config"
85
+ label: props.state.provider === "gemini-wrapper" ? "Paste Cookie" : "Enter New Key",
86
+ description: props.state.provider === "gemini-wrapper" ? "Replace the Gemini Web cookie file in PatchPilot config" : "Replace or add the key in PatchPilot config"
87
+ }
88
+ ], selectedIndex: props.selectedIndex })) : null, props.state.step === "gemini-key" ? (_jsx(InputStep, { title: "Enter your Gemini API key", description: "Stored in PatchPilot's config directory, never in the repository.", prompt: "key > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit, mask: "*" })) : null, props.state.step === "gemini-wrapper-url" ? (_jsx(InputStep, { title: "Connect Gemini-Wrapper HTTP", description: "Optional advanced mode: enter an explicit OpenAI-compatible wrapper URL.", prompt: "url > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit })) : null, props.state.step === "gemini-wrapper-psid" ? (_jsx(InputStep, { title: "Connect Gemini-API bridge", description: "Paste __Secure-1PSID. PatchPilot stores it in ~/.patchpilot/gemini-cookies.json with owner-only permissions.", prompt: "psid > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit, mask: "*" })) : null, props.state.step === "gemini-wrapper-psidts" ? (_jsx(InputStep, { title: "Optional Gemini session timestamp", description: "Paste __Secure-1PSIDTS if you have it, or press Enter to skip.", prompt: "ts > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit, mask: "*" })) : null, props.state.step === "gemini-wrapper-model-mode" ? (_jsx(SelectionList, { title: "Gemini-Wrapper model", subtitle: "Shortcuts resolve through live Gemini Web discovery; Denkaufwand is not a stable bridge control yet.", rows: [
89
+ {
90
+ label: "Auto",
91
+ description: "Let Gemini Web pick the current default model"
92
+ },
93
+ {
94
+ label: "Flash-Lite",
95
+ description: "Resolve the live Gemini Web Flash-Lite model"
96
+ },
97
+ {
98
+ label: "Flash",
99
+ description: "Resolve the live Flash model, preferring 3.5 Flash when the bridge lists it"
100
+ },
101
+ {
102
+ label: "Pro",
103
+ description: "Resolve the live Gemini Web Pro model"
104
+ },
105
+ {
106
+ label: "Manual",
107
+ description: "Fetch available Gemini Web models and choose one"
62
108
  }
63
- ], selectedIndex: props.selectedIndex })) : null, props.state.step === "gemini-key" ? (_jsx(InputStep, { title: "Enter your Gemini API key", description: "It will be stored in PatchPilot's config directory, not in the repository.", prompt: "key > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit, mask: "*" })) : null, props.state.step === "openrouter-key" ? (_jsx(InputStep, { title: "Enter your OpenRouter API key", description: "It will be stored in PatchPilot's config directory, not in the repository.", prompt: "key > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit, mask: "*" })) : null, props.state.step === "nvidia-key" ? (_jsx(InputStep, { title: "Enter your NVIDIA API key", description: "It will be stored in PatchPilot's config directory, not in the repository.", prompt: "key > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit, mask: "*" })) : null, props.state.step === "codex-login" ? (_jsxs(Box, { flexDirection: "column", marginTop: 2, children: [_jsx(Text, { color: "white", bold: true, children: "Connect Codex CLI" }), _jsx(Text, { color: "gray", children: "Run `codex login` in another terminal, then press Enter here to continue." }), _jsx(Text, { color: "gray", children: "Escape or left arrow goes back." })] })) : null, props.state.step === "model" ? (_jsxs(_Fragment, { children: [_jsx(InputStep, { title: `Choose a ${props.state.provider} model${props.state.deviceName ? ` on ${props.state.deviceName}` : ""}`, description: "Type to search. Use up/down and Enter. Left arrow goes back.", prompt: "find > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit }), _jsx(SelectionList, { title: "", subtitle: `${visibleModels.length} matching model${visibleModels.length === 1 ? "" : "s"}`, rows: visibleModels.map((model) => ({
64
- label: model,
65
- description: model === selectedModel ? "selected" : "available"
66
- })), selectedIndex: props.selectedIndex })] })) : null, _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Remote host mode keeps file reads, writes, shell, Git, and tests on this device. Only inference moves." }) })] }));
109
+ ], selectedIndex: props.selectedIndex })) : null, props.state.step === "gemini-wrapper-key" ? (_jsx(InputStep, { title: "Enter Gemini-Wrapper API key", description: "Required for remote wrapper URLs. Local wrapper URLs may leave this empty.", prompt: "key > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit, mask: "*" })) : null, props.state.step === "openrouter-key" ? (_jsx(InputStep, { title: "Enter your OpenRouter API key", description: "Stored in PatchPilot's config directory, never in the repository.", prompt: "key > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit, mask: "*" })) : null, props.state.step === "nvidia-key" ? (_jsx(InputStep, { title: "Enter your NVIDIA API key", description: "Stored in PatchPilot's config directory, never in the repository.", prompt: "key > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit, mask: "*" })) : null, props.state.step === "codex-login" ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: "white", bold: true, children: [symbols.arrow, " Connect Codex CLI"] }), _jsx(Text, { color: "gray", children: "Run `codex login` in another terminal, then press Enter here to continue." }), _jsxs(Text, { color: "gray", children: [symbols.bullet, " esc or left arrow goes back"] })] })) : null, props.state.step === "model" ? (_jsxs(_Fragment, { children: [_jsx(InputStep, { title: `Choose a ${props.state.provider} model${props.state.deviceName ? ` on ${props.state.deviceName}` : ""}`, description: "Type to filter. Up/down to move, enter to pick. Left arrow goes back.", prompt: "find > ", value: props.input, onChange: props.onInputChange, onSubmit: props.onInputSubmit }), _jsx(SelectionList, { title: "", subtitle: `${visibleModels.length} matching model${visibleModels.length === 1 ? "" : "s"}`, rows: visibleModels.map((model) => ({
110
+ label: formatModelLabel(model),
111
+ description: `${model === selectedModel ? "selected" : "available"}${formatModelDescription(model)}`
112
+ })), selectedIndex: props.selectedIndex })] })) : null, props.state.step === "preferences" ? (_jsx(PreferencesStep, { provider: props.state.provider, model: props.state.model, preferences: props.state.preferences, selectedIndex: props.selectedIndex })) : null, _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "gray", children: [symbols.info, " Remote inference keeps file reads, writes, shell, Git, and tests on this device \u2014 only the model call moves."] }) })] }));
113
+ }
114
+ function WelcomeStep() {
115
+ return (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: "cyan", bold: true, children: [symbols.assistant, " A coding agent you can watch work"] }), _jsx(Text, { color: "gray", children: "Local-first. Every read, write, command, and model route stays visible and inspectable." }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: "white", children: [symbols.todoActive, " Plan ", symbols.bullet, " read files, map the architecture, keep a live todo list"] }), _jsxs(Text, { color: "white", children: [symbols.todoActive, " Build ", symbols.bullet, " scoped approvals for edits, scripts, tests, and shell"] }), _jsxs(Text, { color: "white", children: [symbols.todoActive, " Review ", symbols.bullet, " show diffs, run checks, leave Git history ready for you"] })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: "yellow", children: [symbols.pin, " First task to try: \"summarize this repo and list the safest next fixes\""] }), _jsxs(Text, { color: "gray", children: [symbols.arrow, " enter continues ", symbols.bullet, " esc skips ", symbols.bullet, " reopen later with /onboarding"] })] })] }));
116
+ }
117
+ function DisclaimerStep() {
118
+ return (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: "yellow", bold: true, children: [symbols.approval, " Use at your own risk"] }), _jsx(Text, { color: "gray", children: "PatchPilot can read files, edit files, and run shell commands when you enable those capabilities." }), _jsx(Text, { color: "gray", children: "You remain responsible for reviewing actions, diffs, commands, provider terms, and generated output." }), _jsx(Text, { color: "gray", children: "The software is provided as-is, without warranty or liability from the maintainer." }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: "Press [y] to accept and continue" }), _jsxs(Text, { color: "gray", children: [" ", symbols.bullet, " Esc goes back"] })] })] }));
67
119
  }
68
120
  function providerLabel(provider) {
69
- return provider === "openrouter" ? "OpenRouter" : provider === "nvidia" ? "NVIDIA" : "Gemini";
121
+ return provider === "openrouter" ? "OpenRouter" : provider === "nvidia" ? "NVIDIA" : provider === "gemini-wrapper" ? "Gemini-Wrapper" : "Gemini";
122
+ }
123
+ function PreferencesStep(props) {
124
+ const rows = preferenceRows;
125
+ const confirmIndex = rows.length;
126
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "white", bold: true, children: "Tune your defaults" }), _jsxs(Text, { color: "gray", children: [symbols.final, " ", props.provider, " ", symbols.bullet, " ", props.model] }), _jsxs(Text, { color: "gray", children: [symbols.arrow, " up/down to move ", symbols.bullet, " left/right to change ", symbols.bullet, " enter to finish"] }), rows.map((row, index) => {
127
+ const isSelected = index === props.selectedIndex;
128
+ const value = preferenceValueString(props.preferences, row.key);
129
+ return (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: 3, children: _jsx(Text, { color: isSelected ? "cyan" : "gray", children: isSelected ? symbols.todoActive : " " }) }), _jsx(Box, { width: 30, children: _jsx(Text, { color: isSelected ? "white" : "gray", bold: isSelected, children: row.label }) }), _jsxs(Text, { color: isSelected ? "cyan" : "gray", bold: true, children: [isSelected ? `${symbols.arrow} ` : " ", value] })] }), isSelected ? (_jsx(Box, { marginLeft: 3, children: _jsx(Text, { color: "gray", children: describePreferenceValue(row.key, value) }) })) : null] }, row.key));
130
+ }), _jsxs(Box, { marginTop: 1, flexDirection: "row", children: [_jsx(Box, { width: 3, children: _jsx(Text, { color: props.selectedIndex === confirmIndex ? "green" : "gray", children: props.selectedIndex === confirmIndex ? symbols.todoActive : " " }) }), _jsxs(Text, { color: props.selectedIndex === confirmIndex ? "green" : "gray", bold: props.selectedIndex === confirmIndex, children: [symbols.final, " Finish setup and start session"] })] })] }));
70
131
  }
71
132
  function InputStep(props) {
72
- return (_jsxs(Box, { flexDirection: "column", marginTop: 2, children: [_jsx(Text, { color: "white", bold: true, children: props.title }), _jsx(Text, { color: "gray", children: props.description }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "cyan", children: props.prompt }), _jsx(TextInput, { value: props.value, onChange: props.onChange, onSubmit: props.onSubmit, mask: props.mask })] })] }));
133
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "white", bold: true, children: props.title }), _jsx(Text, { color: "gray", children: props.description }), _jsxs(Box, { marginTop: 1, children: [_jsxs(Text, { color: "cyan", children: [symbols.user, " ", props.prompt] }), _jsx(TextInput, { value: props.value, onChange: props.onChange, onSubmit: props.onSubmit, mask: props.mask })] })] }));
73
134
  }
74
135
  function SelectionList(props) {
75
136
  const startIndex = Math.max(0, Math.min(props.selectedIndex - 4, Math.max(0, props.rows.length - 8)));
76
137
  const visibleRows = props.rows.slice(startIndex, startIndex + 8);
77
- return (_jsxs(Box, { flexDirection: "column", marginTop: 2, children: [_jsx(Text, { color: "white", bold: true, children: props.title }), _jsx(Text, { color: "gray", children: props.subtitle }), visibleRows.map((row, index) => {
138
+ const endIndex = startIndex + visibleRows.length;
139
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [props.title ? (_jsx(Text, { color: "white", bold: true, children: props.title })) : null, _jsxs(Text, { color: "gray", children: [props.subtitle, " ", props.rows.length > 0 ? `${startIndex + 1}-${endIndex}/${props.rows.length}` : "0/0"] }), visibleRows.map((row, index) => {
78
140
  const absoluteIndex = startIndex + index;
79
141
  const isSelected = absoluteIndex === props.selectedIndex;
80
- return (_jsxs(Box, { marginTop: 1, children: [_jsx(Box, { width: 3, children: _jsx(Text, { color: isSelected ? "cyan" : "gray", children: isSelected ? ">" : " " }) }), _jsx(Box, { width: 28, children: _jsx(Text, { color: isSelected ? "white" : "cyan", bold: isSelected, wrap: "truncate", children: row.label }) }), _jsx(Text, { color: isSelected ? "white" : "gray", wrap: "truncate", children: row.description })] }, `${absoluteIndex}-${row.label}`));
142
+ return (_jsxs(Box, { marginTop: 1, children: [_jsx(Box, { width: 3, children: _jsx(Text, { color: isSelected ? "cyan" : "gray", children: isSelected ? symbols.todoActive : " " }) }), _jsx(Box, { width: 28, children: _jsx(Text, { color: isSelected ? "white" : "cyan", bold: isSelected, wrap: "truncate", children: row.label }) }), _jsx(Text, { color: isSelected ? "white" : "gray", wrap: "truncate", children: row.description })] }, `${absoluteIndex}-${row.label}`));
81
143
  })] }));
82
144
  }
83
145
  //# sourceMappingURL=OnboardingPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OnboardingPanel.js","sourceRoot":"","sources":["../../../src/tui/components/OnboardingPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OnboardingPanel.js","sourceRoot":"","sources":["../../../src/tui/components/OnboardingPanel.tsx"],"names":[],"mappings":"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"}
@@ -3,7 +3,11 @@ import { Box, Text } from "ink";
3
3
  import { formatCost, formatGpuMemory, formatGpuUtilization, formatOllamaHost, formatSessionTokens, formatTokens, shortenMiddle } from "../format.js";
4
4
  import { modeDescription, modePermissionLabel } from "../modes.js";
5
5
  export function Sidebar(props) {
6
- const rows = buildSidebarRows(props).slice(0, Math.max(1, props.height - 2));
6
+ const allRows = buildSidebarRows(props);
7
+ const visibleCount = Math.max(1, props.height - 2);
8
+ const maxOffset = Math.max(0, allRows.length - visibleCount);
9
+ const offset = Math.max(0, Math.min(props.scrollOffset, maxOffset));
10
+ const rows = allRows.slice(offset, offset + visibleCount);
7
11
  return (_jsx(Box, { width: 32, height: props.height, overflowY: "hidden", borderStyle: "round", borderColor: props.isActive ? "cyan" : "gray", flexDirection: "column", paddingX: 1, marginRight: 1, children: rows.map((row, index) => (_jsx(Text, { color: row.color, bold: row.bold, wrap: "truncate", children: row.text }, `${index}-${row.text}`))) }));
8
12
  }
9
13
  function buildSidebarRows(props) {
@@ -22,29 +26,29 @@ function buildSidebarRows(props) {
22
26
  row("agents", props.subagents ? "on" : "off", props.subagents ? "cyan" : "gray"),
23
27
  spacer(),
24
28
  section("Permissions"),
25
- row("mode", formatMode(props.agentMode), modeColor(props.agentMode)),
26
29
  muted(modeDescription(props.agentMode)),
27
- row("write", modePermissionLabel(props.agentMode, "write"), permissionColor(props.agentMode)),
28
- row("shell", modePermissionLabel(props.agentMode, "shell"), permissionColor(props.agentMode)),
30
+ row("write", modePermissionLabel(props.agentMode, "write", props), permissionColor(props.agentMode, props.allowWrite)),
31
+ row("shell", modePermissionLabel(props.agentMode, "shell", props), permissionColor(props.agentMode, props.allowShell)),
29
32
  spacer(),
30
33
  section("Model"),
31
34
  row("provider", props.provider, props.provider === "ollama" ? "green" : "cyan"),
32
35
  muted(shortenMiddle(props.model, 28)),
33
36
  spacer(),
34
- section("Host"),
35
- row("device", shortenMiddle(hostDeviceName, 19), "yellow"),
37
+ section(props.provider === "ollama" ? "Host" : "Route"),
38
+ row("target", shortenMiddle(hostDeviceName, 19), "yellow"),
36
39
  row("network", hostNetwork, "green"),
37
40
  muted(shortenMiddle(hostRoute, 28)),
38
- muted(`ver ${hostVersion} models ${hostModels}`),
39
- muted(`loaded ${shortenMiddle(hostLoaded, 21)}`),
41
+ ...(props.provider === "ollama" ? [muted(`ver ${hostVersion} models ${hostModels}`), muted(`loaded ${shortenMiddle(hostLoaded, 21)}`)] : []),
40
42
  spacer(),
41
43
  section("Workspace"),
42
44
  muted(shortenMiddle(props.workspace, 28)),
43
45
  spacer(),
44
- section("Runtime"),
46
+ section("Local machine"),
45
47
  muted(`cpu ${props.systemStats.cpuPercent}% mem ${props.systemStats.memoryPercent}%/${props.systemStats.usedMemoryGb}G`),
46
- muted(`gpu ${formatGpuUtilization(props.gpuStats)} vram ${formatGpuMemory(props.gpuStats)}`),
47
- muted(`draft ${props.draftTokens} tok`),
48
+ ...(props.provider === "ollama" && props.gpuStats ? [muted(`gpu ${formatGpuUtilization(props.gpuStats)} vram ${formatGpuMemory(props.gpuStats)}`)] : []),
49
+ muted(`draft prompt ${props.draftTokens} tok`),
50
+ spacer(),
51
+ section("Model usage"),
48
52
  ...telemetryRows,
49
53
  muted(formatCost(props.sessionTelemetry.estimatedCostUsd)),
50
54
  spacer(),
@@ -73,8 +77,8 @@ function modeColor(agentMode) {
73
77
  }
74
78
  return agentMode === "build" ? "yellow" : "green";
75
79
  }
76
- function permissionColor(agentMode) {
77
- if (agentMode === "bypass") {
80
+ function permissionColor(agentMode, enabled = false) {
81
+ if (enabled || agentMode === "bypass") {
78
82
  return "red";
79
83
  }
80
84
  return agentMode === "build" ? "yellow" : "gray";
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/tui/components/Sidebar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/tui/components/Sidebar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAiB,MAAM,cAAc,CAAC;AAEpK,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAUnE,MAAM,UAAU,OAAO,CAAC,KAqBvB;IACC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC;IAE1D,OAAO,CACL,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAC,QAAQ,EAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,YAC3K,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,KAAC,IAAI,IAA8B,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAC,UAAU,YACjF,GAAG,CAAC,IAAI,IADA,GAAG,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,CAE1B,CACR,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAkBzB;IACC,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,MAAM,CAAC;IACtJ,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,QAAQ,CAAC;IAC1H,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACnG,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC;IAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1F,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACzJ,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpF,MAAM,IAAI,GAAkB;QAC1B,OAAO,CAAC,SAAS,CAAC;QAClB,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,KAAK,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QACnJ,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpE,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAC1D,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAChF,MAAM,EAAE;QACR,OAAO,CAAC,aAAa,CAAC;QACtB,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,GAAG,CAAC,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACtH,GAAG,CAAC,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACtH,MAAM,EAAE;QACR,OAAO,CAAC,OAAO,CAAC;QAChB,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/E,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,EAAE;QACR,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACvD,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC;QAC1D,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC;QACpC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnC,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,YAAY,UAAU,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7I,MAAM,EAAE;QACR,OAAO,CAAC,WAAW,CAAC;QACpB,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,EAAE;QACR,OAAO,CAAC,eAAe,CAAC;QACxB,KAAK,CAAC,OAAO,KAAK,CAAC,WAAW,CAAC,UAAU,UAAU,KAAK,CAAC,WAAW,CAAC,aAAa,KAAK,KAAK,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC;QACzH,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzJ,KAAK,CAAC,gBAAgB,KAAK,CAAC,WAAW,MAAM,CAAC;QAC9C,MAAM,EAAE;QACR,OAAO,CAAC,aAAa,CAAC;QACtB,GAAG,aAAa;QAChB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC1D,MAAM,EAAE;QACR,OAAO,CAAC,UAAU,CAAC;KACpB,CAAC;IAEF,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,SAAoB;IACtC,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,SAAS,SAAS,CAAC,SAAoB;IACrC,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CAAC,SAAoB,EAAE,OAAO,GAAG,KAAK;IAC5D,IAAI,OAAO,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,IAAI;KACX,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,KAAe;IACxD,OAAO;QACL,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE;QAClC,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,MAAM;KACd,CAAC;AACJ,CAAC;AAED,SAAS,MAAM;IACb,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK;SAClB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SAClD,MAAM,CAAC,OAAO,CAAC;SACf,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,IAAI,wCAAwC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAiD;IAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAgC,EAAE,gBAAkC;IAChG,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,OAAO,KAAK;SACT,KAAK,CAAC,OAAO,CAAC;SACd,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5D,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;YAC5B,UAAU,GAAG,OAAO,CAAC;YACrB,SAAS;QACX,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ export declare function StartupBanner(props: {
3
+ compact?: boolean;
4
+ }): React.ReactElement;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ export function StartupBanner(props) {
4
+ if (props.compact) {
5
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "PatchPilot" }), _jsx(Text, { color: "gray", children: "Local-first. Permissioned. Easy to review." })] }));
6
+ }
7
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: "cyan", children: " ____ _ _ ____ _ _ _ " }), _jsx(Text, { color: "cyan", children: " | _ \\ __ _| |_ ___| |__ | _ \\(_) | ___ | |_ " }), _jsx(Text, { color: "cyan", children: " | |_) / _` | __/ __| '_ \\| |_) | | |/ _ \\| __|" }), _jsx(Text, { color: "cyan", children: " | __/ (_| | || (__| | | | __/| | | (_) | |_ " }), _jsx(Text, { color: "cyan", children: " |_| \\__,_|\\__\\___|_| |_|_| |_|_|\\___/ \\__|" }), _jsx(Text, { color: "gray", children: " " }), _jsx(Text, { color: "cyan", children: " .------. Local-first coding agent" }), _jsx(Text, { color: "cyan", children: " / o o \\ Permissioned tools" }), _jsx(Text, { color: "cyan", children: " | __ | Visible diffs and approvals" }), _jsx(Text, { color: "cyan", children: " | _| |_ |" }), _jsx(Text, { color: "cyan", children: " '._\\____/_.'' [wrench-ready]" }), _jsx(Text, { color: "gray", children: " " }), _jsx(Text, { color: "gray", children: "Start with a task, type /onboarding, or ask what PatchPilot can do." })] }));
8
+ }
9
+ //# sourceMappingURL=StartupBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StartupBanner.js","sourceRoot":"","sources":["../../../src/tui/components/StartupBanner.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,UAAU,aAAa,CAAC,KAE7B;IACC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,iCAAkB,EACzC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,2DAAkD,IAChE,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,sEAA6D,EAC/E,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wEAA6D,EAC/E,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wEAA6D,EAC/E,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,sEAA6D,EAC/E,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,2EAA6D,EAC/E,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAS,EAC3B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,qEAA4D,EAC9E,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,gEAAsD,EACxE,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wEAA+D,EACjF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wCAA+B,EACjD,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,4DAAkD,EACpE,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAS,EAC3B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oFAA2E,IACzF,CACP,CAAC;AACJ,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
2
  import type { LogLine } from "../types.js";
3
+ import type { AgentTodoItem, AgentWorkState } from "../../core/types.js";
3
4
  export declare function Transcript(props: {
4
5
  lines: LogLine[];
5
6
  isRunning: boolean;
@@ -7,4 +8,10 @@ export declare function Transcript(props: {
7
8
  height: number;
8
9
  width: number;
9
10
  scrollOffset: number;
11
+ todos?: AgentTodoItem[];
12
+ todoFrame?: number;
13
+ verbIndex?: number;
14
+ status: string;
15
+ workState: AgentWorkState;
16
+ isApprovalWaiting?: boolean;
10
17
  }): React.ReactElement;
@@ -1,14 +1,34 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Box, Text } from "ink";
3
3
  import { toneToColor, toneToMarker } from "../format.js";
4
+ import { formatWorkingStatus } from "../layout.js";
5
+ import { StartupBanner } from "./StartupBanner.js";
4
6
  export function Transcript(props) {
5
- const rows = props.lines.length === 0 ? emptyRows() : buildTranscriptRows(props.lines, props.width);
7
+ const rows = buildTranscriptRows(props.lines, props.width);
6
8
  const visibleRowCount = Math.max(1, props.height - 2);
7
- const hasOverflow = rows.length > visibleRowCount;
8
- const contentRowCount = hasOverflow ? Math.max(1, visibleRowCount - 1) : visibleRowCount;
9
- const clampedOffset = clampScrollOffset(props.scrollOffset, rows.length, contentRowCount);
10
- const visibleRows = rows.slice(Math.max(0, rows.length - contentRowCount - clampedOffset), rows.length - clampedOffset);
11
- return (_jsxs(Box, { borderStyle: "round", borderColor: props.isActive ? "cyan" : props.isRunning ? "yellow" : "gray", flexDirection: "column", paddingX: 1, height: props.height, overflowY: "hidden", flexGrow: 1, children: [visibleRows.map((row, index) => (_jsx(TranscriptRowView, { row: row }, `${index}-${row.marker}-${row.label}-${row.text}`))), hasOverflow ? _jsx(ScrollHint, { offset: clampedOffset, total: rows.length, visible: contentRowCount }) : null] }));
9
+ const todoRows = buildTodoRows(props.todos ?? [], props.width, props.todoFrame ?? 0);
10
+ const dockRows = buildDockRows({
11
+ isRunning: props.isRunning,
12
+ isApprovalWaiting: Boolean(props.isApprovalWaiting),
13
+ status: props.status,
14
+ workState: props.workState,
15
+ todos: props.todos ?? [],
16
+ width: props.width,
17
+ verbIndex: props.verbIndex ?? 0
18
+ });
19
+ // The todo block and the run/approval dock stay pinned at the bottom; the
20
+ // content region above them flexes to fill whatever is left. The dock is
21
+ // capped so it can never crowd out the transcript on a tiny terminal.
22
+ const auxRows = [...todoRows, ...dockRows];
23
+ const reservedAuxRows = Math.min(auxRows.length, Math.max(0, visibleRowCount - 1));
24
+ const visibleAuxRows = auxRows.slice(0, reservedAuxRows);
25
+ const contentRowCount = Math.max(1, visibleRowCount - reservedAuxRows);
26
+ const hasOverflow = rows.length > contentRowCount;
27
+ const clampedOffset = clampScrollOffset(props.scrollOffset, rows.length, hasOverflow ? contentRowCount - 1 : contentRowCount);
28
+ const contentCapacity = hasOverflow ? Math.max(1, contentRowCount - 1) : contentRowCount;
29
+ const visibleRows = rows.slice(Math.max(0, rows.length - contentCapacity - clampedOffset), rows.length - clampedOffset);
30
+ const showBanner = props.lines.length === 0 && visibleRows.length === 0;
31
+ return (_jsxs(Box, { borderStyle: "round", borderColor: props.isActive ? "cyan" : props.isRunning ? "yellow" : "gray", flexDirection: "column", paddingX: 1, height: props.height, overflowY: "hidden", children: [_jsxs(Box, { flexDirection: "column", flexGrow: 1, overflowY: "hidden", children: [showBanner ? (_jsx(StartupBanner, { compact: props.height < 22 || props.width < 92 })) : (visibleRows.map((row, index) => _jsx(TranscriptRowView, { row: row }, `row-${index}`))), hasOverflow ? _jsx(ScrollHint, { offset: clampedOffset, total: rows.length, visible: contentCapacity }) : null] }), visibleAuxRows.length > 0 ? (_jsx(Box, { flexDirection: "column", children: visibleAuxRows.map((row, index) => (_jsx(TranscriptRowView, { row: row }, `aux-${index}`))) })) : null] }));
12
32
  }
13
33
  function TranscriptRowView(props) {
14
34
  return (_jsxs(Box, { children: [_jsx(Box, { width: 3, children: _jsx(Text, { color: props.row.color, dimColor: props.row.dim, children: props.row.marker }) }), _jsx(Box, { width: 14, children: _jsx(Text, { color: props.row.color, bold: props.row.bold, dimColor: props.row.dim, children: props.row.label }) }), _jsx(Text, { color: props.row.color, wrap: "truncate", dimColor: props.row.dim, children: props.row.text })] }));
@@ -40,7 +60,7 @@ function buildTranscriptRows(lines, width) {
40
60
  label: "",
41
61
  text,
42
62
  color: "gray",
43
- dim: line.kind !== "approval" && line.kind !== "error"
63
+ dim: false
44
64
  })));
45
65
  if (detailRows.length > 0) {
46
66
  rows.push({
@@ -53,21 +73,65 @@ function buildTranscriptRows(lines, width) {
53
73
  return rows;
54
74
  });
55
75
  }
56
- function emptyRows() {
57
- return [
76
+ function buildTodoRows(todos, width, frame) {
77
+ if (todos.length === 0) {
78
+ return [];
79
+ }
80
+ const textWidth = Math.max(18, width - 19);
81
+ const spinner = ["-", "\\", "|", "/"][frame % 4] ?? "-";
82
+ const rows = [
58
83
  {
59
84
  marker: "",
60
- label: "",
61
- text: "No session activity yet.",
62
- color: "gray"
63
- },
64
- {
85
+ label: "todos",
86
+ text: `${todos.filter((todo) => todo.status === "completed").length}/${todos.length} complete`,
87
+ color: "cyan",
88
+ bold: true
89
+ }
90
+ ];
91
+ for (const todo of todos.slice(0, 8)) {
92
+ const marker = todo.status === "completed" ? "[x]" : todo.status === "in_progress" ? `[${spinner}]` : "[ ]";
93
+ const color = todo.status === "completed" ? "green" : todo.status === "in_progress" ? "yellow" : "gray";
94
+ rows.push({
65
95
  marker: "",
66
- label: "",
96
+ label: marker,
97
+ text: truncate(todo.content, textWidth),
98
+ color,
99
+ bold: todo.status === "in_progress",
100
+ dim: todo.status === "pending"
101
+ });
102
+ }
103
+ return rows;
104
+ }
105
+ function buildDockRows(options) {
106
+ const textWidth = Math.max(18, options.width - 19);
107
+ const rows = [];
108
+ if (options.isApprovalWaiting) {
109
+ rows.push({
110
+ marker: "?",
111
+ label: "approval",
112
+ text: "Review the request below. Session approvals are scoped to the concrete target.",
113
+ color: "yellow",
114
+ bold: true
115
+ });
116
+ }
117
+ if (options.isRunning) {
118
+ rows.push({
119
+ marker: "#",
120
+ label: "run",
121
+ text: truncate(formatWorkingStatus(options.workState, options.verbIndex, options.status), textWidth),
122
+ color: "cyan",
123
+ bold: true
124
+ });
125
+ }
126
+ if (options.todos.length === 0 && !options.isRunning && !options.isApprovalWaiting) {
127
+ rows.push({
128
+ marker: "",
129
+ label: "ready",
67
130
  text: "Ask for a repo summary, a focused patch, or type /help.",
68
131
  color: "gray"
69
- }
70
- ];
132
+ });
133
+ }
134
+ return rows;
71
135
  }
72
136
  function markerForBlock(line) {
73
137
  switch (line.kind) {
@@ -118,6 +182,12 @@ function colorForBlock(line) {
118
182
  function clampScrollOffset(offset, rowCount, visibleRowCount) {
119
183
  return Math.max(0, Math.min(offset, Math.max(0, rowCount - visibleRowCount)));
120
184
  }
185
+ function truncate(value, width) {
186
+ if (value.length <= width) {
187
+ return value;
188
+ }
189
+ return `${value.slice(0, Math.max(0, width - 3))}...`;
190
+ }
121
191
  function wrapText(value, width) {
122
192
  const rows = value
123
193
  .split(/\r?\n/)