@agimon-ai/doompi-ui 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (327) hide show
  1. package/README.md +21 -18
  2. package/dist/_virtual/_rolldown/runtime.cjs +1 -1
  3. package/dist/adapters/pi/extension.cjs +2 -0
  4. package/dist/adapters/pi/extension.cjs.map +1 -0
  5. package/dist/adapters/pi/extension.d.cts +7 -0
  6. package/dist/adapters/pi/extension.d.cts.map +1 -0
  7. package/dist/adapters/pi/extension.d.mts +7 -0
  8. package/dist/adapters/pi/extension.d.mts.map +1 -0
  9. package/dist/adapters/pi/extension.mjs +2 -0
  10. package/dist/adapters/pi/extension.mjs.map +1 -0
  11. package/dist/adapters/pi/extensionName.cjs +2 -0
  12. package/dist/adapters/pi/extensionName.cjs.map +1 -0
  13. package/dist/adapters/pi/extensionName.d.cts +16 -0
  14. package/dist/adapters/pi/extensionName.d.cts.map +1 -0
  15. package/dist/adapters/pi/extensionName.d.mts +16 -0
  16. package/dist/adapters/pi/extensionName.d.mts.map +1 -0
  17. package/dist/adapters/pi/extensionName.mjs +2 -0
  18. package/dist/adapters/pi/extensionName.mjs.map +1 -0
  19. package/dist/adapters/pi/toolOverrides.cjs +2 -0
  20. package/dist/adapters/pi/toolOverrides.cjs.map +1 -0
  21. package/dist/adapters/pi/toolOverrides.mjs +2 -0
  22. package/dist/adapters/pi/toolOverrides.mjs.map +1 -0
  23. package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
  24. package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
  25. package/dist/adapters/telemetry/logSinkTelemetry.d.cts +29 -0
  26. package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
  27. package/dist/adapters/telemetry/logSinkTelemetry.d.mts +29 -0
  28. package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
  29. package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
  30. package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
  31. package/dist/components/configOverlay.cjs +0 -0
  32. package/dist/components/configOverlay.d.cts +0 -0
  33. package/dist/components/configOverlay.d.mts +0 -0
  34. package/dist/components/configOverlay.mjs +0 -0
  35. package/dist/components/doomEditor.cjs +1 -2
  36. package/dist/components/doomEditor.d.cts +2 -59
  37. package/dist/components/doomEditor.d.mts +2 -59
  38. package/dist/components/doomEditor.mjs +1 -2
  39. package/dist/components/doomFooter.cjs +1 -2
  40. package/dist/components/doomFooter.d.cts +2 -32
  41. package/dist/components/doomFooter.d.mts +2 -32
  42. package/dist/components/doomFooter.mjs +1 -2
  43. package/dist/components/doomHeader.cjs +1 -2
  44. package/dist/components/doomHeader.d.cts +2 -34
  45. package/dist/components/doomHeader.d.mts +2 -34
  46. package/dist/components/doomHeader.mjs +1 -2
  47. package/dist/components/doomOverlay.cjs +1 -2
  48. package/dist/components/doomOverlay.d.cts +2 -79
  49. package/dist/components/doomOverlay.d.mts +2 -79
  50. package/dist/components/doomOverlay.mjs +1 -2
  51. package/dist/components/leaderHints.cjs +1 -2
  52. package/dist/components/leaderHints.d.cts +2 -37
  53. package/dist/components/leaderHints.d.mts +2 -37
  54. package/dist/components/leaderHints.mjs +1 -2
  55. package/dist/components/toolsOverlay.cjs +1 -2
  56. package/dist/components/toolsOverlay.d.cts +2 -29
  57. package/dist/components/toolsOverlay.d.mts +2 -29
  58. package/dist/components/toolsOverlay.mjs +1 -2
  59. package/dist/config.cjs +1 -2
  60. package/dist/config.d.cts +2 -5
  61. package/dist/config.d.mts +2 -5
  62. package/dist/config.mjs +1 -2
  63. package/dist/extension.cjs +1 -2
  64. package/dist/extension.d.cts +2 -7
  65. package/dist/extension.d.mts +2 -7
  66. package/dist/extension.mjs +1 -2
  67. package/dist/extensionName.cjs +1 -2
  68. package/dist/extensionName.d.cts +2 -5
  69. package/dist/extensionName.d.mts +2 -5
  70. package/dist/extensionName.mjs +1 -2
  71. package/dist/extensions/pi.cjs +1 -1
  72. package/dist/extensions/pi.cjs.map +1 -1
  73. package/dist/extensions/pi.d.cts +1 -1
  74. package/dist/extensions/pi.d.mts +1 -1
  75. package/dist/extensions/pi.mjs +1 -1
  76. package/dist/extensions/pi.mjs.map +1 -1
  77. package/dist/footer.cjs +1 -2
  78. package/dist/footer.d.cts +2 -5
  79. package/dist/footer.d.mts +2 -5
  80. package/dist/footer.mjs +1 -2
  81. package/dist/harnessMetadata.cjs +1 -2
  82. package/dist/harnessMetadata.d.cts +2 -21
  83. package/dist/harnessMetadata.d.mts +2 -21
  84. package/dist/harnessMetadata.mjs +1 -2
  85. package/dist/index.cjs +1 -1
  86. package/dist/index.d.cts +14 -25
  87. package/dist/index.d.mts +14 -25
  88. package/dist/index.mjs +1 -1
  89. package/dist/leaderRegistry.cjs +1 -2
  90. package/dist/leaderRegistry.d.cts +2 -58
  91. package/dist/leaderRegistry.d.mts +2 -58
  92. package/dist/leaderRegistry.mjs +1 -2
  93. package/dist/logSinkTelemetry.cjs +1 -2
  94. package/dist/logSinkTelemetry.d.cts +2 -29
  95. package/dist/logSinkTelemetry.d.mts +2 -29
  96. package/dist/logSinkTelemetry.mjs +1 -2
  97. package/dist/rendering.cjs +1 -2
  98. package/dist/rendering.d.cts +2 -11
  99. package/dist/rendering.d.mts +2 -11
  100. package/dist/rendering.mjs +1 -2
  101. package/dist/services/leader/leaderRegistry.cjs +2 -0
  102. package/dist/services/leader/leaderRegistry.cjs.map +1 -0
  103. package/dist/services/leader/leaderRegistry.d.cts +58 -0
  104. package/dist/services/leader/leaderRegistry.d.cts.map +1 -0
  105. package/dist/services/leader/leaderRegistry.d.mts +58 -0
  106. package/dist/services/leader/leaderRegistry.d.mts.map +1 -0
  107. package/dist/services/leader/leaderRegistry.mjs +2 -0
  108. package/dist/services/leader/leaderRegistry.mjs.map +1 -0
  109. package/dist/services/state/uiState.cjs +2 -0
  110. package/dist/services/state/uiState.cjs.map +1 -0
  111. package/dist/services/state/uiState.d.cts +38 -0
  112. package/dist/services/state/uiState.d.cts.map +1 -0
  113. package/dist/services/state/uiState.d.mts +38 -0
  114. package/dist/services/state/uiState.d.mts.map +1 -0
  115. package/dist/services/state/uiState.mjs +2 -0
  116. package/dist/services/state/uiState.mjs.map +1 -0
  117. package/dist/services/tools/toolInventory.cjs +2 -0
  118. package/dist/services/tools/toolInventory.cjs.map +1 -0
  119. package/dist/services/tools/toolInventory.d.cts +51 -0
  120. package/dist/services/tools/toolInventory.d.cts.map +1 -0
  121. package/dist/services/tools/toolInventory.d.mts +51 -0
  122. package/dist/services/tools/toolInventory.d.mts.map +1 -0
  123. package/dist/services/tools/toolInventory.mjs +2 -0
  124. package/dist/services/tools/toolInventory.mjs.map +1 -0
  125. package/dist/skills.cjs +1 -1
  126. package/dist/skills.d.cts +2 -1
  127. package/dist/skills.d.mts +2 -1
  128. package/dist/skills.mjs +1 -1
  129. package/dist/theme.cjs +1 -2
  130. package/dist/theme.d.cts +2 -95
  131. package/dist/theme.d.mts +2 -95
  132. package/dist/theme.mjs +1 -2
  133. package/dist/toolChrome.cjs +1 -0
  134. package/dist/toolChrome.d.cts +2 -0
  135. package/dist/toolChrome.d.mts +2 -0
  136. package/dist/toolChrome.mjs +1 -0
  137. package/dist/toolInventory.cjs +1 -2
  138. package/dist/toolInventory.d.cts +2 -40
  139. package/dist/toolInventory.d.mts +2 -40
  140. package/dist/toolInventory.mjs +1 -2
  141. package/dist/tui/builtinToolRender.cjs +14 -0
  142. package/dist/tui/builtinToolRender.cjs.map +1 -0
  143. package/dist/tui/builtinToolRender.mjs +14 -0
  144. package/dist/tui/builtinToolRender.mjs.map +1 -0
  145. package/dist/tui/codeGutter.cjs +2 -0
  146. package/dist/tui/codeGutter.cjs.map +1 -0
  147. package/dist/tui/codeGutter.mjs +2 -0
  148. package/dist/tui/codeGutter.mjs.map +1 -0
  149. package/dist/tui/configOverlay.cjs +0 -0
  150. package/dist/tui/configOverlay.cjs.map +1 -0
  151. package/dist/tui/configOverlay.d.cts +0 -0
  152. package/dist/tui/configOverlay.d.cts.map +1 -0
  153. package/dist/tui/configOverlay.d.mts +0 -0
  154. package/dist/tui/configOverlay.d.mts.map +1 -0
  155. package/dist/tui/configOverlay.mjs +0 -0
  156. package/dist/tui/configOverlay.mjs.map +1 -0
  157. package/dist/tui/diffRender.cjs +4 -0
  158. package/dist/tui/diffRender.cjs.map +1 -0
  159. package/dist/tui/diffRender.mjs +4 -0
  160. package/dist/tui/diffRender.mjs.map +1 -0
  161. package/dist/tui/doomEditor.cjs +2 -0
  162. package/dist/tui/doomEditor.cjs.map +1 -0
  163. package/dist/tui/doomEditor.d.cts +63 -0
  164. package/dist/tui/doomEditor.d.cts.map +1 -0
  165. package/dist/tui/doomEditor.d.mts +63 -0
  166. package/dist/tui/doomEditor.d.mts.map +1 -0
  167. package/dist/tui/doomEditor.mjs +2 -0
  168. package/dist/tui/doomEditor.mjs.map +1 -0
  169. package/dist/tui/doomFooter.cjs +2 -0
  170. package/dist/tui/doomFooter.cjs.map +1 -0
  171. package/dist/tui/doomFooter.d.cts +32 -0
  172. package/dist/tui/doomFooter.d.cts.map +1 -0
  173. package/dist/tui/doomFooter.d.mts +32 -0
  174. package/dist/tui/doomFooter.d.mts.map +1 -0
  175. package/dist/tui/doomFooter.mjs +2 -0
  176. package/dist/tui/doomFooter.mjs.map +1 -0
  177. package/dist/tui/doomHeader.cjs +2 -0
  178. package/dist/tui/doomHeader.cjs.map +1 -0
  179. package/dist/tui/doomHeader.d.cts +34 -0
  180. package/dist/tui/doomHeader.d.cts.map +1 -0
  181. package/dist/tui/doomHeader.d.mts +34 -0
  182. package/dist/tui/doomHeader.d.mts.map +1 -0
  183. package/dist/tui/doomHeader.mjs +2 -0
  184. package/dist/tui/doomHeader.mjs.map +1 -0
  185. package/dist/tui/doomOverlay.cjs +2 -0
  186. package/dist/tui/doomOverlay.cjs.map +1 -0
  187. package/dist/tui/doomOverlay.d.cts +84 -0
  188. package/dist/tui/doomOverlay.d.cts.map +1 -0
  189. package/dist/tui/doomOverlay.d.mts +84 -0
  190. package/dist/tui/doomOverlay.d.mts.map +1 -0
  191. package/dist/tui/doomOverlay.mjs +2 -0
  192. package/dist/tui/doomOverlay.mjs.map +1 -0
  193. package/dist/tui/leaderHints.cjs +2 -0
  194. package/dist/tui/leaderHints.cjs.map +1 -0
  195. package/dist/tui/leaderHints.d.cts +36 -0
  196. package/dist/tui/leaderHints.d.cts.map +1 -0
  197. package/dist/tui/leaderHints.d.mts +36 -0
  198. package/dist/tui/leaderHints.d.mts.map +1 -0
  199. package/dist/tui/leaderHints.mjs +2 -0
  200. package/dist/tui/leaderHints.mjs.map +1 -0
  201. package/dist/tui/rendering.cjs +2 -0
  202. package/dist/tui/rendering.cjs.map +1 -0
  203. package/dist/tui/rendering.d.cts +16 -0
  204. package/dist/tui/rendering.d.cts.map +1 -0
  205. package/dist/tui/rendering.d.mts +16 -0
  206. package/dist/tui/rendering.d.mts.map +1 -0
  207. package/dist/tui/rendering.mjs +2 -0
  208. package/dist/tui/rendering.mjs.map +1 -0
  209. package/dist/tui/theme.cjs +2 -0
  210. package/dist/tui/theme.cjs.map +1 -0
  211. package/dist/tui/theme.d.cts +103 -0
  212. package/dist/tui/theme.d.cts.map +1 -0
  213. package/dist/tui/theme.d.mts +103 -0
  214. package/dist/tui/theme.d.mts.map +1 -0
  215. package/dist/tui/theme.mjs +2 -0
  216. package/dist/tui/theme.mjs.map +1 -0
  217. package/dist/tui/toolChrome.cjs +2 -0
  218. package/dist/tui/toolChrome.cjs.map +1 -0
  219. package/dist/tui/toolChrome.d.cts +30 -0
  220. package/dist/tui/toolChrome.d.cts.map +1 -0
  221. package/dist/tui/toolChrome.d.mts +30 -0
  222. package/dist/tui/toolChrome.d.mts.map +1 -0
  223. package/dist/tui/toolChrome.mjs +2 -0
  224. package/dist/tui/toolChrome.mjs.map +1 -0
  225. package/dist/tui/toolsOverlay.cjs +2 -0
  226. package/dist/tui/toolsOverlay.cjs.map +1 -0
  227. package/dist/tui/toolsOverlay.d.cts +29 -0
  228. package/dist/tui/toolsOverlay.d.cts.map +1 -0
  229. package/dist/tui/toolsOverlay.d.mts +29 -0
  230. package/dist/tui/toolsOverlay.d.mts.map +1 -0
  231. package/dist/tui/toolsOverlay.mjs +2 -0
  232. package/dist/tui/toolsOverlay.mjs.map +1 -0
  233. package/dist/types/harnessMetadata.cjs +2 -0
  234. package/dist/types/harnessMetadata.cjs.map +1 -0
  235. package/dist/types/harnessMetadata.d.cts +21 -0
  236. package/dist/types/harnessMetadata.d.cts.map +1 -0
  237. package/dist/types/harnessMetadata.d.mts +21 -0
  238. package/dist/types/harnessMetadata.d.mts.map +1 -0
  239. package/dist/types/harnessMetadata.mjs +2 -0
  240. package/dist/types/harnessMetadata.mjs.map +1 -0
  241. package/dist/uiState.cjs +1 -2
  242. package/dist/uiState.d.cts +2 -37
  243. package/dist/uiState.d.mts +2 -37
  244. package/dist/uiState.mjs +1 -2
  245. package/package.json +19 -12
  246. package/themes/doom-pi-dark.json +32 -30
  247. package/dist/_virtual/_rolldown/runtime.mjs +0 -1
  248. package/dist/components/configOverlay.cjs.map +0 -1
  249. package/dist/components/configOverlay.d.cts.map +0 -1
  250. package/dist/components/configOverlay.d.mts.map +0 -1
  251. package/dist/components/configOverlay.mjs.map +0 -1
  252. package/dist/components/doomEditor.cjs.map +0 -1
  253. package/dist/components/doomEditor.d.cts.map +0 -1
  254. package/dist/components/doomEditor.d.mts.map +0 -1
  255. package/dist/components/doomEditor.mjs.map +0 -1
  256. package/dist/components/doomFooter.cjs.map +0 -1
  257. package/dist/components/doomFooter.d.cts.map +0 -1
  258. package/dist/components/doomFooter.d.mts.map +0 -1
  259. package/dist/components/doomFooter.mjs.map +0 -1
  260. package/dist/components/doomHeader.cjs.map +0 -1
  261. package/dist/components/doomHeader.d.cts.map +0 -1
  262. package/dist/components/doomHeader.d.mts.map +0 -1
  263. package/dist/components/doomHeader.mjs.map +0 -1
  264. package/dist/components/doomOverlay.cjs.map +0 -1
  265. package/dist/components/doomOverlay.d.cts.map +0 -1
  266. package/dist/components/doomOverlay.d.mts.map +0 -1
  267. package/dist/components/doomOverlay.mjs.map +0 -1
  268. package/dist/components/leaderHints.cjs.map +0 -1
  269. package/dist/components/leaderHints.d.cts.map +0 -1
  270. package/dist/components/leaderHints.d.mts.map +0 -1
  271. package/dist/components/leaderHints.mjs.map +0 -1
  272. package/dist/components/toolsOverlay.cjs.map +0 -1
  273. package/dist/components/toolsOverlay.d.cts.map +0 -1
  274. package/dist/components/toolsOverlay.d.mts.map +0 -1
  275. package/dist/components/toolsOverlay.mjs.map +0 -1
  276. package/dist/config.cjs.map +0 -1
  277. package/dist/config.d.cts.map +0 -1
  278. package/dist/config.d.mts.map +0 -1
  279. package/dist/config.mjs.map +0 -1
  280. package/dist/extension.cjs.map +0 -1
  281. package/dist/extension.d.cts.map +0 -1
  282. package/dist/extension.d.mts.map +0 -1
  283. package/dist/extension.mjs.map +0 -1
  284. package/dist/extensionName.cjs.map +0 -1
  285. package/dist/extensionName.d.cts.map +0 -1
  286. package/dist/extensionName.d.mts.map +0 -1
  287. package/dist/extensionName.mjs.map +0 -1
  288. package/dist/footer.cjs.map +0 -1
  289. package/dist/footer.d.cts.map +0 -1
  290. package/dist/footer.d.mts.map +0 -1
  291. package/dist/footer.mjs.map +0 -1
  292. package/dist/harnessMetadata.cjs.map +0 -1
  293. package/dist/harnessMetadata.d.cts.map +0 -1
  294. package/dist/harnessMetadata.d.mts.map +0 -1
  295. package/dist/harnessMetadata.mjs.map +0 -1
  296. package/dist/leaderRegistry.cjs.map +0 -1
  297. package/dist/leaderRegistry.d.cts.map +0 -1
  298. package/dist/leaderRegistry.d.mts.map +0 -1
  299. package/dist/leaderRegistry.mjs.map +0 -1
  300. package/dist/logSinkTelemetry.cjs.map +0 -1
  301. package/dist/logSinkTelemetry.d.cts.map +0 -1
  302. package/dist/logSinkTelemetry.d.mts.map +0 -1
  303. package/dist/logSinkTelemetry.mjs.map +0 -1
  304. package/dist/mode.cjs +0 -2
  305. package/dist/mode.cjs.map +0 -1
  306. package/dist/mode.d.cts +0 -5
  307. package/dist/mode.d.cts.map +0 -1
  308. package/dist/mode.d.mts +0 -5
  309. package/dist/mode.d.mts.map +0 -1
  310. package/dist/mode.mjs +0 -2
  311. package/dist/mode.mjs.map +0 -1
  312. package/dist/rendering.cjs.map +0 -1
  313. package/dist/rendering.d.cts.map +0 -1
  314. package/dist/rendering.d.mts.map +0 -1
  315. package/dist/rendering.mjs.map +0 -1
  316. package/dist/theme.cjs.map +0 -1
  317. package/dist/theme.d.cts.map +0 -1
  318. package/dist/theme.d.mts.map +0 -1
  319. package/dist/theme.mjs.map +0 -1
  320. package/dist/toolInventory.cjs.map +0 -1
  321. package/dist/toolInventory.d.cts.map +0 -1
  322. package/dist/toolInventory.d.mts.map +0 -1
  323. package/dist/toolInventory.mjs.map +0 -1
  324. package/dist/uiState.cjs.map +0 -1
  325. package/dist/uiState.d.cts.map +0 -1
  326. package/dist/uiState.d.mts.map +0 -1
  327. package/dist/uiState.mjs.map +0 -1
@@ -1,59 +1,2 @@
1
- import { DoomLeaderRegistry } from "../leaderRegistry.mjs";
2
- import { DoomUiState, LeaderSnapshot } from "../uiState.mjs";
3
- import { CustomEditor, KeybindingsManager, Theme } from "@earendil-works/pi-coding-agent";
4
- import { EditorOptions, EditorTheme, TUI } from "@earendil-works/pi-tui";
5
- //#region src/components/doomEditor.d.ts
6
- interface DoomEditorLeaderOptions {
7
- registry?: DoomLeaderRegistry;
8
- isCommandAvailable?: (commandName: string) => boolean;
9
- onUnavailableCommand?: (commandName: string) => void;
10
- onUnavailableAction?: (action: string) => void;
11
- onLeaderAction?: (source: string, actionName: string) => void;
12
- }
13
- type SnapshotHandler = (snapshot: LeaderSnapshot) => void;
14
- type ChromeTheme = Pick<Theme, 'bg' | 'bold' | 'fg' | 'inverse'>;
15
- declare class DoomEditor extends CustomEditor {
16
- private readonly uiState;
17
- private readonly onSnapshot;
18
- private readonly chromeTheme;
19
- private readonly leaderRegistry;
20
- private readonly isCommandAvailable;
21
- private readonly onUnavailableCommand;
22
- private readonly onUnavailableAction;
23
- private readonly onLeaderAction;
24
- private readonly unsubscribeLeaderRegistry;
25
- private readonly unsubscribeUiState;
26
- private leaderActive;
27
- private leaderPath;
28
- constructor(tui: TUI, editorTheme: EditorTheme, keybindings: KeybindingsManager, uiState: DoomUiState, onSnapshot: SnapshotHandler, options?: EditorOptions, chromeTheme?: ChromeTheme, leaderOptions?: DoomEditorLeaderOptions);
29
- handleInput(data: string): void;
30
- render(width: number): string[];
31
- dispose(): void;
32
- private startLeader;
33
- private cancelLeader;
34
- private handleLeaderInput;
35
- private currentGroup;
36
- private publishLeader;
37
- private publish;
38
- private execute;
39
- private submitCommand;
40
- private modeLabel;
41
- private modeBadge;
42
- /**
43
- * The enabled modes, names only, beside the editor's own mode badge.
44
- *
45
- * Names only because this row is glanced at, not read: which modes are on is
46
- * the whole question here, and their sub-state belongs where there is room to
47
- * explain it. The leader panel carries that longer form.
48
- *
49
- * Empty when nothing is on, so an ordinary session pays no columns for a
50
- * feature it is not using.
51
- */
52
- private modeNames;
53
- private editorStatus;
54
- private editorLine;
55
- private findBottomBorder;
56
- }
57
- //#endregion
58
- export { DoomEditor, DoomEditorLeaderOptions };
59
- //# sourceMappingURL=doomEditor.d.mts.map
1
+ import { DoomEditor, DoomEditorLeaderOptions } from "../tui/doomEditor.mjs";
2
+ export { DoomEditor, type DoomEditorLeaderOptions };
@@ -1,2 +1 @@
1
- import{DoomLeaderRegistry as e}from"../leaderRegistry.mjs";import{alignLine as t,fitLine as n,frameLine as r,padLine as i}from"../rendering.mjs";import{CustomEditor as a}from"@earendil-works/pi-coding-agent";import{parseKey as o}from"@earendil-works/pi-tui";const s=`borderAccent`,c=`accent`,l={bg:(e,t)=>t,bold:e=>e,fg:(e,t)=>t,inverse:e=>e},u={active:!1,prefix:[],label:``,options:[]};var d=class extends a{uiState;onSnapshot;chromeTheme;leaderRegistry;isCommandAvailable;onUnavailableCommand;onUnavailableAction;onLeaderAction;unsubscribeLeaderRegistry;unsubscribeUiState;leaderActive=!1;leaderPath=[];constructor(t,n,r,i,a,o,s=l,c={}){super(t,n,r,o),this.uiState=i,this.onSnapshot=a,this.chromeTheme=s,this.leaderRegistry=c.registry??new e,this.isCommandAvailable=c.isCommandAvailable??(()=>!0),this.onUnavailableCommand=c.onUnavailableCommand??(()=>void 0),this.onUnavailableAction=c.onUnavailableAction??(()=>void 0),this.onLeaderAction=c.onLeaderAction,this.unsubscribeLeaderRegistry=this.leaderRegistry.subscribe(()=>{this.leaderActive&&this.publishLeader()}),this.unsubscribeUiState=this.uiState.subscribe(()=>t.requestRender())}handleInput(e){let t=o(e);if(this.leaderActive){this.handleLeaderInput(t);return}if(t===`space`&&this.getText().length===0||t===`ctrl+space`){this.startLeader();return}super.handleInput(e)}render(e){if(e<12)return super.render(e);let r=e-4,i=super.render(r);if(i.length<3)return i.map(t=>n(t,e));let a=this.findBottomBorder(i,r),o=i.slice(1,a),l=i.slice(a+1),u=this.chromeTheme.fg(s,`│`),d=this.chromeTheme.fg(s,`╭${`─`.repeat(e-2)}╮`),f=this.chromeTheme.fg(s,`╰${`─`.repeat(e-2)}╯`),p=this.editorLine(t(` ${this.modeBadge()}${this.modeNames()}`,this.chromeTheme.fg(`dim`,`${this.editorStatus()} `),e-2),e,u),m=o.map((t,n)=>{let r=n===0?this.chromeTheme.bold(this.chromeTheme.fg(c,`❯ `)):` `;return this.editorLine(`${r}${t}`,e,u)});return[d,p,`${this.chromeTheme.fg(s,`├`)}${this.chromeTheme.fg(`borderMuted`,`─`.repeat(e-2))}${this.chromeTheme.fg(s,`┤`)}`,...m,f,...l.map(t=>n(` ${t}`,e))]}dispose(){this.unsubscribeLeaderRegistry(),this.unsubscribeUiState(),this.cancelLeader()}startLeader(){this.leaderActive=!0,this.leaderPath=[],this.publishLeader()}cancelLeader(){this.leaderActive=!1,this.leaderPath=[],this.publish(u)}handleLeaderInput(e){if(e===`escape`){this.cancelLeader();return}if(e===`backspace`){this.leaderPath.length===0?this.cancelLeader():(this.leaderPath.pop(),this.publishLeader());return}if(!e||e.length!==1){this.cancelLeader();return}let t=e.toLowerCase(),n=this.currentGroup()?.options.find(e=>e.key===t);if(!n){this.cancelLeader();return}if(n.hasChildren){this.leaderPath.push(t),this.publishLeader();return}if(!n.action){this.cancelLeader();return}this.cancelLeader(),this.execute(n.action)}currentGroup(){return this.leaderRegistry.getGroup(this.leaderPath)}publishLeader(){let e=this.currentGroup();if(!e){this.cancelLeader();return}let t=this.leaderRegistry.getGroup([]);this.publish({active:!0,prefix:[`SPC`,...this.leaderPath],label:e.label,options:e.options.map(e=>({key:e.key,label:e.label,...e.detail?{detail:e.detail}:{}})),rootOptions:t?.options.map(e=>({key:e.key,label:e.label,...e.detail?{detail:e.detail}:{}}))??[]})}publish(e){this.uiState.setLeader(e),this.onSnapshot(e),this.tui.requestRender()}execute(e){if(e.type===`app`){let t=this.actionHandlers.get(e.action);if(t){t();return}if(e.action===`app.exit`){this.onCtrlD?.();return}this.onUnavailableAction(e.action);return}if(e.type===`command`){this.submitCommand(e.command.name,e.command.args);return}this.onLeaderAction?this.onLeaderAction(e.source,e.action.name):this.onUnavailableAction(`${e.source}:${e.action.name}`)}submitCommand(e,t){if(!this.isCommandAvailable(e)){this.onUnavailableCommand(e);return}let n=this.getText(),r=`/${e}${t?` ${t}`:``}`;this.setText(``);try{this.onSubmit?.(r)}finally{this.setText(n)}}modeLabel(){return this.leaderActive?`LEADER ${[`SPC`,...this.leaderPath].join(` `)}`:`INSERT`}modeBadge(){let e=` ${this.modeLabel()} `,t=this.leaderActive?`mdHeading`:c;return this.chromeTheme.inverse(this.chromeTheme.bold(this.chromeTheme.fg(t,e)))}modeNames(){let e=this.uiState.getModes();if(e.length===0)return``;let t=e.map(e=>e.label.toLowerCase()).join(` · `);return this.chromeTheme.fg(`muted`,` ${t}`)}editorStatus(){if(this.leaderActive)return`draft preserved · esc cancel`;let e=this.getText().length;return e===0?`draft 0 · ^SPC leader · SPC shortcut`:`draft ${e} · ^SPC leader`}editorLine(e,t,n){return r(i(e,t-2),t,n,n)}findBottomBorder(e,t){let n=Math.max(1,t-10),r=e.findIndex((e,t)=>t!==0&&e.split(`─`).length-1>=n);return r>0?r:e.length-1}};export{d as DoomEditor};
2
- //# sourceMappingURL=doomEditor.mjs.map
1
+ import{DoomEditor as e}from"../tui/doomEditor.mjs";export{e as DoomEditor};
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../rendering.cjs");let n=require("@earendil-works/pi-tui"),r=require("node:path");r=e.__toESM(r,1);const i=` · `,a=`muted`,o=`toolPendingBg`,s=`userMessageBg`,c=`modeline`,l={off:`thinkingOff`,minimal:`thinkingMinimal`,low:`thinkingLow`,medium:`thinkingMedium`,high:`thinkingHigh`,xhigh:`thinkingXhigh`,max:`thinkingMax`};function u(e){return e.replace(/[\r\n\t]+/gu,` `).replace(/ {2,}/gu,` `).trim()}var d=class{theme;context;footerData;footerStatuses;uiState;unsubscribeBranch;unsubscribeFooterStatuses;unsubscribeState;constructor(e,t,n,r,i,a){this.theme=t,this.context=n,this.footerData=r,this.footerStatuses=i,this.uiState=a,this.unsubscribeBranch=r.onBranchChange(()=>e.requestRender()),this.unsubscribeFooterStatuses=i.subscribe(()=>e.requestRender()),this.unsubscribeState=a.subscribe(()=>e.requestRender())}dispose(){this.unsubscribeBranch(),this.unsubscribeFooterStatuses(),this.unsubscribeState()}invalidate(){}render(e){if(e<=0)return[];let i=e<90,a=this.uiState.getSnapshot(),s=a.active?a.prefix.join(` `):i?`I`:`INSERT`,c=a.active?this.theme.inverse(this.theme.bold(this.theme.fg(`mdHeading`,` ${s} `))):this.theme.inverse(this.theme.bold(this.theme.fg(`accent`,` ${s} `))),l=r.default.basename(this.context.cwd)||this.context.cwd,u=this.footerData.getGitBranch(),d=`${c}${this.locationSegment(l,u,i)}`,f=this.footerStatusSummary(`beforeModel`,i),p=this.runtimeSegment(i),m=this.runtimeSegment(i,f),h=f&&(0,n.visibleWidth)(c)+(0,n.visibleWidth)(m)<=e?m:p;if((0,n.visibleWidth)(d)+(0,n.visibleWidth)(h)>e)return[t.fitLine(`${c}${h}`,e)];let g=e-(0,n.visibleWidth)(d)-(0,n.visibleWidth)(h),_=this.modelineSummary(Math.max(0,g-1),i),v=this.theme.bg(o,t.padLine(` ${_}`,g));return[t.fitLine(`${d}${v}${h}`,e)]}locationSegment(e,t,n){let r=this.theme.bg(s,this.theme.fg(`text`,` ${e}`));if(!t)return`${r}${this.theme.bg(s,` `)}`;let i=n?` `:`  `;return`${r}${this.theme.bg(s,this.theme.fg(`success`,`${i}${t} `))}`}runtimeSegment(e,n=``){let r=this.context.getContextUsage()?.percent,a=r==null?e?`?`:`ctx ?`:e?`${Math.round(r)}%`:`ctx ${Math.round(r)}%`,s=e?18:30,c=t.fitLine(this.compactModel(this.context.model?.id??`no-model`),s),l=this.context.thinkingLevel??`off`,u=[...n?[n]:[],this.theme.fg(`warning`,c),this.theme.fg(this.thinkingColor(l),l),this.theme.fg(this.contextColor(r),a)].join(i);return this.theme.bg(o,` ${u} `)}thinkingColor(e){return l[e]??`thinkingText`}contextColor(e){return e==null?a:e>=85?`error`:e>=60?`warning`:a}modelineSummary(e,n){return e<=0?``:t.fitLine(this.footerStatusSummary(c,n),e)}footerStatusSummary(e,t){return this.footerStatuses.getStatuses().filter(t=>(t.placement??c)===e).map(e=>{let n=t?e.compactSegments:e.fullSegments;return n?.length?this.renderFooterSegments(n):this.theme.fg(`dim`,u(t?e.compactText:e.fullText))}).filter(Boolean).join(this.theme.fg(`dim`,i))}renderFooterSegments(e){return e.map(e=>{let t=e.text.replace(/[\r\n\t]+/gu,` `);return this.theme.fg(e.color??`dim`,t)}).join(``)}compactModel(e){return(e.split(`/`).at(-1)??e).replace(/^claude-/,``)}};exports.DoomFooter=d;
2
- //# sourceMappingURL=doomFooter.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../tui/doomFooter.cjs");exports.DoomFooter=e.DoomFooter;
@@ -1,32 +1,2 @@
1
- import { DoomUiState } from "../uiState.cjs";
2
- import { footer_d_exports } from "../footer.cjs";
3
- import { ExtensionContext, ReadonlyFooterDataProvider, Theme } from "@earendil-works/pi-coding-agent";
4
- import { Component, TUI } from "@earendil-works/pi-tui";
5
- //#region src/components/doomFooter.d.ts
6
- declare class DoomFooter implements Component {
7
- private readonly theme;
8
- private readonly context;
9
- private readonly footerData;
10
- private readonly footerStatuses;
11
- private readonly uiState;
12
- private readonly unsubscribeBranch;
13
- private readonly unsubscribeFooterStatuses;
14
- private readonly unsubscribeState;
15
- constructor(tui: TUI, theme: Theme, context: ExtensionContext, footerData: ReadonlyFooterDataProvider, footerStatuses: footer_d_exports.DoomFooterStatusRegistry, uiState: DoomUiState);
16
- dispose(): void;
17
- invalidate(): void;
18
- render(width: number): string[];
19
- private locationSegment;
20
- private runtimeSegment;
21
- /** Effort rides the theme's rising ramp, from grey at off to red at max. */
22
- private thinkingColor;
23
- /** Context usage warms as the window fills, so pressure is visible at a glance. */
24
- private contextColor;
25
- private modelineSummary;
26
- private footerStatusSummary;
27
- private renderFooterSegments;
28
- private compactModel;
29
- }
30
- //#endregion
31
- export { DoomFooter };
32
- //# sourceMappingURL=doomFooter.d.cts.map
1
+ import { DoomFooter } from "../tui/doomFooter.cjs";
2
+ export { DoomFooter };
@@ -1,32 +1,2 @@
1
- import { DoomUiState } from "../uiState.mjs";
2
- import { footer_d_exports } from "../footer.mjs";
3
- import { ExtensionContext, ReadonlyFooterDataProvider, Theme } from "@earendil-works/pi-coding-agent";
4
- import { Component, TUI } from "@earendil-works/pi-tui";
5
- //#region src/components/doomFooter.d.ts
6
- declare class DoomFooter implements Component {
7
- private readonly theme;
8
- private readonly context;
9
- private readonly footerData;
10
- private readonly footerStatuses;
11
- private readonly uiState;
12
- private readonly unsubscribeBranch;
13
- private readonly unsubscribeFooterStatuses;
14
- private readonly unsubscribeState;
15
- constructor(tui: TUI, theme: Theme, context: ExtensionContext, footerData: ReadonlyFooterDataProvider, footerStatuses: footer_d_exports.DoomFooterStatusRegistry, uiState: DoomUiState);
16
- dispose(): void;
17
- invalidate(): void;
18
- render(width: number): string[];
19
- private locationSegment;
20
- private runtimeSegment;
21
- /** Effort rides the theme's rising ramp, from grey at off to red at max. */
22
- private thinkingColor;
23
- /** Context usage warms as the window fills, so pressure is visible at a glance. */
24
- private contextColor;
25
- private modelineSummary;
26
- private footerStatusSummary;
27
- private renderFooterSegments;
28
- private compactModel;
29
- }
30
- //#endregion
31
- export { DoomFooter };
32
- //# sourceMappingURL=doomFooter.d.mts.map
1
+ import { DoomFooter } from "../tui/doomFooter.mjs";
2
+ export { DoomFooter };
@@ -1,2 +1 @@
1
- import{fitLine as e,padLine as t}from"../rendering.mjs";import{visibleWidth as n}from"@earendil-works/pi-tui";import r from"node:path";const i=` · `,a=`muted`,o=`toolPendingBg`,s=`userMessageBg`,c=`modeline`,l={off:`thinkingOff`,minimal:`thinkingMinimal`,low:`thinkingLow`,medium:`thinkingMedium`,high:`thinkingHigh`,xhigh:`thinkingXhigh`,max:`thinkingMax`};function u(e){return e.replace(/[\r\n\t]+/gu,` `).replace(/ {2,}/gu,` `).trim()}var d=class{theme;context;footerData;footerStatuses;uiState;unsubscribeBranch;unsubscribeFooterStatuses;unsubscribeState;constructor(e,t,n,r,i,a){this.theme=t,this.context=n,this.footerData=r,this.footerStatuses=i,this.uiState=a,this.unsubscribeBranch=r.onBranchChange(()=>e.requestRender()),this.unsubscribeFooterStatuses=i.subscribe(()=>e.requestRender()),this.unsubscribeState=a.subscribe(()=>e.requestRender())}dispose(){this.unsubscribeBranch(),this.unsubscribeFooterStatuses(),this.unsubscribeState()}invalidate(){}render(i){if(i<=0)return[];let a=i<90,s=this.uiState.getSnapshot(),c=s.active?s.prefix.join(` `):a?`I`:`INSERT`,l=s.active?this.theme.inverse(this.theme.bold(this.theme.fg(`mdHeading`,` ${c} `))):this.theme.inverse(this.theme.bold(this.theme.fg(`accent`,` ${c} `))),u=r.basename(this.context.cwd)||this.context.cwd,d=this.footerData.getGitBranch(),f=`${l}${this.locationSegment(u,d,a)}`,p=this.footerStatusSummary(`beforeModel`,a),m=this.runtimeSegment(a),h=this.runtimeSegment(a,p),g=p&&n(l)+n(h)<=i?h:m;if(n(f)+n(g)>i)return[e(`${l}${g}`,i)];let _=i-n(f)-n(g),v=this.modelineSummary(Math.max(0,_-1),a),y=this.theme.bg(o,t(` ${v}`,_));return[e(`${f}${y}${g}`,i)]}locationSegment(e,t,n){let r=this.theme.bg(s,this.theme.fg(`text`,` ${e}`));if(!t)return`${r}${this.theme.bg(s,` `)}`;let i=n?` `:`  `;return`${r}${this.theme.bg(s,this.theme.fg(`success`,`${i}${t} `))}`}runtimeSegment(t,n=``){let r=this.context.getContextUsage()?.percent,a=r==null?t?`?`:`ctx ?`:t?`${Math.round(r)}%`:`ctx ${Math.round(r)}%`,s=t?18:30,c=e(this.compactModel(this.context.model?.id??`no-model`),s),l=this.context.thinkingLevel??`off`,u=[...n?[n]:[],this.theme.fg(`warning`,c),this.theme.fg(this.thinkingColor(l),l),this.theme.fg(this.contextColor(r),a)].join(i);return this.theme.bg(o,` ${u} `)}thinkingColor(e){return l[e]??`thinkingText`}contextColor(e){return e==null?a:e>=85?`error`:e>=60?`warning`:a}modelineSummary(t,n){return t<=0?``:e(this.footerStatusSummary(c,n),t)}footerStatusSummary(e,t){return this.footerStatuses.getStatuses().filter(t=>(t.placement??c)===e).map(e=>{let n=t?e.compactSegments:e.fullSegments;return n?.length?this.renderFooterSegments(n):this.theme.fg(`dim`,u(t?e.compactText:e.fullText))}).filter(Boolean).join(this.theme.fg(`dim`,i))}renderFooterSegments(e){return e.map(e=>{let t=e.text.replace(/[\r\n\t]+/gu,` `);return this.theme.fg(e.color??`dim`,t)}).join(``)}compactModel(e){return(e.split(`/`).at(-1)??e).replace(/^claude-/,``)}};export{d as DoomFooter};
2
- //# sourceMappingURL=doomFooter.mjs.map
1
+ import{DoomFooter as e}from"../tui/doomFooter.mjs";export{e as DoomFooter};
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../rendering.cjs"),n=require("../harnessMetadata.cjs");let r=require("@earendil-works/pi-tui"),i=require("node:path");i=e.__toESM(i,1);const a=`default`,o=`no-model`,s=`core`,c=`BOOT / 01`,l=`● READY`,u=` · `,d=/^claude-/,f=`REPOSITORY`,p=`PROFILE`,m=`LAYERS`,h=`MODE`,g=`MODEL`,_=`─`.repeat(8),v=`accent`,y=`success`,b=`muted`,x=`text`,S=`mdCode`,C=`warning`,w=`borderMuted`;var T=class{theme;cwd;readMetadata;runtime;getTerminalRows;constructor(e,t,r=n.readDoomHarnessMetadata,i,a=()=>24){this.theme=e,this.cwd=t,this.readMetadata=r,this.runtime=i,this.getTerminalRows=a}invalidate(){}render(e){if(e<=0)return[];if(e<4)return[this.hairline(e)];let t=this.readMetadata();if(this.runtime?.sessionManager.getEntries().some(e=>e.type===`message`)??!1)return[];let n=this.getTerminalRows();if(n<24)return this.renderCompact(e,t);let r=e<90?this.renderNarrowDashboard(e,t):this.renderWideDashboard(e,t),i=this.renderHints(e),a=2+r.length+i.length+2,o=Math.max(3,n-8-a);return[...Array.from({length:2},()=>``),...r,``,...i,``,...this.renderEmptyState(e,o)]}renderWideDashboard(e,n){let r=Math.max(1,e-30-3),i=t.alignLine(this.theme.bold(this.theme.fg(`mdHeading`,`SESSION CONTEXT`)),this.theme.fg(`dim`,`${new Date().toLocaleTimeString(`en-GB`,{hour12:!1})} / local`),r),l=this.compactPath(n.root??this.cwd),d=n.profile??a,_=n.domains.join(`, `)||a,w=n.layers.join(u)||s,T=this.runtime?.model?.id??o,E=this.runtime?.thinkingLevel??`off`,D=`${this.theme.fg(y,`━━━━━━━━`)} ${this.theme.bold(this.theme.fg(y,`READY`))}`;return[this.columns(this.identityCell(this.theme.fg(`dim`,c)),i,e),this.columns(this.identityCell(this.wordmark()),this.contextRow(f,l,x),e),this.columns(this.identityCell(this.theme.fg(b,`Pi, configured for focus.`)),this.contextRow(p,d,S),e),this.columns(this.identityCell(D),this.contextRow(`DOMAINS`,_,v),e),this.columns(this.identityCell(``),this.contextRow(m,w,b),e),this.columns(this.identityCell(``),this.contextRow(h,n.majorMode,y),e),this.columns(this.identityCell(``),this.contextRow(g,`${T} / ${E}`,C),e),this.hairline(e)]}renderNarrowDashboard(e,n){let r=i.default.basename(n.root??this.cwd)||this.cwd,d=n.profile??a,_=n.domains.join(`, `)||a,v=this.runtime?.sessionManager.getSessionId().slice(0,6)??`new`,w=n.layers.join(u)||s,T=this.compactModel(this.runtime?.model?.id??o),E=this.runtime?.thinkingLevel??`off`,D=this.theme.bold(this.theme.fg(y,l));return[...[t.alignLine(this.identityCell(`${this.theme.fg(`dim`,c)} ${this.wordmark()}`),D,e),this.identityCell(this.contextRow(f,r,x)),this.identityCell(this.contextRow(p,`${d} / ${_} / ${v}`,S)),this.identityCell(this.contextRow(m,w,b)),this.identityCell(this.contextRow(h,n.majorMode,y)),this.identityCell(this.contextRow(g,`${T} / ${E}`,C))].map(n=>t.fitLine(n,e)),this.hairline(e)]}renderCompact(e,n){let r=i.default.basename(n.root??this.cwd)||this.cwd,s=n.profile??a,c=n.domains.join(`,`)||a,u=this.compactModel(this.runtime?.model?.id??o),d=this.runtime?.thinkingLevel??`off`,f=this.runtime?.isIdle()===!1?`● ACTIVE`:l;return[t.alignLine(`${this.wordmark()} ${this.theme.bold(this.theme.fg(x,r))}`,this.theme.fg(y,f),e),t.fitLine(`${s} / ${c} / ${n.majorMode}`,e),t.alignLine(this.theme.fg(C,`${u} / ${d}`),this.theme.fg(`dim`,`CTRL+SPACE leader · SPC when empty`),e),this.hairline(e)]}renderHints(e){let n=[this.keyHint(`CTRL+SPACE`,`leader anywhere`),this.keyHint(`SPC`,`when empty`),this.keyHint(`/`,`commands`),this.keyHint(`!`,`shell`)].join(` `);return[t.fitLine(n,e)]}renderEmptyState(e,t){let n=Array.from({length:Math.max(3,t)},()=>``),r=this.theme.fg(w,_),i=`${r} ${this.theme.fg(`dim`,`NO TRANSCRIPT YET`)} ${r}`,a=this.theme.fg(b,`Describe the work below. Pi keeps your existing config and session history.`),o=Math.max(0,Math.floor(n.length/2)-1);return n[o]=this.centerLine(i,e),n.length>o+1&&(n[o+1]=this.centerLine(a,e)),n}hairline(e){return this.theme.fg(w,`─`.repeat(Math.max(0,e)))}centerLine(e,n){let i=t.fitLine(e,n),a=` `.repeat(Math.max(0,Math.floor((n-(0,r.visibleWidth)(i))/2)));return t.fitLine(`${a}${i}`,n)}identityCell(e){let t=this.theme.fg(v,`▌`);return e?`${t} ${e}`:t}columns(e,n,r){let i=Math.max(0,r-30-3);return t.fitLine(`${t.padLine(e,30)}${` `.repeat(3)}${t.fitLine(n,i)}`,r)}contextRow(e,t,n){return`${this.theme.fg(`dim`,e.padEnd(12))}${this.theme.fg(n,t)}`}keyHint(e,t){return`${this.theme.bg(`selectedBg`,this.theme.fg(v,` ${e} `))} ${this.theme.fg(`dim`,t)}`}wordmark(){return`${this.theme.bold(this.theme.fg(v,`DOOM`))} ${this.theme.inverse(this.theme.bold(this.theme.fg(x,` PI `)))}`}compactModel(e){return e.split(`/`).at(-1)?.replace(d,``)??e}compactPath(e){let t=process.env.HOME;return t&&e.startsWith(t)?`~${e.slice(t.length)}`:e}};exports.DoomHeader=T;
2
- //# sourceMappingURL=doomHeader.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../tui/doomHeader.cjs");exports.DoomHeader=e.DoomHeader;
@@ -1,34 +1,2 @@
1
- import { DoomHarnessMetadata } from "../harnessMetadata.cjs";
2
- import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
3
- import { Component } from "@earendil-works/pi-tui";
4
- //#region src/components/doomHeader.d.ts
5
- type MetadataReader = () => DoomHarnessMetadata;
6
- type TerminalRowsReader = () => number;
7
- type HeaderRuntime = Pick<ExtensionContext, 'isIdle' | 'model' | 'sessionManager' | 'thinkingLevel'>;
8
- declare class DoomHeader implements Component {
9
- private readonly theme;
10
- private readonly cwd;
11
- private readonly readMetadata;
12
- private readonly runtime?;
13
- private readonly getTerminalRows;
14
- constructor(theme: Theme, cwd: string, readMetadata?: MetadataReader, runtime?: HeaderRuntime | undefined, getTerminalRows?: TerminalRowsReader);
15
- invalidate(): void;
16
- render(width: number): string[];
17
- private renderWideDashboard;
18
- private renderNarrowDashboard;
19
- private renderCompact;
20
- private renderHints;
21
- private renderEmptyState;
22
- private hairline;
23
- private centerLine;
24
- private identityCell;
25
- private columns;
26
- private contextRow;
27
- private keyHint;
28
- private wordmark;
29
- private compactModel;
30
- private compactPath;
31
- }
32
- //#endregion
33
- export { DoomHeader };
34
- //# sourceMappingURL=doomHeader.d.cts.map
1
+ import { DoomHeader } from "../tui/doomHeader.cjs";
2
+ export { DoomHeader };
@@ -1,34 +1,2 @@
1
- import { DoomHarnessMetadata } from "../harnessMetadata.mjs";
2
- import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
3
- import { Component } from "@earendil-works/pi-tui";
4
- //#region src/components/doomHeader.d.ts
5
- type MetadataReader = () => DoomHarnessMetadata;
6
- type TerminalRowsReader = () => number;
7
- type HeaderRuntime = Pick<ExtensionContext, 'isIdle' | 'model' | 'sessionManager' | 'thinkingLevel'>;
8
- declare class DoomHeader implements Component {
9
- private readonly theme;
10
- private readonly cwd;
11
- private readonly readMetadata;
12
- private readonly runtime?;
13
- private readonly getTerminalRows;
14
- constructor(theme: Theme, cwd: string, readMetadata?: MetadataReader, runtime?: HeaderRuntime | undefined, getTerminalRows?: TerminalRowsReader);
15
- invalidate(): void;
16
- render(width: number): string[];
17
- private renderWideDashboard;
18
- private renderNarrowDashboard;
19
- private renderCompact;
20
- private renderHints;
21
- private renderEmptyState;
22
- private hairline;
23
- private centerLine;
24
- private identityCell;
25
- private columns;
26
- private contextRow;
27
- private keyHint;
28
- private wordmark;
29
- private compactModel;
30
- private compactPath;
31
- }
32
- //#endregion
33
- export { DoomHeader };
34
- //# sourceMappingURL=doomHeader.d.mts.map
1
+ import { DoomHeader } from "../tui/doomHeader.mjs";
2
+ export { DoomHeader };
@@ -1,2 +1 @@
1
- import{alignLine as e,fitLine as t,padLine as n}from"../rendering.mjs";import{readDoomHarnessMetadata as r}from"../harnessMetadata.mjs";import{visibleWidth as i}from"@earendil-works/pi-tui";import a from"node:path";const o=`default`,s=`no-model`,c=`core`,l=`BOOT / 01`,u=`● READY`,d=` · `,f=/^claude-/,p=`REPOSITORY`,m=`PROFILE`,h=`LAYERS`,g=`MODE`,_=`MODEL`,v=`─`.repeat(8),y=`accent`,b=`success`,x=`muted`,S=`text`,C=`mdCode`,w=`warning`,T=`borderMuted`;var E=class{theme;cwd;readMetadata;runtime;getTerminalRows;constructor(e,t,n=r,i,a=()=>24){this.theme=e,this.cwd=t,this.readMetadata=n,this.runtime=i,this.getTerminalRows=a}invalidate(){}render(e){if(e<=0)return[];if(e<4)return[this.hairline(e)];let t=this.readMetadata();if(this.runtime?.sessionManager.getEntries().some(e=>e.type===`message`)??!1)return[];let n=this.getTerminalRows();if(n<24)return this.renderCompact(e,t);let r=e<90?this.renderNarrowDashboard(e,t):this.renderWideDashboard(e,t),i=this.renderHints(e),a=2+r.length+i.length+2,o=Math.max(3,n-8-a);return[...Array.from({length:2},()=>``),...r,``,...i,``,...this.renderEmptyState(e,o)]}renderWideDashboard(t,n){let r=Math.max(1,t-30-3),i=e(this.theme.bold(this.theme.fg(`mdHeading`,`SESSION CONTEXT`)),this.theme.fg(`dim`,`${new Date().toLocaleTimeString(`en-GB`,{hour12:!1})} / local`),r),a=this.compactPath(n.root??this.cwd),u=n.profile??o,f=n.domains.join(`, `)||o,v=n.layers.join(d)||c,T=this.runtime?.model?.id??s,E=this.runtime?.thinkingLevel??`off`,D=`${this.theme.fg(b,`━━━━━━━━`)} ${this.theme.bold(this.theme.fg(b,`READY`))}`;return[this.columns(this.identityCell(this.theme.fg(`dim`,l)),i,t),this.columns(this.identityCell(this.wordmark()),this.contextRow(p,a,S),t),this.columns(this.identityCell(this.theme.fg(x,`Pi, configured for focus.`)),this.contextRow(m,u,C),t),this.columns(this.identityCell(D),this.contextRow(`DOMAINS`,f,y),t),this.columns(this.identityCell(``),this.contextRow(h,v,x),t),this.columns(this.identityCell(``),this.contextRow(g,n.majorMode,b),t),this.columns(this.identityCell(``),this.contextRow(_,`${T} / ${E}`,w),t),this.hairline(t)]}renderNarrowDashboard(n,r){let i=a.basename(r.root??this.cwd)||this.cwd,f=r.profile??o,v=r.domains.join(`, `)||o,y=this.runtime?.sessionManager.getSessionId().slice(0,6)??`new`,T=r.layers.join(d)||c,E=this.compactModel(this.runtime?.model?.id??s),D=this.runtime?.thinkingLevel??`off`,O=this.theme.bold(this.theme.fg(b,u));return[...[e(this.identityCell(`${this.theme.fg(`dim`,l)} ${this.wordmark()}`),O,n),this.identityCell(this.contextRow(p,i,S)),this.identityCell(this.contextRow(m,`${f} / ${v} / ${y}`,C)),this.identityCell(this.contextRow(h,T,x)),this.identityCell(this.contextRow(g,r.majorMode,b)),this.identityCell(this.contextRow(_,`${E} / ${D}`,w))].map(e=>t(e,n)),this.hairline(n)]}renderCompact(n,r){let i=a.basename(r.root??this.cwd)||this.cwd,c=r.profile??o,l=r.domains.join(`,`)||o,d=this.compactModel(this.runtime?.model?.id??s),f=this.runtime?.thinkingLevel??`off`,p=this.runtime?.isIdle()===!1?`● ACTIVE`:u;return[e(`${this.wordmark()} ${this.theme.bold(this.theme.fg(S,i))}`,this.theme.fg(b,p),n),t(`${c} / ${l} / ${r.majorMode}`,n),e(this.theme.fg(w,`${d} / ${f}`),this.theme.fg(`dim`,`CTRL+SPACE leader · SPC when empty`),n),this.hairline(n)]}renderHints(e){let n=[this.keyHint(`CTRL+SPACE`,`leader anywhere`),this.keyHint(`SPC`,`when empty`),this.keyHint(`/`,`commands`),this.keyHint(`!`,`shell`)].join(` `);return[t(n,e)]}renderEmptyState(e,t){let n=Array.from({length:Math.max(3,t)},()=>``),r=this.theme.fg(T,v),i=`${r} ${this.theme.fg(`dim`,`NO TRANSCRIPT YET`)} ${r}`,a=this.theme.fg(x,`Describe the work below. Pi keeps your existing config and session history.`),o=Math.max(0,Math.floor(n.length/2)-1);return n[o]=this.centerLine(i,e),n.length>o+1&&(n[o+1]=this.centerLine(a,e)),n}hairline(e){return this.theme.fg(T,`─`.repeat(Math.max(0,e)))}centerLine(e,n){let r=t(e,n),a=` `.repeat(Math.max(0,Math.floor((n-i(r))/2)));return t(`${a}${r}`,n)}identityCell(e){let t=this.theme.fg(y,`▌`);return e?`${t} ${e}`:t}columns(e,r,i){let a=Math.max(0,i-30-3);return t(`${n(e,30)}${` `.repeat(3)}${t(r,a)}`,i)}contextRow(e,t,n){return`${this.theme.fg(`dim`,e.padEnd(12))}${this.theme.fg(n,t)}`}keyHint(e,t){return`${this.theme.bg(`selectedBg`,this.theme.fg(y,` ${e} `))} ${this.theme.fg(`dim`,t)}`}wordmark(){return`${this.theme.bold(this.theme.fg(y,`DOOM`))} ${this.theme.inverse(this.theme.bold(this.theme.fg(S,` PI `)))}`}compactModel(e){return e.split(`/`).at(-1)?.replace(f,``)??e}compactPath(e){let t=process.env.HOME;return t&&e.startsWith(t)?`~${e.slice(t.length)}`:e}};export{E as DoomHeader};
2
- //# sourceMappingURL=doomHeader.mjs.map
1
+ import{DoomHeader as e}from"../tui/doomHeader.mjs";export{e as DoomHeader};
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../rendering.cjs");let t=require("@earendil-works/pi-tui");const n=`borderMuted`,r=`accent`,i=[`╭`,`╮`],a=[`├`,`┤`],o=[`╰`,`╯`],s={overlay:!0,overlayOptions:{anchor:`top-left`,width:`100%`,maxHeight:`100%`,margin:0}};function c(e,n){return!e||n<=0||n<Math.min((0,t.visibleWidth)(e),8)?``:(0,t.truncateToWidth)(e,n,`…`)}var l=class{tui;theme;constructor(e,t){this.tui=e,this.theme=t}invalidate(){this.tui.requestRender()}render(t){let r=Math.max(0,Math.floor(t)),s=Math.max(0,Math.floor(this.tui.terminal?.rows??24));if(r===0||s===0)return[];let c=this.getChrome();if(s<6||r<8)return this.renderCompact(c,r,s);let l=r-2,u=l-2,d=s-6,f=this.renderBody(u,d).slice(0,d);for(;f.length<d;)f.push(``);let p=c.accent??n;return[this.borderRow(i,l,p),this.contentRow(this.headerRow(c,u),u,r,p),this.borderRow(a,l,p,n),...f.map(e=>this.contentRow(e,u,r,p)),this.borderRow(a,l,p,n),this.contentRow(this.footerRow(c,u),u,r,p),this.borderRow(o,l,p)].map(t=>e.padLine(t,r))}borderRow([e,t],r,i=n,a=i){let o=i??n;return[this.theme.fg(o,e),this.theme.fg(a??o,`─`.repeat(r)),this.theme.fg(o,t)].join(``)}contentRow(t,r,i,a=n){let o=this.theme.fg(a??n,`│`);return e.frameLine(` ${e.padLine(t,r)} `,i,o,o)}headerRow(e,n){let i=e.accent,a=i?n-2:n,o=(0,t.truncateToWidth)(e.title,Math.max(0,a),`…`),s=i?this.theme.inverse(this.theme.bold(this.theme.fg(i,` ${o} `))):this.theme.bold(this.theme.fg(r,o)),l=(0,t.visibleWidth)(o)+(i?2:0),u=c(e.breadcrumb,n-l-2);return u&&(s+=`${` `.repeat(2)}${this.theme.fg(`dim`,u)}`,l+=2+(0,t.visibleWidth)(u)),this.withRightStatus(s,l,e.headerRight,n)}footerRow(e,n){let r=e.footerHints?.length?this.hintLegend(e.footerHints,n):this.theme.fg(`dim`,(0,t.truncateToWidth)(e.footer,n,`…`));return this.withRightStatus(r,(0,t.visibleWidth)(r),e.footerRight,n)}hintLegend(e,n){let r=``,i=0;for(let[a,o]of e){let e=(0,t.visibleWidth)(a)+(0,t.visibleWidth)(o)+6;if(i+e>n)break;let s=this.theme.bg(`selectedBg`,this.theme.fg(`text`,` ${a} `));r+=`${r?` `:``}${s}${this.theme.fg(`dim`,` ${o}`)}`,i+=e}return r}withRightStatus(e,n,r,i){let a=r?(0,t.visibleWidth)(r):0;return!r||a===0||n+2+a>i?e:`${e}${` `.repeat(i-n-a)}${this.theme.fg(`dim`,r)}`}renderCompact(t,n,i){let a=Array.from({length:i},()=>``);return a[0]=this.theme.bold(this.theme.fg(r,t.title)),i>1&&(a[i-1]=this.theme.fg(`dim`,t.footer)),a.map(t=>e.padLine(e.fitLine(t,n),n))}};exports.DOOM_FULLSCREEN_UI_OPTIONS=s,exports.DOOM_OVERLAY_ACCENT=`mdHeading`,exports.DoomOverlay=l;
2
- //# sourceMappingURL=doomOverlay.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../tui/doomOverlay.cjs");exports.DOOM_FULLSCREEN_UI_OPTIONS=e.DOOM_FULLSCREEN_UI_OPTIONS,exports.DOOM_NAVIGATION_KEYS=e.DOOM_NAVIGATION_KEYS,exports.DOOM_OVERLAY_ACCENT=e.DOOM_OVERLAY_ACCENT,exports.DoomOverlay=e.DoomOverlay;
@@ -1,79 +1,2 @@
1
- import { Theme } from "@earendil-works/pi-coding-agent";
2
- import { Component } from "@earendil-works/pi-tui";
3
- //#region src/components/doomOverlay.d.ts
4
- interface DoomOverlayTui {
5
- terminal?: {
6
- rows: number;
7
- columns?: number;
8
- };
9
- requestRender(force?: boolean): void;
10
- }
11
- interface DoomOverlayChrome {
12
- title: string;
13
- breadcrumb?: string;
14
- headerRight?: string;
15
- footer: string;
16
- footerRight?: string;
17
- /**
18
- * Key/label pairs rendered as filled caps, e.g. `[ enter ] edit subject`.
19
- * Takes precedence over `footer`, which stays for surfaces that want a plain
20
- * sentence rather than a key legend.
21
- */
22
- footerHints?: readonly (readonly [string, string])[];
23
- /**
24
- * Signature colour for the surface. When set, the frame takes it and the
25
- * title renders as a filled badge rather than plain accent text, matching the
26
- * doom mockups. Left unset, the frame stays muted and the title plain.
27
- */
28
- accent?: Parameters<Theme['fg']>[0];
29
- }
30
- /**
31
- * One signature colour for every doom overlay: the frame and the title badge.
32
- * Per-surface colours were tried and read as arbitrary, and they also borrowed
33
- * tokens that mean something else (`warning`, `syntaxNumber`), so a theme edit
34
- * elsewhere would have repainted a frame. Change it here to change them all.
35
- */
36
- declare const DOOM_OVERLAY_ACCENT = "mdHeading";
37
- declare const DOOM_FULLSCREEN_UI_OPTIONS: {
38
- readonly overlay: true;
39
- readonly overlayOptions: {
40
- readonly anchor: "top-left";
41
- readonly width: "100%";
42
- readonly maxHeight: "100%";
43
- readonly margin: 0;
44
- };
45
- };
46
- declare abstract class DoomOverlay implements Component {
47
- protected readonly tui: DoomOverlayTui;
48
- protected readonly theme: Theme;
49
- protected constructor(tui: DoomOverlayTui, theme: Theme);
50
- invalidate(): void;
51
- render(width: number): string[];
52
- protected abstract getChrome(): DoomOverlayChrome;
53
- protected abstract renderBody(width: number, height: number): string[];
54
- /**
55
- * Edge glyphs and the rule between them are coloured separately: the outer
56
- * rectangle carries the signature colour while an internal separator stays
57
- * muted, meeting the frame at accent-coloured junctions.
58
- */
59
- private borderRow;
60
- private contentRow;
61
- private headerRow;
62
- private footerRow;
63
- /**
64
- * Key legend with each key in a filled cap. Every segment sets its own colour
65
- * so the caps survive: a cap's reset would otherwise strip the surrounding
66
- * dim from the labels that follow it.
67
- */
68
- private hintLegend;
69
- /**
70
- * Right-aligns a status cluster, dropping it whole when the row cannot spare
71
- * the columns. A clipped status reads as a stub (`doom-log…`) that carries
72
- * less than the blank space it costs.
73
- */
74
- private withRightStatus;
75
- private renderCompact;
76
- }
77
- //#endregion
78
- export { DOOM_FULLSCREEN_UI_OPTIONS, DOOM_OVERLAY_ACCENT, DoomOverlay, DoomOverlayChrome, DoomOverlayTui };
79
- //# sourceMappingURL=doomOverlay.d.cts.map
1
+ import { DOOM_FULLSCREEN_UI_OPTIONS, DOOM_NAVIGATION_KEYS, DOOM_OVERLAY_ACCENT, DoomOverlay, DoomOverlayChrome, DoomOverlayTui } from "../tui/doomOverlay.cjs";
2
+ export { DOOM_FULLSCREEN_UI_OPTIONS, DOOM_NAVIGATION_KEYS, DOOM_OVERLAY_ACCENT, DoomOverlay, type DoomOverlayChrome, type DoomOverlayTui };
@@ -1,79 +1,2 @@
1
- import { Theme } from "@earendil-works/pi-coding-agent";
2
- import { Component } from "@earendil-works/pi-tui";
3
- //#region src/components/doomOverlay.d.ts
4
- interface DoomOverlayTui {
5
- terminal?: {
6
- rows: number;
7
- columns?: number;
8
- };
9
- requestRender(force?: boolean): void;
10
- }
11
- interface DoomOverlayChrome {
12
- title: string;
13
- breadcrumb?: string;
14
- headerRight?: string;
15
- footer: string;
16
- footerRight?: string;
17
- /**
18
- * Key/label pairs rendered as filled caps, e.g. `[ enter ] edit subject`.
19
- * Takes precedence over `footer`, which stays for surfaces that want a plain
20
- * sentence rather than a key legend.
21
- */
22
- footerHints?: readonly (readonly [string, string])[];
23
- /**
24
- * Signature colour for the surface. When set, the frame takes it and the
25
- * title renders as a filled badge rather than plain accent text, matching the
26
- * doom mockups. Left unset, the frame stays muted and the title plain.
27
- */
28
- accent?: Parameters<Theme['fg']>[0];
29
- }
30
- /**
31
- * One signature colour for every doom overlay: the frame and the title badge.
32
- * Per-surface colours were tried and read as arbitrary, and they also borrowed
33
- * tokens that mean something else (`warning`, `syntaxNumber`), so a theme edit
34
- * elsewhere would have repainted a frame. Change it here to change them all.
35
- */
36
- declare const DOOM_OVERLAY_ACCENT = "mdHeading";
37
- declare const DOOM_FULLSCREEN_UI_OPTIONS: {
38
- readonly overlay: true;
39
- readonly overlayOptions: {
40
- readonly anchor: "top-left";
41
- readonly width: "100%";
42
- readonly maxHeight: "100%";
43
- readonly margin: 0;
44
- };
45
- };
46
- declare abstract class DoomOverlay implements Component {
47
- protected readonly tui: DoomOverlayTui;
48
- protected readonly theme: Theme;
49
- protected constructor(tui: DoomOverlayTui, theme: Theme);
50
- invalidate(): void;
51
- render(width: number): string[];
52
- protected abstract getChrome(): DoomOverlayChrome;
53
- protected abstract renderBody(width: number, height: number): string[];
54
- /**
55
- * Edge glyphs and the rule between them are coloured separately: the outer
56
- * rectangle carries the signature colour while an internal separator stays
57
- * muted, meeting the frame at accent-coloured junctions.
58
- */
59
- private borderRow;
60
- private contentRow;
61
- private headerRow;
62
- private footerRow;
63
- /**
64
- * Key legend with each key in a filled cap. Every segment sets its own colour
65
- * so the caps survive: a cap's reset would otherwise strip the surrounding
66
- * dim from the labels that follow it.
67
- */
68
- private hintLegend;
69
- /**
70
- * Right-aligns a status cluster, dropping it whole when the row cannot spare
71
- * the columns. A clipped status reads as a stub (`doom-log…`) that carries
72
- * less than the blank space it costs.
73
- */
74
- private withRightStatus;
75
- private renderCompact;
76
- }
77
- //#endregion
78
- export { DOOM_FULLSCREEN_UI_OPTIONS, DOOM_OVERLAY_ACCENT, DoomOverlay, DoomOverlayChrome, DoomOverlayTui };
79
- //# sourceMappingURL=doomOverlay.d.mts.map
1
+ import { DOOM_FULLSCREEN_UI_OPTIONS, DOOM_NAVIGATION_KEYS, DOOM_OVERLAY_ACCENT, DoomOverlay, DoomOverlayChrome, DoomOverlayTui } from "../tui/doomOverlay.mjs";
2
+ export { DOOM_FULLSCREEN_UI_OPTIONS, DOOM_NAVIGATION_KEYS, DOOM_OVERLAY_ACCENT, DoomOverlay, type DoomOverlayChrome, type DoomOverlayTui };
@@ -1,2 +1 @@
1
- import{fitLine as e,frameLine as t,padLine as n}from"../rendering.mjs";import{truncateToWidth as r,visibleWidth as i}from"@earendil-works/pi-tui";const a=`borderMuted`,o=`accent`,s=[`╭`,`╮`],c=[`├`,`┤`],l=[`╰`,`╯`],u=`mdHeading`,d={overlay:!0,overlayOptions:{anchor:`top-left`,width:`100%`,maxHeight:`100%`,margin:0}};function f(e,t){return!e||t<=0||t<Math.min(i(e),8)?``:r(e,t,`…`)}var p=class{tui;theme;constructor(e,t){this.tui=e,this.theme=t}invalidate(){this.tui.requestRender()}render(e){let t=Math.max(0,Math.floor(e)),r=Math.max(0,Math.floor(this.tui.terminal?.rows??24));if(t===0||r===0)return[];let i=this.getChrome();if(r<6||t<8)return this.renderCompact(i,t,r);let o=t-2,u=o-2,d=r-6,f=this.renderBody(u,d).slice(0,d);for(;f.length<d;)f.push(``);let p=i.accent??a;return[this.borderRow(s,o,p),this.contentRow(this.headerRow(i,u),u,t,p),this.borderRow(c,o,p,a),...f.map(e=>this.contentRow(e,u,t,p)),this.borderRow(c,o,p,a),this.contentRow(this.footerRow(i,u),u,t,p),this.borderRow(l,o,p)].map(e=>n(e,t))}borderRow([e,t],n,r=a,i=r){let o=r??a;return[this.theme.fg(o,e),this.theme.fg(i??o,`─`.repeat(n)),this.theme.fg(o,t)].join(``)}contentRow(e,r,i,o=a){let s=this.theme.fg(o??a,`│`);return t(` ${n(e,r)} `,i,s,s)}headerRow(e,t){let n=e.accent,a=n?t-2:t,s=r(e.title,Math.max(0,a),`…`),c=n?this.theme.inverse(this.theme.bold(this.theme.fg(n,` ${s} `))):this.theme.bold(this.theme.fg(o,s)),l=i(s)+(n?2:0),u=f(e.breadcrumb,t-l-2);return u&&(c+=`${` `.repeat(2)}${this.theme.fg(`dim`,u)}`,l+=2+i(u)),this.withRightStatus(c,l,e.headerRight,t)}footerRow(e,t){let n=e.footerHints?.length?this.hintLegend(e.footerHints,t):this.theme.fg(`dim`,r(e.footer,t,`…`));return this.withRightStatus(n,i(n),e.footerRight,t)}hintLegend(e,t){let n=``,r=0;for(let[a,o]of e){let e=i(a)+i(o)+6;if(r+e>t)break;let s=this.theme.bg(`selectedBg`,this.theme.fg(`text`,` ${a} `));n+=`${n?` `:``}${s}${this.theme.fg(`dim`,` ${o}`)}`,r+=e}return n}withRightStatus(e,t,n,r){let a=n?i(n):0;return!n||a===0||t+2+a>r?e:`${e}${` `.repeat(r-t-a)}${this.theme.fg(`dim`,n)}`}renderCompact(t,r,i){let a=Array.from({length:i},()=>``);return a[0]=this.theme.bold(this.theme.fg(o,t.title)),i>1&&(a[i-1]=this.theme.fg(`dim`,t.footer)),a.map(t=>n(e(t,r),r))}};export{d as DOOM_FULLSCREEN_UI_OPTIONS,u as DOOM_OVERLAY_ACCENT,p as DoomOverlay};
2
- //# sourceMappingURL=doomOverlay.mjs.map
1
+ import{DOOM_FULLSCREEN_UI_OPTIONS as e,DOOM_NAVIGATION_KEYS as t,DOOM_OVERLAY_ACCENT as n,DoomOverlay as r}from"../tui/doomOverlay.mjs";export{e as DOOM_FULLSCREEN_UI_OPTIONS,t as DOOM_NAVIGATION_KEYS,n as DOOM_OVERLAY_ACCENT,r as DoomOverlay};
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../rendering.cjs");let t=require("@earendil-works/pi-tui");const n=` · `,r=` `,i=`text`,a=`accent`,o=`warning`,s=`mdHeading`,c=[`mdCode`,`toolDiffAdded`,`warning`,`muted`];var l=class{theme;snapshot;context;footerData;modes;constructor(e,t,n,r,i=[]){this.theme=e,this.snapshot=t,this.context=n,this.footerData=r,this.modes=i}invalidate(){}render(t){if(t<=0||!this.snapshot.active)return[];if(t<4)return[this.theme.fg(`borderAccent`,`─`.repeat(t))];let n=Math.max(1,t-4),r=n=>this.theme.bg(`userMessageBg`,e.padLine(` ${n}`,t)),a=this.theme.inverse(this.theme.bold(this.theme.fg(s,` LEADER `))),o=`${this.snapshot.prefix.join(` › `)} / ${this.snapshot.label}`,c=r(e.alignLine(`${a} ${this.theme.bold(this.theme.fg(i,o))}`,this.theme.fg(`dim`,`esc cancel · backspace up`),n)),l=this.snapshot.rootOptions?.map(e=>`${e.key} ${e.label}`).join(` · `),u=t>=100&&this.snapshot.prefix.length>1&&l?[r(this.theme.fg(`dim`,`root ${l}`))]:[],d=Math.max(1,14-u.length),f=this.renderOptionGrid(n).slice(0,d).map(r),p=Math.max(0,12-u.length-f.length),m=this.renderDiagnostics(n).slice(0,p).map(r);return[...[r(``),c,r(``),...f,...u,...m].slice(0,15),r(``)]}renderOptionGrid(n){if(this.snapshot.options.length===0)return[];let o=this.snapshot.options.map(e=>({heading:`${this.theme.inverse(this.theme.bold(this.theme.fg(a,` ${e.key} `)))} ${this.theme.bold(this.theme.fg(i,e.label))}`,headingWidth:4+(0,t.visibleWidth)(e.label),detail:e.detail?`${r}${this.theme.fg(`dim`,e.detail)}`:``,detailWidth:e.detail?(0,t.visibleWidth)(r)+(0,t.visibleWidth)(e.detail):0})),s=Math.max(...o.map(e=>Math.max(e.headingWidth,e.detailWidth))),c=Math.min(n,s),l=Math.max(1,Math.floor((n+2)/(c+2))),u=` `.repeat(2),d=[];for(let t=0;t<o.length;t+=l){let r=o.slice(t,t+l);d.push(e.fitLine(r.map(t=>e.padLine(t.heading,c)).join(u),n)),d.push(e.fitLine(r.map(t=>e.padLine(t.detail,c)).join(u),n))}return d}renderDiagnostics(e){let t=this.sessionDiagnostics(),n=this.extensionDiagnostics(e),r=this.modeDiagnostics();if(!t&&!r&&n.length===0)return[];let i=[this.theme.fg(`borderMuted`,`─`.repeat(e))];r&&i.push(this.diagnosticLine(`MODES`,r,o)),t&&i.push(this.diagnosticLine(`SESSION`,t,s));for(let[e,t]of n.entries()){let n=e===0;i.push(this.diagnosticLine(n?`EXTENSIONS`:`↳`,t,n?a:`dim`))}return i}diagnosticLine(e,t,n){return`${this.theme.bold(this.theme.fg(n,e.padEnd(11)))}${t}`}modeDiagnostics(){if(this.modes.length!==0)return this.modes.map(e=>{let t=this.theme.fg(o,e.label.toLowerCase());return e.detail?`${t}${this.theme.fg(`dim`,` (${e.detail})`)}`:t}).join(this.theme.fg(`dim`,n))}sessionDiagnostics(){if(!this.context)return;let t=0,r=0,i=0,a=0,s=0;for(let e of this.context.sessionManager.getBranch())e.type===`message`&&e.message.role===`assistant`&&(t+=e.message.usage.input,r+=e.message.usage.output,i+=e.message.usage.cacheRead,a+=e.message.usage.cacheWrite,s+=e.message.usage.cost.total);let c=t+i+a,l=c===0?0:i/c*100,u=this.context.getContextUsage(),d=u?.percent===null||u?.percent===void 0?`ctx ?`:`ctx ${u.percent.toFixed(1)}% / ${e.formatTokens(u.contextWindow)}`;return`${this.theme.fg(`muted`,`↑${e.formatTokens(t)} ↓${e.formatTokens(r)} R${e.formatTokens(i)} W${e.formatTokens(a)} CH${l.toFixed(1)}%`)} ${this.theme.fg(o,`$${s.toFixed(3)}`)}${this.theme.fg(`dim`,`${n}${d}`)}`}extensionDiagnostics(t){if(!this.footerData)return[];let r=[...this.footerData.getExtensionStatuses().values()],i=this.footerData.getAvailableProviderCount(),a=[...r];i>0&&a.push(`${i} provider${i===1?``:`s`}`);let o=a.map((e,t)=>this.theme.fg(c[t%c.length],e)),s=Math.max(1,t-15);return e.packSegments(o,s,this.theme.fg(`dim`,n)).slice(0,2)}};exports.LeaderHints=l;
2
- //# sourceMappingURL=leaderHints.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../tui/leaderHints.cjs");exports.LeaderHints=e.LeaderHints;
@@ -1,37 +1,2 @@
1
- import { mode_d_exports } from "../mode.cjs";
2
- import { LeaderSnapshot } from "../uiState.cjs";
3
- import { ExtensionContext, ReadonlyFooterDataProvider, Theme } from "@earendil-works/pi-coding-agent";
4
- import { Component } from "@earendil-works/pi-tui";
5
- //#region src/components/leaderHints.d.ts
6
- declare class LeaderHints implements Component {
7
- private readonly theme;
8
- private readonly snapshot;
9
- private readonly context?;
10
- private readonly footerData?;
11
- private readonly modes;
12
- constructor(theme: Theme, snapshot: LeaderSnapshot, context?: ExtensionContext | undefined, footerData?: ReadonlyFooterDataProvider | undefined, modes?: readonly mode_d_exports.DoomModeStatus[]);
13
- invalidate(): void;
14
- render(width: number): string[];
15
- /**
16
- * Lays options out on a fixed cell grid rather than a packed run of segments,
17
- * so keys and labels stay column-aligned when the list wraps.
18
- */
19
- private renderOptionGrid;
20
- /** Content lines only: the caller paints the shade and pads to full width. */
21
- private renderDiagnostics;
22
- private diagnosticLine;
23
- /**
24
- * The enabled modes with their detail, which is the long form of what the
25
- * editor's badge row shows as bare names.
26
- *
27
- * This panel is opened deliberately and has room, so it is the right place
28
- * for `plan (normal - read only)`: the badge row is glanced at mid-typing and
29
- * only has to answer which modes are on.
30
- */
31
- private modeDiagnostics;
32
- private sessionDiagnostics;
33
- private extensionDiagnostics;
34
- }
35
- //#endregion
36
- export { LeaderHints };
37
- //# sourceMappingURL=leaderHints.d.cts.map
1
+ import { LeaderHints } from "../tui/leaderHints.cjs";
2
+ export { LeaderHints };
@@ -1,37 +1,2 @@
1
- import { mode_d_exports } from "../mode.mjs";
2
- import { LeaderSnapshot } from "../uiState.mjs";
3
- import { ExtensionContext, ReadonlyFooterDataProvider, Theme } from "@earendil-works/pi-coding-agent";
4
- import { Component } from "@earendil-works/pi-tui";
5
- //#region src/components/leaderHints.d.ts
6
- declare class LeaderHints implements Component {
7
- private readonly theme;
8
- private readonly snapshot;
9
- private readonly context?;
10
- private readonly footerData?;
11
- private readonly modes;
12
- constructor(theme: Theme, snapshot: LeaderSnapshot, context?: ExtensionContext | undefined, footerData?: ReadonlyFooterDataProvider | undefined, modes?: readonly mode_d_exports.DoomModeStatus[]);
13
- invalidate(): void;
14
- render(width: number): string[];
15
- /**
16
- * Lays options out on a fixed cell grid rather than a packed run of segments,
17
- * so keys and labels stay column-aligned when the list wraps.
18
- */
19
- private renderOptionGrid;
20
- /** Content lines only: the caller paints the shade and pads to full width. */
21
- private renderDiagnostics;
22
- private diagnosticLine;
23
- /**
24
- * The enabled modes with their detail, which is the long form of what the
25
- * editor's badge row shows as bare names.
26
- *
27
- * This panel is opened deliberately and has room, so it is the right place
28
- * for `plan (normal - read only)`: the badge row is glanced at mid-typing and
29
- * only has to answer which modes are on.
30
- */
31
- private modeDiagnostics;
32
- private sessionDiagnostics;
33
- private extensionDiagnostics;
34
- }
35
- //#endregion
36
- export { LeaderHints };
37
- //# sourceMappingURL=leaderHints.d.mts.map
1
+ import { LeaderHints } from "../tui/leaderHints.mjs";
2
+ export { LeaderHints };
@@ -1,2 +1 @@
1
- import{alignLine as e,fitLine as t,formatTokens as n,packSegments as r,padLine as i}from"../rendering.mjs";import{visibleWidth as a}from"@earendil-works/pi-tui";const o=` · `,s=` `,c=`text`,l=`accent`,u=`warning`,d=`mdHeading`,f=[`mdCode`,`toolDiffAdded`,`warning`,`muted`];var p=class{theme;snapshot;context;footerData;modes;constructor(e,t,n,r,i=[]){this.theme=e,this.snapshot=t,this.context=n,this.footerData=r,this.modes=i}invalidate(){}render(t){if(t<=0||!this.snapshot.active)return[];if(t<4)return[this.theme.fg(`borderAccent`,`─`.repeat(t))];let n=Math.max(1,t-4),r=e=>this.theme.bg(`userMessageBg`,i(` ${e}`,t)),a=this.theme.inverse(this.theme.bold(this.theme.fg(d,` LEADER `))),o=`${this.snapshot.prefix.join(` › `)} / ${this.snapshot.label}`,s=r(e(`${a} ${this.theme.bold(this.theme.fg(c,o))}`,this.theme.fg(`dim`,`esc cancel · backspace up`),n)),l=this.snapshot.rootOptions?.map(e=>`${e.key} ${e.label}`).join(` · `),u=t>=100&&this.snapshot.prefix.length>1&&l?[r(this.theme.fg(`dim`,`root ${l}`))]:[],f=Math.max(1,14-u.length),p=this.renderOptionGrid(n).slice(0,f).map(r),m=Math.max(0,12-u.length-p.length),h=this.renderDiagnostics(n).slice(0,m).map(r);return[...[r(``),s,r(``),...p,...u,...h].slice(0,15),r(``)]}renderOptionGrid(e){if(this.snapshot.options.length===0)return[];let n=this.snapshot.options.map(e=>({heading:`${this.theme.inverse(this.theme.bold(this.theme.fg(l,` ${e.key} `)))} ${this.theme.bold(this.theme.fg(c,e.label))}`,headingWidth:4+a(e.label),detail:e.detail?`${s}${this.theme.fg(`dim`,e.detail)}`:``,detailWidth:e.detail?a(s)+a(e.detail):0})),r=Math.max(...n.map(e=>Math.max(e.headingWidth,e.detailWidth))),o=Math.min(e,r),u=Math.max(1,Math.floor((e+2)/(o+2))),d=` `.repeat(2),f=[];for(let r=0;r<n.length;r+=u){let a=n.slice(r,r+u);f.push(t(a.map(e=>i(e.heading,o)).join(d),e)),f.push(t(a.map(e=>i(e.detail,o)).join(d),e))}return f}renderDiagnostics(e){let t=this.sessionDiagnostics(),n=this.extensionDiagnostics(e),r=this.modeDiagnostics();if(!t&&!r&&n.length===0)return[];let i=[this.theme.fg(`borderMuted`,`─`.repeat(e))];r&&i.push(this.diagnosticLine(`MODES`,r,u)),t&&i.push(this.diagnosticLine(`SESSION`,t,d));for(let[e,t]of n.entries()){let n=e===0;i.push(this.diagnosticLine(n?`EXTENSIONS`:`↳`,t,n?l:`dim`))}return i}diagnosticLine(e,t,n){return`${this.theme.bold(this.theme.fg(n,e.padEnd(11)))}${t}`}modeDiagnostics(){if(this.modes.length!==0)return this.modes.map(e=>{let t=this.theme.fg(u,e.label.toLowerCase());return e.detail?`${t}${this.theme.fg(`dim`,` (${e.detail})`)}`:t}).join(this.theme.fg(`dim`,o))}sessionDiagnostics(){if(!this.context)return;let e=0,t=0,r=0,i=0,a=0;for(let n of this.context.sessionManager.getBranch())n.type===`message`&&n.message.role===`assistant`&&(e+=n.message.usage.input,t+=n.message.usage.output,r+=n.message.usage.cacheRead,i+=n.message.usage.cacheWrite,a+=n.message.usage.cost.total);let s=e+r+i,c=s===0?0:r/s*100,l=this.context.getContextUsage(),d=l?.percent===null||l?.percent===void 0?`ctx ?`:`ctx ${l.percent.toFixed(1)}% / ${n(l.contextWindow)}`;return`${this.theme.fg(`muted`,`↑${n(e)} ↓${n(t)} R${n(r)} W${n(i)} CH${c.toFixed(1)}%`)} ${this.theme.fg(u,`$${a.toFixed(3)}`)}${this.theme.fg(`dim`,`${o}${d}`)}`}extensionDiagnostics(e){if(!this.footerData)return[];let t=[...this.footerData.getExtensionStatuses().values()],n=this.footerData.getAvailableProviderCount(),i=[...t];n>0&&i.push(`${n} provider${n===1?``:`s`}`);let a=i.map((e,t)=>this.theme.fg(f[t%f.length],e)),s=Math.max(1,e-15);return r(a,s,this.theme.fg(`dim`,o)).slice(0,2)}};export{p as LeaderHints};
2
- //# sourceMappingURL=leaderHints.mjs.map
1
+ import{LeaderHints as e}from"../tui/leaderHints.mjs";export{e as LeaderHints};
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./doomOverlay.cjs");let t=require("@earendil-works/pi-tui");const n=[[`↑↓`,`move`],[`esc`,`close`]],r=`No tools are registered in this session.`;function i(e,n){let r=(0,t.truncateToWidth)(e,Math.max(0,n),`…`);return r+` `.repeat(Math.max(0,n-(0,t.visibleWidth)(r)))}function a(e,n,r){let a=(0,t.visibleWidth)(n),o=Math.max(0,r-a-1);return i(e,o)+` `.repeat(Math.max(1,r-o-a))+i(n,a)}function o(e,t){if(t<=0)return[];let n=[],r=``;for(let i of e.split(/\s+/).filter(Boolean))r.length===0?r=i:r.length+1+i.length<=t?r+=` ${i}`:(n.push(r),r=i);return r.length>0&&n.push(r),n}function s(e){if(typeof e!=`object`||!e)return[];let t=e;if(typeof t.properties!=`object`||t.properties===null)return[];let n=new Set(Array.isArray(t.required)?t.required.filter(e=>typeof e==`string`):[]);return Object.entries(t.properties).map(([e,t])=>{let r=typeof t==`object`&&t?t.type:void 0;return{name:e,type:typeof r==`string`?r:``,required:n.has(e)}})}function c(e){return e.tools.reduce((e,t)=>e+ +!!t.active,0)}var l=class extends e.DoomOverlay{sources;done;selected;bodyHeight=1;constructor(e,t,n,r){super(e,t),this.sources=n,this.done=r,this.selected=this.rows().findIndex(e=>e.kind===`tool`)}rows(){let e=[];for(let t of this.sources){e.push({kind:`source`,source:t});for(let n of t.tools)e.push({kind:`tool`,source:t,tool:n})}return e}currentTool(){let e=this.rows()[this.selected];return e?.kind===`tool`?e:void 0}move(e){let t=this.rows(),n=e<0?-1:1,r=this.selected;for(let i=Math.abs(e);i>0;--i){let e=r+n;for(;e>=0&&e<t.length&&t[e]?.kind!==`tool`;)e+=n;if(e<0||e>=t.length)break;r=e}r!==this.selected&&(this.selected=r,this.tui.requestRender())}handleInput(e){if((0,t.matchesKey)(e,`escape`)||(0,t.matchesKey)(e,`ctrl+c`)||e===`q`){this.done(void 0);return}if((0,t.matchesKey)(e,`up`)||e===`k`)return this.move(-1);if((0,t.matchesKey)(e,`down`)||e===`j`)return this.move(1);if((0,t.matchesKey)(e,`pageUp`))return this.move(-Math.max(1,this.bodyHeight-1));if((0,t.matchesKey)(e,`pageDown`))return this.move(Math.max(1,this.bodyHeight-1))}treeLines(e){let t=this.rows(),n=[this.theme.bold(`SOURCES`),``];if(t.length===0)return n.push(this.theme.fg(`dim`,r)),n;let o=Math.max(1,this.bodyHeight-n.length),s=Math.max(0,Math.min(this.selected,t.length-1)),l=Math.max(0,Math.min(s-o+1,Math.max(0,t.length-o)));for(let[r,u]of t.slice(l,l+o).entries()){let t=u.kind===`source`?a(this.theme.bold(u.source.label),this.theme.fg(`dim`,u.source.status??String(c(u.source))),e):this.theme.fg(u.tool.active?`text`:`dim`,i(` ${u.tool.name}`,e));n.push(l+r===s?this.theme.bg(`selectedBg`,i(t,e)):t)}return n}field(e,t,n){let r=Math.max(1,n-12);return o(t,r).map((t,n)=>`${this.theme.fg(`dim`,i(n===0?e:``,12))}${i(t,r)}`)}toolLines(e,t,n){let r=[this.theme.bold(t.name),``];r.push(...this.field(`source`,e.label,n)),e.detail&&r.push(...this.field(`registered`,e.detail,n)),r.push(...this.field(`status`,t.active?this.theme.fg(`success`,`active`):this.theme.fg(`dim`,`inactive`),n)),t.description&&(r.push(``),r.push(...o(t.description,n)));let i=s(t.parameters);if(i.length>0){r.push(``),r.push(this.theme.fg(`dim`,`PARAMETERS`));for(let e of i){let t=e.required?`${e.name}${this.theme.fg(`warning`,` *`)}`:e.name;r.push(a(t,this.theme.fg(`dim`,e.type),n))}}for(let e of t.promptGuidelines??[])r.push(``),r.push(...o(e,n));return r}detailLines(e){let t=this.currentTool();return t?this.toolLines(t.source,t.tool,e):[this.theme.fg(`dim`,r)]}getChrome(){let t=`${this.sources.reduce((e,t)=>e+c(t),0)}/${this.sources.reduce((e,t)=>e+t.tools.length,0)}`;return{title:`TOOLS`,accent:e.DOOM_OVERLAY_ACCENT,breadcrumb:`SPC › e / t · tools`,headerRight:`${t} tools · ${this.sources.length} sources · esc close`,footer:this.hintLine()}}hintLine(){return n.map(([e,t])=>`${this.theme.bg(`selectedBg`,this.theme.fg(`text`,` ${e} `))}${this.theme.fg(`dim`,` ${t}`)}`).join(this.theme.fg(`dim`,` `))}renderBody(e,n){if(this.bodyHeight=n,e<48)return this.renderStacked(e,n);let r=Math.max(18,Math.floor((e-1)*.3333333333333333)),a=Math.max(1,e-r-1),o=Math.max(1,r-1),s=Math.max(1,a-1),c=this.treeLines(o),l=this.detailLines(s),u=this.theme.fg(`borderMuted`,`│`);return Array.from({length:n},(n,r)=>{let a=`${i(c[r]??``,o)} ${u} ${i(l[r]??``,s)}`;return(0,t.truncateToWidth)(a,e,`…`)})}renderStacked(e,t){let n=Math.max(1,Math.floor((t-1)/2)),r=Math.max(0,t-n-1);this.bodyHeight=n;let i=this.treeLines(e),a=this.detailLines(e);return[...i.slice(0,n),...Array.from({length:Math.max(0,n-i.length)},()=>``),this.theme.fg(`borderMuted`,`─`.repeat(e)),...a.slice(0,r)]}};async function u(t,n){await t.ui.custom((e,t,r,i)=>new l(e,t,n,i),e.DOOM_FULLSCREEN_UI_OPTIONS)}exports.ToolsOverlayComponent=l,exports.openToolsOverlay=u;
2
- //# sourceMappingURL=toolsOverlay.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../tui/toolsOverlay.cjs");exports.ToolsOverlayComponent=e.ToolsOverlayComponent,exports.openToolsOverlay=e.openToolsOverlay;
@@ -1,29 +1,2 @@
1
- import { DoomOverlay, DoomOverlayChrome, DoomOverlayTui } from "./doomOverlay.cjs";
2
- import { ToolSource } from "../toolInventory.cjs";
3
- import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
4
- //#region src/components/toolsOverlay.d.ts
5
- declare class ToolsOverlayComponent extends DoomOverlay {
6
- private readonly sources;
7
- private readonly done;
8
- private selected;
9
- private bodyHeight;
10
- constructor(tui: DoomOverlayTui, theme: Theme, sources: readonly ToolSource[], done: (result: undefined) => void);
11
- /** Every source is always expanded: the source row is a heading, not a control. */
12
- private rows;
13
- private currentTool;
14
- /** Source rows are labels, so the cursor steps over them to the next tool. */
15
- private move;
16
- handleInput(data: string): void;
17
- private treeLines;
18
- private field;
19
- private toolLines;
20
- private detailLines;
21
- protected getChrome(): DoomOverlayChrome;
22
- private hintLine;
23
- protected renderBody(width: number, height: number): string[];
24
- private renderStacked;
25
- }
26
- declare function openToolsOverlay(ctx: ExtensionContext, sources: readonly ToolSource[]): Promise<void>;
27
- //#endregion
28
- export { ToolsOverlayComponent, openToolsOverlay };
29
- //# sourceMappingURL=toolsOverlay.d.cts.map
1
+ import { ToolsOverlayComponent, openToolsOverlay } from "../tui/toolsOverlay.cjs";
2
+ export { ToolsOverlayComponent, openToolsOverlay };