@vaporsoft/orc 0.1.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 (223) hide show
  1. package/LICENSE +6 -0
  2. package/README.md +178 -0
  3. package/dist/bin/orc.d.ts +3 -0
  4. package/dist/bin/orc.d.ts.map +1 -0
  5. package/dist/bin/orc.js +4 -0
  6. package/dist/bin/orc.js.map +1 -0
  7. package/dist/src/cli.d.ts +6 -0
  8. package/dist/src/cli.d.ts.map +1 -0
  9. package/dist/src/cli.js +28 -0
  10. package/dist/src/cli.js.map +1 -0
  11. package/dist/src/commands/init.d.ts +6 -0
  12. package/dist/src/commands/init.d.ts.map +1 -0
  13. package/dist/src/commands/init.js +58 -0
  14. package/dist/src/commands/init.js.map +1 -0
  15. package/dist/src/commands/start.d.ts +17 -0
  16. package/dist/src/commands/start.d.ts.map +1 -0
  17. package/dist/src/commands/start.js +146 -0
  18. package/dist/src/commands/start.js.map +1 -0
  19. package/dist/src/constants.d.ts +18 -0
  20. package/dist/src/constants.d.ts.map +1 -0
  21. package/dist/src/constants.js +42 -0
  22. package/dist/src/constants.js.map +1 -0
  23. package/dist/src/core/comment-categorizer.d.ts +20 -0
  24. package/dist/src/core/comment-categorizer.d.ts.map +1 -0
  25. package/dist/src/core/comment-categorizer.js +208 -0
  26. package/dist/src/core/comment-categorizer.js.map +1 -0
  27. package/dist/src/core/comment-fetcher.d.ts +37 -0
  28. package/dist/src/core/comment-fetcher.d.ts.map +1 -0
  29. package/dist/src/core/comment-fetcher.js +138 -0
  30. package/dist/src/core/comment-fetcher.js.map +1 -0
  31. package/dist/src/core/daemon.d.ts +92 -0
  32. package/dist/src/core/daemon.d.ts.map +1 -0
  33. package/dist/src/core/daemon.js +896 -0
  34. package/dist/src/core/daemon.js.map +1 -0
  35. package/dist/src/core/fix-executor.d.ts +50 -0
  36. package/dist/src/core/fix-executor.d.ts.map +1 -0
  37. package/dist/src/core/fix-executor.js +374 -0
  38. package/dist/src/core/fix-executor.js.map +1 -0
  39. package/dist/src/core/git-manager.d.ts +44 -0
  40. package/dist/src/core/git-manager.d.ts.map +1 -0
  41. package/dist/src/core/git-manager.js +230 -0
  42. package/dist/src/core/git-manager.js.map +1 -0
  43. package/dist/src/core/pilot-config.d.ts +18 -0
  44. package/dist/src/core/pilot-config.d.ts.map +1 -0
  45. package/dist/src/core/pilot-config.js +76 -0
  46. package/dist/src/core/pilot-config.js.map +1 -0
  47. package/dist/src/core/progress-store.d.ts +32 -0
  48. package/dist/src/core/progress-store.d.ts.map +1 -0
  49. package/dist/src/core/progress-store.js +106 -0
  50. package/dist/src/core/progress-store.js.map +1 -0
  51. package/dist/src/core/repo-config.d.ts +11 -0
  52. package/dist/src/core/repo-config.d.ts.map +1 -0
  53. package/dist/src/core/repo-config.js +168 -0
  54. package/dist/src/core/repo-config.js.map +1 -0
  55. package/dist/src/core/session-controller.d.ts +61 -0
  56. package/dist/src/core/session-controller.d.ts.map +1 -0
  57. package/dist/src/core/session-controller.js +926 -0
  58. package/dist/src/core/session-controller.js.map +1 -0
  59. package/dist/src/core/thread-responder.d.ts +28 -0
  60. package/dist/src/core/thread-responder.d.ts.map +1 -0
  61. package/dist/src/core/thread-responder.js +193 -0
  62. package/dist/src/core/thread-responder.js.map +1 -0
  63. package/dist/src/core/worktree-manager.d.ts +26 -0
  64. package/dist/src/core/worktree-manager.d.ts.map +1 -0
  65. package/dist/src/core/worktree-manager.js +189 -0
  66. package/dist/src/core/worktree-manager.js.map +1 -0
  67. package/dist/src/github/gh-client.d.ts +57 -0
  68. package/dist/src/github/gh-client.d.ts.map +1 -0
  69. package/dist/src/github/gh-client.js +236 -0
  70. package/dist/src/github/gh-client.js.map +1 -0
  71. package/dist/src/github/queries.d.ts +9 -0
  72. package/dist/src/github/queries.d.ts.map +1 -0
  73. package/dist/src/github/queries.js +152 -0
  74. package/dist/src/github/queries.js.map +1 -0
  75. package/dist/src/github/types.d.ts +114 -0
  76. package/dist/src/github/types.d.ts.map +1 -0
  77. package/dist/src/github/types.js +3 -0
  78. package/dist/src/github/types.js.map +1 -0
  79. package/dist/src/tui/App.d.ts +8 -0
  80. package/dist/src/tui/App.d.ts.map +1 -0
  81. package/dist/src/tui/App.js +407 -0
  82. package/dist/src/tui/App.js.map +1 -0
  83. package/dist/src/tui/components/ActivityPane.d.ts +7 -0
  84. package/dist/src/tui/components/ActivityPane.d.ts.map +1 -0
  85. package/dist/src/tui/components/ActivityPane.js +10 -0
  86. package/dist/src/tui/components/ActivityPane.js.map +1 -0
  87. package/dist/src/tui/components/DetailPanel.d.ts +15 -0
  88. package/dist/src/tui/components/DetailPanel.d.ts.map +1 -0
  89. package/dist/src/tui/components/DetailPanel.js +137 -0
  90. package/dist/src/tui/components/DetailPanel.js.map +1 -0
  91. package/dist/src/tui/components/DrillInOverlay.d.ts +13 -0
  92. package/dist/src/tui/components/DrillInOverlay.d.ts.map +1 -0
  93. package/dist/src/tui/components/DrillInOverlay.js +85 -0
  94. package/dist/src/tui/components/DrillInOverlay.js.map +1 -0
  95. package/dist/src/tui/components/ExpandedContent.d.ts +10 -0
  96. package/dist/src/tui/components/ExpandedContent.d.ts.map +1 -0
  97. package/dist/src/tui/components/ExpandedContent.js +99 -0
  98. package/dist/src/tui/components/ExpandedContent.js.map +1 -0
  99. package/dist/src/tui/components/Header.d.ts +12 -0
  100. package/dist/src/tui/components/Header.d.ts.map +1 -0
  101. package/dist/src/tui/components/Header.js +35 -0
  102. package/dist/src/tui/components/Header.js.map +1 -0
  103. package/dist/src/tui/components/HelpBar.d.ts +2 -0
  104. package/dist/src/tui/components/HelpBar.d.ts.map +1 -0
  105. package/dist/src/tui/components/HelpBar.js +11 -0
  106. package/dist/src/tui/components/HelpBar.js.map +1 -0
  107. package/dist/src/tui/components/KeybindLegend.d.ts +7 -0
  108. package/dist/src/tui/components/KeybindLegend.d.ts.map +1 -0
  109. package/dist/src/tui/components/KeybindLegend.js +53 -0
  110. package/dist/src/tui/components/KeybindLegend.js.map +1 -0
  111. package/dist/src/tui/components/LogPane.d.ts +11 -0
  112. package/dist/src/tui/components/LogPane.d.ts.map +1 -0
  113. package/dist/src/tui/components/LogPane.js +31 -0
  114. package/dist/src/tui/components/LogPane.js.map +1 -0
  115. package/dist/src/tui/components/SessionList.d.ts +14 -0
  116. package/dist/src/tui/components/SessionList.d.ts.map +1 -0
  117. package/dist/src/tui/components/SessionList.js +31 -0
  118. package/dist/src/tui/components/SessionList.js.map +1 -0
  119. package/dist/src/tui/components/SessionRow.d.ts +10 -0
  120. package/dist/src/tui/components/SessionRow.d.ts.map +1 -0
  121. package/dist/src/tui/components/SessionRow.js +52 -0
  122. package/dist/src/tui/components/SessionRow.js.map +1 -0
  123. package/dist/src/tui/components/SettingsPanel.d.ts +8 -0
  124. package/dist/src/tui/components/SettingsPanel.d.ts.map +1 -0
  125. package/dist/src/tui/components/SettingsPanel.js +191 -0
  126. package/dist/src/tui/components/SettingsPanel.js.map +1 -0
  127. package/dist/src/tui/components/StatusBadge.d.ts +9 -0
  128. package/dist/src/tui/components/StatusBadge.d.ts.map +1 -0
  129. package/dist/src/tui/components/StatusBadge.js +52 -0
  130. package/dist/src/tui/components/StatusBadge.js.map +1 -0
  131. package/dist/src/tui/components/Toolbar.d.ts +5 -0
  132. package/dist/src/tui/components/Toolbar.d.ts.map +1 -0
  133. package/dist/src/tui/components/Toolbar.js +2 -0
  134. package/dist/src/tui/components/Toolbar.js.map +1 -0
  135. package/dist/src/tui/components/comment-constants.d.ts +4 -0
  136. package/dist/src/tui/components/comment-constants.d.ts.map +1 -0
  137. package/dist/src/tui/components/comment-constants.js +15 -0
  138. package/dist/src/tui/components/comment-constants.js.map +1 -0
  139. package/dist/src/tui/hooks/logFlushUtils.d.ts +15 -0
  140. package/dist/src/tui/hooks/logFlushUtils.d.ts.map +1 -0
  141. package/dist/src/tui/hooks/logFlushUtils.js +33 -0
  142. package/dist/src/tui/hooks/logFlushUtils.js.map +1 -0
  143. package/dist/src/tui/hooks/useBranchLogs.d.ts +7 -0
  144. package/dist/src/tui/hooks/useBranchLogs.d.ts.map +1 -0
  145. package/dist/src/tui/hooks/useBranchLogs.js +58 -0
  146. package/dist/src/tui/hooks/useBranchLogs.js.map +1 -0
  147. package/dist/src/tui/hooks/useDaemonState.d.ts +19 -0
  148. package/dist/src/tui/hooks/useDaemonState.d.ts.map +1 -0
  149. package/dist/src/tui/hooks/useDaemonState.js +152 -0
  150. package/dist/src/tui/hooks/useDaemonState.js.map +1 -0
  151. package/dist/src/tui/hooks/useInitialDiscovery.d.ts +8 -0
  152. package/dist/src/tui/hooks/useInitialDiscovery.d.ts.map +1 -0
  153. package/dist/src/tui/hooks/useInitialDiscovery.js +31 -0
  154. package/dist/src/tui/hooks/useInitialDiscovery.js.map +1 -0
  155. package/dist/src/tui/hooks/useLogBuffer.d.ts +7 -0
  156. package/dist/src/tui/hooks/useLogBuffer.d.ts.map +1 -0
  157. package/dist/src/tui/hooks/useLogBuffer.js +52 -0
  158. package/dist/src/tui/hooks/useLogBuffer.js.map +1 -0
  159. package/dist/src/tui/hooks/useNextCheckCountdown.d.ts +7 -0
  160. package/dist/src/tui/hooks/useNextCheckCountdown.d.ts.map +1 -0
  161. package/dist/src/tui/hooks/useNextCheckCountdown.js +42 -0
  162. package/dist/src/tui/hooks/useNextCheckCountdown.js.map +1 -0
  163. package/dist/src/tui/hooks/useTerminalFocus.d.ts +9 -0
  164. package/dist/src/tui/hooks/useTerminalFocus.d.ts.map +1 -0
  165. package/dist/src/tui/hooks/useTerminalFocus.js +43 -0
  166. package/dist/src/tui/hooks/useTerminalFocus.js.map +1 -0
  167. package/dist/src/tui/theme.d.ts +32 -0
  168. package/dist/src/tui/theme.d.ts.map +1 -0
  169. package/dist/src/tui/theme.js +61 -0
  170. package/dist/src/tui/theme.js.map +1 -0
  171. package/dist/src/types/config.d.ts +35 -0
  172. package/dist/src/types/config.d.ts.map +1 -0
  173. package/dist/src/types/config.js +14 -0
  174. package/dist/src/types/config.js.map +1 -0
  175. package/dist/src/types/index.d.ts +107 -0
  176. package/dist/src/types/index.d.ts.map +1 -0
  177. package/dist/src/types/index.js +3 -0
  178. package/dist/src/types/index.js.map +1 -0
  179. package/dist/src/utils/concurrency.d.ts +7 -0
  180. package/dist/src/utils/concurrency.d.ts.map +1 -0
  181. package/dist/src/utils/concurrency.js +26 -0
  182. package/dist/src/utils/concurrency.js.map +1 -0
  183. package/dist/src/utils/format.d.ts +2 -0
  184. package/dist/src/utils/format.d.ts.map +1 -0
  185. package/dist/src/utils/format.js +8 -0
  186. package/dist/src/utils/format.js.map +1 -0
  187. package/dist/src/utils/logger.d.ts +39 -0
  188. package/dist/src/utils/logger.d.ts.map +1 -0
  189. package/dist/src/utils/logger.js +120 -0
  190. package/dist/src/utils/logger.js.map +1 -0
  191. package/dist/src/utils/notify.d.ts +6 -0
  192. package/dist/src/utils/notify.d.ts.map +1 -0
  193. package/dist/src/utils/notify.js +15 -0
  194. package/dist/src/utils/notify.js.map +1 -0
  195. package/dist/src/utils/open-terminal.d.ts +12 -0
  196. package/dist/src/utils/open-terminal.d.ts.map +1 -0
  197. package/dist/src/utils/open-terminal.js +93 -0
  198. package/dist/src/utils/open-terminal.js.map +1 -0
  199. package/dist/src/utils/process.d.ts +14 -0
  200. package/dist/src/utils/process.d.ts.map +1 -0
  201. package/dist/src/utils/process.js +36 -0
  202. package/dist/src/utils/process.js.map +1 -0
  203. package/dist/src/utils/project-detector.d.ts +12 -0
  204. package/dist/src/utils/project-detector.d.ts.map +1 -0
  205. package/dist/src/utils/project-detector.js +123 -0
  206. package/dist/src/utils/project-detector.js.map +1 -0
  207. package/dist/src/utils/quoting.d.ts +15 -0
  208. package/dist/src/utils/quoting.d.ts.map +1 -0
  209. package/dist/src/utils/quoting.js +39 -0
  210. package/dist/src/utils/quoting.js.map +1 -0
  211. package/dist/src/utils/retry.d.ts +14 -0
  212. package/dist/src/utils/retry.d.ts.map +1 -0
  213. package/dist/src/utils/retry.js +41 -0
  214. package/dist/src/utils/retry.js.map +1 -0
  215. package/dist/src/utils/settings.d.ts +14 -0
  216. package/dist/src/utils/settings.d.ts.map +1 -0
  217. package/dist/src/utils/settings.js +21 -0
  218. package/dist/src/utils/settings.js.map +1 -0
  219. package/dist/src/utils/time.d.ts +2 -0
  220. package/dist/src/utils/time.d.ts.map +1 -0
  221. package/dist/src/utils/time.js +5 -0
  222. package/dist/src/utils/time.js.map +1 -0
  223. package/package.json +73 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeybindLegend.js","sourceRoot":"","sources":["../../../../src/tui/components/KeybindLegend.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LogEntry } from "../../utils/logger.js";
2
+ interface LogPaneProps {
3
+ entries: LogEntry[];
4
+ focused: boolean;
5
+ scrollOffset: number;
6
+ visibleLines: number;
7
+ label?: string;
8
+ }
9
+ export declare function LogPane({ entries, focused, scrollOffset, visibleLines, label }: LogPaneProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=LogPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogPane.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/LogPane.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,UAAU,YAAY;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkBD,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAc,EAAE,EAAE,YAAY,2CA4CrG"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { useTheme } from "../theme.js";
4
+ function levelColors(theme) {
5
+ return {
6
+ debug: theme.muted,
7
+ info: theme.text,
8
+ warn: theme.warning,
9
+ error: theme.error,
10
+ };
11
+ }
12
+ const LEVEL_SYMBOLS = {
13
+ debug: "·",
14
+ info: "│",
15
+ warn: "▪",
16
+ error: "✗",
17
+ };
18
+ export function LogPane({ entries, focused, scrollOffset, visibleLines, label = "Logs" }) {
19
+ const theme = useTheme();
20
+ const colors = levelColors(theme);
21
+ const maxOffset = Math.max(0, entries.length - visibleLines);
22
+ const offset = Math.min(scrollOffset, maxOffset);
23
+ const visible = entries.slice(Math.max(0, entries.length - visibleLines - offset), entries.length - offset);
24
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.border, borderTop: false, borderBottom: false, children: [_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { color: theme.accent, dimColor: true, children: "━━ " }), _jsxs(Text, { color: theme.accent, bold: true, children: [focused ? "▸ " : " ", label] }), _jsx(Text, { color: theme.accent, dimColor: true, children: " " + "─".repeat(Math.max(0, 40 - label.length)) })] }), visible.length === 0 ? (_jsx(Box, { paddingX: 1, marginLeft: 2, children: _jsx(Text, { dimColor: true, children: "No log entries yet" }) })) : (visible.map((entry, i) => {
25
+ const time = entry.timestamp.split("T")[1]?.slice(0, 8) ?? "";
26
+ const sym = LEVEL_SYMBOLS[entry.level] ?? "│";
27
+ const prefix = entry.branch ? `[${entry.branch}] ` : "";
28
+ return (_jsxs(Box, { paddingX: 1, marginLeft: 2, children: [_jsxs(Text, { dimColor: true, children: [time, " "] }), _jsxs(Text, { color: colors[entry.level] ?? theme.text, children: [sym, " ", prefix, entry.message] })] }, i));
29
+ }))] }));
30
+ }
31
+ //# sourceMappingURL=LogPane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogPane.js","sourceRoot":"","sources":["../../../../src/tui/components/LogPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { PREntry } from "../hooks/useDaemonState.js";
2
+ interface SessionListProps {
3
+ entries: Map<string, PREntry>;
4
+ selectedIndex: number;
5
+ focused: boolean;
6
+ openBranches: string[];
7
+ mergedBranches: string[];
8
+ renderPaused?: boolean;
9
+ /** True while the daemon's initial PR discovery is still in progress. */
10
+ isDiscovering?: boolean;
11
+ }
12
+ export declare function SessionList({ entries, selectedIndex, focused, openBranches, mergedBranches, renderPaused, isDiscovering }: SessionListProps): import("react/jsx-runtime").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=SessionList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionList.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/SessionList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAI1D,UAAU,gBAAgB;IACxB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,gBAAgB,2CA8F3I"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { Box, Text } from "ink";
4
+ import { SessionRow } from "./SessionRow.js";
5
+ import { useTheme } from "../theme.js";
6
+ export function SessionList({ entries, selectedIndex, focused, openBranches, mergedBranches, renderPaused, isDiscovering }) {
7
+ const theme = useTheme();
8
+ const columnHeaders = (_jsxs(Box, { paddingX: 1, children: [_jsx(Box, { width: 2, children: _jsx(Text, { children: " " }) }), _jsx(Box, { width: 28, children: _jsx(Text, { dimColor: true, children: "branch" }) }), _jsx(Box, { width: 8, children: _jsx(Text, { dimColor: true, children: "pr" }) }), _jsx(Box, { width: 16, children: _jsx(Text, { dimColor: true, children: "status" }) }), _jsx(Box, { width: 10, children: _jsx(Text, { dimColor: true, children: "time left" }) }), _jsx(Box, { width: 4, children: _jsx(Text, { dimColor: true, children: "ci" }) }), _jsx(Box, { width: 12, children: _jsx(Text, { dimColor: true, children: "conflicts" }) }), _jsx(Box, { width: 10, children: _jsx(Text, { dimColor: true, children: "comments" }) }), _jsx(Box, { width: 12, children: _jsx(Text, { dimColor: true, children: "resolved" }) }), _jsx(Box, { width: 10, children: _jsx(Text, { dimColor: true, children: "cost" }) }), _jsx(Box, { width: 10, children: _jsx(Text, { dimColor: true, children: "last push" }) })] }));
9
+ // Tick to keep "time left" column updated — every 60s normally, every 1s in the final minute
10
+ const activeExpiries = [...entries.values()]
11
+ .filter((e) => e.state?.mode === "watch" && e.state.sessionExpiresAt
12
+ && !["stopped", "ready", "error"].includes(e.state.status) && !e.mergedAt)
13
+ .map((e) => e.state.sessionExpiresAt);
14
+ const soonestExpiry = activeExpiries.length > 0 ? Math.min(...activeExpiries) : null;
15
+ const [, setTimeLeftTick] = useState(0);
16
+ useEffect(() => {
17
+ if (soonestExpiry === null)
18
+ return;
19
+ const id = setInterval(() => {
20
+ const timeLeft = soonestExpiry - Date.now();
21
+ const nowInFinalMinute = timeLeft <= 60_000;
22
+ const shouldTick = nowInFinalMinute || (timeLeft % 60_000 < 1_000);
23
+ if (shouldTick) {
24
+ setTimeLeftTick((t) => t + 1);
25
+ }
26
+ }, 1_000);
27
+ return () => clearInterval(id);
28
+ }, [soonestExpiry]);
29
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.border, borderTop: false, borderBottom: false, children: [_jsx(Box, { paddingX: 1, children: _jsx(Text, { color: theme.accent, bold: true, children: "Open Branches" }) }), columnHeaders, openBranches.length === 0 ? (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { dimColor: true, children: [" ", isDiscovering ? "Discovering PRs..." : "No open PRs"] }) })) : (openBranches.map((branch, i) => (_jsx(SessionRow, { entry: entries.get(branch), selected: focused && i === selectedIndex, renderPaused: renderPaused }, branch)))), _jsxs(Box, { paddingX: 1, marginTop: 1, gap: 2, children: [_jsx(Text, { color: theme.merged, bold: true, children: "Merged Branches" }), mergedBranches.length > 0 && (_jsx(Text, { dimColor: true, color: theme.muted, children: "[d] clear all" }))] }), mergedBranches.length === 0 ? (_jsx(Box, { paddingX: 1, children: _jsxs(Text, { dimColor: true, children: [" ", isDiscovering ? "Discovering PRs..." : "No branches merged this session"] }) })) : (mergedBranches.map((branch) => (_jsx(SessionRow, { entry: entries.get(branch), selected: false, dimmed: true, renderPaused: renderPaused }, branch))))] }));
30
+ }
31
+ //# sourceMappingURL=SessionList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionList.js","sourceRoot":"","sources":["../../../../src/tui/components/SessionList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { PREntry } from "../hooks/useDaemonState.js";
2
+ interface SessionRowProps {
3
+ entry: PREntry;
4
+ selected: boolean;
5
+ dimmed?: boolean;
6
+ renderPaused?: boolean;
7
+ }
8
+ export declare function SessionRow({ entry, selected, dimmed, renderPaused }: SessionRowProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=SessionRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionRow.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/SessionRow.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAM1D,UAAU,eAAe;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAuBD,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,eAAe,2CAkFpF"}
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { StatusBadge } from "./StatusBadge.js";
4
+ import { useTheme } from "../theme.js";
5
+ import { formatTime } from "../../utils/time.js";
6
+ function formatTimeLeft(expiresAt) {
7
+ const remainMs = expiresAt - Date.now();
8
+ if (remainMs <= 0)
9
+ return "0s";
10
+ const totalSec = Math.ceil(remainMs / 1000);
11
+ // Final minute: show seconds
12
+ if (totalSec < 60)
13
+ return `${totalSec}s`;
14
+ const totalMin = Math.ceil(remainMs / 60_000);
15
+ if (totalMin < 60)
16
+ return `${totalMin}m`;
17
+ const h = Math.floor(totalMin / 60);
18
+ const m = totalMin % 60;
19
+ return m > 0 ? `${h}h${String(m).padStart(2, "0")}m` : `${h}h`;
20
+ }
21
+ const CI_INDICATORS = {
22
+ passing: { symbol: "✓", color: "green" },
23
+ failing: { symbol: "✗", color: "red" },
24
+ pending: { symbol: "●", color: "yellow" },
25
+ unknown: { symbol: "—", color: "gray" },
26
+ };
27
+ export function SessionRow({ entry, selected, dimmed, renderPaused }) {
28
+ const theme = useTheme();
29
+ const { pr, state, commentCount, ciStatus, conflicted } = entry;
30
+ const branch = entry.branch.length > 26
31
+ ? entry.branch.slice(0, 25) + "…"
32
+ : entry.branch;
33
+ const prLabel = `#${pr.number}`;
34
+ const status = entry.mergedAt ? "merged" : (state?.status ?? "stopped");
35
+ const cost = state ? `$${state.totalCostUsd.toFixed(2)}` : "—";
36
+ const lastPush = state?.lastPushAt ? formatTime(state.lastPushAt) : "—";
37
+ // If CI is unknown but we pushed recently, show yellow dash (waiting for checks to start)
38
+ const pushAge = state?.lastPushAt ? Date.now() - new Date(state.lastPushAt).getTime() : Infinity;
39
+ const ciWaiting = ciStatus === "unknown" && pushAge < 5 * 60_000;
40
+ const ci = ciWaiting ? { symbol: "—", color: "yellow" } : CI_INDICATORS[ciStatus];
41
+ const isWatch = state?.mode === "watch";
42
+ const expiresAt = state?.sessionExpiresAt ?? null;
43
+ const doneStatuses = ["stopped", "ready", "error", "merged"];
44
+ const isActive = isWatch && !doneStatuses.includes(status);
45
+ const isUnlimited = isWatch && !expiresAt;
46
+ const showTimeLeft = isActive && expiresAt;
47
+ const timeLeft = showTimeLeft ? formatTimeLeft(expiresAt) : null;
48
+ const remainMs = expiresAt ? expiresAt - Date.now() : null;
49
+ const isLow = remainMs !== null && remainMs > 0 && remainMs < 10 * 60_000; // < 10 min
50
+ return (_jsxs(Box, { paddingX: 1, children: [_jsx(Box, { width: 2, children: _jsx(Text, { color: selected ? theme.accent : theme.muted, dimColor: dimmed, children: selected ? "▍" : " " }) }), _jsx(Box, { width: 28, children: _jsx(Text, { color: selected ? theme.accent : (dimmed ? theme.muted : theme.text), dimColor: dimmed, children: branch }) }), _jsx(Box, { width: 8, children: _jsx(Text, { dimColor: true, children: prLabel }) }), _jsxs(Box, { width: 16, children: [_jsx(StatusBadge, { status: status, paused: renderPaused }), isActive && _jsx(Text, { color: theme.info, children: " \u27F3" })] }), _jsx(Box, { width: 10, children: showTimeLeft ? (_jsx(Text, { color: isLow ? theme.warning : theme.muted, children: timeLeft })) : isActive && isUnlimited ? (_jsx(Text, { color: theme.muted, children: "\u221E" })) : (_jsx(Text, { color: theme.muted, children: "—" })) }), _jsx(Box, { width: 4, children: _jsx(Text, { color: ci.color, children: ci.symbol }) }), _jsx(Box, { width: 12, children: _jsx(Text, { color: conflicted.length > 0 ? "red" : "gray", children: conflicted.length > 0 ? `${conflicted.length} file${conflicted.length > 1 ? "s" : ""}` : "—" }) }), _jsx(Box, { width: 10, children: _jsx(Text, { color: commentCount > 0 ? theme.warning : theme.muted, dimColor: dimmed, children: commentCount > 0 ? String(commentCount) : "—" }) }), _jsx(Box, { width: 12, children: entry.threadCounts && entry.threadCounts.total > 0 ? (_jsxs(Text, { color: entry.threadCounts.resolved === entry.threadCounts.total ? theme.accentBright : theme.muted, dimColor: dimmed, children: [entry.threadCounts.resolved, "/", entry.threadCounts.total] })) : (_jsx(Text, { color: theme.muted, dimColor: dimmed, children: "\u2014" })) }), _jsx(Box, { width: 10, children: _jsx(Text, { dimColor: true, children: cost }) }), _jsx(Box, { width: 10, children: _jsx(Text, { dimColor: true, children: lastPush }) })] }));
51
+ }
52
+ //# sourceMappingURL=SessionRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionRow.js","sourceRoot":"","sources":["../../../../src/tui/components/SessionRow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Daemon } from "../../core/daemon.js";
2
+ interface SettingsPanelProps {
3
+ daemon: Daemon;
4
+ onClose: () => void;
5
+ }
6
+ export declare function SettingsPanel({ daemon, onClose }: SettingsPanelProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=SettingsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsPanel.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/SettingsPanel.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA8HD,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,2CA8HpE"}
@@ -0,0 +1,191 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useCallback } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ import { useTheme, useThemeContext } from "../theme.js";
5
+ import { loadSettings, saveSettings } from "../../utils/settings.js";
6
+ const DURATION_OPTIONS = ["unlimited", "1h", "3h", "6h", "12h"];
7
+ const DURATION_TO_HOURS = {
8
+ unlimited: 0,
9
+ "1h": 1,
10
+ "3h": 3,
11
+ "6h": 6,
12
+ "12h": 12,
13
+ };
14
+ const HOURS_TO_DURATION = {
15
+ 0: "unlimited",
16
+ 1: "1h",
17
+ 3: "3h",
18
+ 6: "6h",
19
+ 12: "12h",
20
+ };
21
+ const SETTINGS = [
22
+ {
23
+ key: "theme",
24
+ label: "Theme",
25
+ type: "enum",
26
+ options: ["dark", "light"],
27
+ get: (_s, daemon) => daemon.getConfig().theme,
28
+ apply: (_value, _daemon) => {
29
+ // Theme is handled by ThemeProvider via toggleTheme, not here
30
+ },
31
+ },
32
+ {
33
+ key: "autoResolveConflicts",
34
+ label: "Auto-resolve conflicts",
35
+ type: "enum",
36
+ options: ["ask", "always", "never"],
37
+ get: (s) => {
38
+ const v = s.autoResolveConflicts;
39
+ // backward compat: true -> "always", false/undefined -> "ask"
40
+ if (v === true)
41
+ return "always";
42
+ if (v === false || v === undefined)
43
+ return "ask";
44
+ return v;
45
+ },
46
+ apply: (value, _daemon) => {
47
+ saveSettings({ autoResolveConflicts: value });
48
+ },
49
+ },
50
+ {
51
+ key: "pollInterval",
52
+ label: "Poll interval (seconds)",
53
+ type: "number",
54
+ min: 5,
55
+ max: 300,
56
+ step: 5,
57
+ get: (s, daemon) => String(s.pollInterval ?? daemon.getConfig().pollInterval),
58
+ apply: (value, daemon) => {
59
+ const n = parseInt(value, 10);
60
+ saveSettings({ pollInterval: n });
61
+ daemon.updateConfig({ pollInterval: n });
62
+ },
63
+ },
64
+ {
65
+ key: "claudeTimeout",
66
+ label: "Claude timeout (seconds)",
67
+ type: "number",
68
+ min: 60,
69
+ max: 3600,
70
+ step: 60,
71
+ get: (s, daemon) => String(s.claudeTimeout ?? daemon.getConfig().claudeTimeout),
72
+ apply: (value, daemon) => {
73
+ const n = parseInt(value, 10);
74
+ saveSettings({ claudeTimeout: n });
75
+ daemon.updateConfig({ claudeTimeout: n });
76
+ },
77
+ },
78
+ {
79
+ key: "sessionTimeout",
80
+ label: "Watch mode duration",
81
+ type: "enum",
82
+ options: DURATION_OPTIONS,
83
+ get: (s, daemon) => {
84
+ const hours = s.sessionTimeout ?? daemon.getConfig().sessionTimeout;
85
+ return HOURS_TO_DURATION[hours] ?? "unlimited";
86
+ },
87
+ apply: (value, daemon) => {
88
+ const hours = DURATION_TO_HOURS[value] ?? 0;
89
+ saveSettings({ sessionTimeout: hours });
90
+ daemon.updateConfig({ sessionTimeout: hours });
91
+ },
92
+ },
93
+ {
94
+ key: "notifications",
95
+ label: "Desktop notifications",
96
+ type: "enum",
97
+ options: ["on", "off"],
98
+ get: (s) => (s.notifications ?? true) ? "on" : "off",
99
+ apply: (value, daemon) => {
100
+ saveSettings({ notifications: value === "on" });
101
+ daemon.refreshNotificationSettings();
102
+ },
103
+ },
104
+ {
105
+ key: "maxConcurrentSessions",
106
+ label: "Max concurrent sessions",
107
+ type: "number",
108
+ min: 1,
109
+ max: 10,
110
+ step: 1,
111
+ get: (s) => String(s.maxConcurrentSessions ?? 4),
112
+ apply: (value, _daemon) => {
113
+ const n = parseInt(value, 10);
114
+ saveSettings({ maxConcurrentSessions: n });
115
+ },
116
+ },
117
+ ];
118
+ export function SettingsPanel({ daemon, onClose }) {
119
+ const theme = useTheme();
120
+ const { mode, toggleTheme } = useThemeContext();
121
+ const [selectedRow, setSelectedRow] = useState(0);
122
+ const [settings, setSettings] = useState(() => loadSettings() ?? { theme: mode });
123
+ const getCurrentValue = useCallback((def) => {
124
+ if (def.key === "theme")
125
+ return mode;
126
+ return def.get(settings, daemon);
127
+ }, [settings, daemon, mode]);
128
+ const cycleEnum = useCallback((def, direction) => {
129
+ if (def.key === "theme") {
130
+ toggleTheme();
131
+ return;
132
+ }
133
+ const opts = def.options;
134
+ const current = getCurrentValue(def);
135
+ const idx = opts.indexOf(current);
136
+ const next = opts[(idx + direction + opts.length) % opts.length];
137
+ def.apply(next, daemon);
138
+ setSettings(loadSettings() ?? { theme: mode });
139
+ }, [daemon, getCurrentValue, mode, toggleTheme]);
140
+ const adjustNumber = useCallback((def, direction) => {
141
+ const current = parseInt(getCurrentValue(def), 10);
142
+ const step = def.step ?? 1;
143
+ const next = Math.max(def.min ?? 0, Math.min(def.max ?? Infinity, current + step * direction));
144
+ def.apply(String(next), daemon);
145
+ setSettings(loadSettings() ?? { theme: mode });
146
+ }, [daemon, getCurrentValue, mode]);
147
+ useInput((input, key) => {
148
+ if (key.escape || input === "," || input === "q") {
149
+ onClose();
150
+ return;
151
+ }
152
+ if (key.upArrow || input === "k") {
153
+ setSelectedRow((prev) => Math.max(0, prev - 1));
154
+ return;
155
+ }
156
+ if (key.downArrow || input === "j") {
157
+ setSelectedRow((prev) => Math.min(SETTINGS.length - 1, prev + 1));
158
+ return;
159
+ }
160
+ const def = SETTINGS[selectedRow];
161
+ if (key.leftArrow || input === "h") {
162
+ if (def.type === "enum")
163
+ cycleEnum(def, -1);
164
+ else
165
+ adjustNumber(def, -1);
166
+ return;
167
+ }
168
+ if (key.rightArrow || input === "l" || key.return) {
169
+ if (def.type === "enum")
170
+ cycleEnum(def, 1);
171
+ else
172
+ adjustNumber(def, 1);
173
+ return;
174
+ }
175
+ });
176
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.accent, paddingX: 2, paddingY: 1, children: [_jsx(Box, { justifyContent: "center", marginBottom: 1, children: _jsx(Text, { color: theme.accent, bold: true, children: "━━ Settings ━━" }) }), SETTINGS.map((def, i) => {
177
+ const selected = i === selectedRow;
178
+ const value = getCurrentValue(def);
179
+ return (_jsxs(Box, { children: [_jsx(Text, { color: selected ? theme.accent : theme.muted, children: selected ? " ▸ " : " " }), _jsx(Text, { color: selected ? theme.text : theme.muted, bold: selected, children: def.label.padEnd(28) }), def.type === "enum" ? (_jsx(EnumValue, { options: def.options, current: value, selected: selected, accentColor: theme.accent, textColor: theme.text, mutedColor: theme.muted })) : (_jsx(NumberValue, { value: value, selected: selected, accentColor: theme.accent, textColor: theme.text }))] }, def.key));
180
+ }), _jsx(Box, { marginTop: 1, justifyContent: "center", children: _jsxs(Text, { dimColor: true, children: [_jsx(Text, { color: theme.accent, children: "j/k" }), " navigate ", _jsx(Text, { color: theme.accent, children: "\u2190/\u2192" }), " change ", _jsx(Text, { color: theme.accent, children: "esc" }), " close"] }) })] }));
181
+ }
182
+ function EnumValue({ options, current, selected, accentColor, textColor, mutedColor, }) {
183
+ return (_jsx(Box, { gap: 1, children: options.map((opt) => {
184
+ const active = opt === current;
185
+ return (_jsx(Text, { color: active ? (selected ? accentColor : textColor) : mutedColor, bold: active, dimColor: !active, children: active ? `[${opt}]` : ` ${opt} ` }, opt));
186
+ }) }));
187
+ }
188
+ function NumberValue({ value, selected, accentColor, textColor, }) {
189
+ return (_jsxs(Box, { children: [selected && _jsx(Text, { color: accentColor, children: "◂ " }), _jsx(Text, { color: selected ? accentColor : textColor, bold: selected, children: value }), selected && _jsx(Text, { color: accentColor, children: " ▸" })] }));
190
+ }
191
+ //# sourceMappingURL=SettingsPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SettingsPanel.js","sourceRoot":"","sources":["../../../../src/tui/components/SettingsPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { BranchStatus } from "../../types/index.js";
2
+ interface StatusBadgeProps {
3
+ status: BranchStatus;
4
+ }
5
+ export declare function StatusBadge({ status, paused }: StatusBadgeProps & {
6
+ paused?: boolean;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=StatusBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/StatusBadge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,UAAU,gBAAgB;IACxB,MAAM,EAAE,YAAY,CAAC;CACtB;AAqCD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,2CAqBtF"}
@@ -0,0 +1,52 @@
1
+ import { jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { Text } from "ink";
4
+ import { useTheme } from "../theme.js";
5
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
6
+ const ACTIVE_STATUSES = new Set([
7
+ "initializing",
8
+ "triaging",
9
+ "fixing",
10
+ "verifying",
11
+ "pushing",
12
+ "replying",
13
+ ]);
14
+ const STATUS_ROLES = {
15
+ stopped: { role: "muted", label: "stopped" },
16
+ initializing: { role: "info", label: "init" },
17
+ watching: { role: "accent", label: "watching" },
18
+ triaging: { role: "info", label: "triaging" },
19
+ fixing: { role: "info", label: "fixing" },
20
+ verifying: { role: "info", label: "verify" },
21
+ pushing: { role: "info", label: "pushing" },
22
+ replying: { role: "info", label: "replying" },
23
+ ready: { role: "accent", label: "ready" },
24
+ conflict_prompt: { role: "warning", label: "conflict" },
25
+ error: { role: "error", label: "error" },
26
+ merged: { role: "merged", label: "merged" },
27
+ };
28
+ const STATIC_SYMBOLS = {
29
+ stopped: "○",
30
+ watching: "●",
31
+ ready: "✓",
32
+ conflict_prompt: "!",
33
+ error: "✗",
34
+ merged: "◆",
35
+ };
36
+ export function StatusBadge({ status, paused }) {
37
+ const theme = useTheme();
38
+ const isActive = ACTIVE_STATUSES.has(status);
39
+ const [frame, setFrame] = useState(0);
40
+ useEffect(() => {
41
+ if (!isActive || paused)
42
+ return;
43
+ const id = setInterval(() => {
44
+ setFrame((f) => (f + 1) % SPINNER_FRAMES.length);
45
+ }, 80);
46
+ return () => clearInterval(id);
47
+ }, [isActive, paused]);
48
+ const config = STATUS_ROLES[status];
49
+ const symbol = isActive ? SPINNER_FRAMES[frame] : (STATIC_SYMBOLS[status] ?? "●");
50
+ return (_jsxs(Text, { color: theme[config.role], children: [symbol, " ", config.label] }));
51
+ }
52
+ //# sourceMappingURL=StatusBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.js","sourceRoot":"","sources":["../../../../src/tui/components/StatusBadge.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface ToolbarButton {
2
+ label: string;
3
+ action: () => void;
4
+ }
5
+ //# sourceMappingURL=Toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/Toolbar.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../../src/tui/components/Toolbar.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { CommentCategory } from "../../types/index.js";
2
+ export declare const CATEGORY_COLORS: Record<CommentCategory, string>;
3
+ export declare const CATEGORY_LABELS: Record<CommentCategory, string>;
4
+ //# sourceMappingURL=comment-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-constants.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/comment-constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAM3D,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAM3D,CAAC"}
@@ -0,0 +1,15 @@
1
+ export const CATEGORY_COLORS = {
2
+ must_fix: "red",
3
+ should_fix: "yellow",
4
+ nice_to_have: "cyan",
5
+ false_positive: "gray",
6
+ verify_and_fix: "magenta",
7
+ };
8
+ export const CATEGORY_LABELS = {
9
+ must_fix: "MUST FIX",
10
+ should_fix: "SHOULD FIX",
11
+ nice_to_have: "NICE",
12
+ false_positive: "FALSE POS",
13
+ verify_and_fix: "VERIFY",
14
+ };
15
+ //# sourceMappingURL=comment-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-constants.js","sourceRoot":"","sources":["../../../../src/tui/components/comment-constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAoC;IAC9D,QAAQ,EAAE,KAAK;IACf,UAAU,EAAE,QAAQ;IACpB,YAAY,EAAE,MAAM;IACpB,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,SAAS;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAoC;IAC9D,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,YAAY;IACxB,YAAY,EAAE,MAAM;IACpB,cAAc,EAAE,WAAW;IAC3B,cAAc,EAAE,QAAQ;CACzB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { LogEntry } from "../../utils/logger.js";
2
+ /**
3
+ * Processes a batch of log entries for branch-based logging.
4
+ * Returns an updated Map with entries grouped by branch.
5
+ */
6
+ export declare function processBranchLogBatch(prev: Map<string, LogEntry[]>, batch: LogEntry[], maxPerBranch: number): Map<string, LogEntry[]>;
7
+ /**
8
+ * Processes a batch of log entries for general logging.
9
+ * Returns updated state with capped entries and latest timestamp.
10
+ */
11
+ export declare function processLogBatch<T extends {
12
+ entries: LogEntry[];
13
+ lastTimestamp: string | null;
14
+ }>(prev: T, batch: LogEntry[], maxEntries: number): T;
15
+ //# sourceMappingURL=logFlushUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logFlushUtils.d.ts","sourceRoot":"","sources":["../../../../src/tui/hooks/logFlushUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAC7B,KAAK,EAAE,QAAQ,EAAE,EACjB,YAAY,EAAE,MAAM,GACnB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAazB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC7F,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,QAAQ,EAAE,EACjB,UAAU,EAAE,MAAM,GACjB,CAAC,CAOH"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Processes a batch of log entries for branch-based logging.
3
+ * Returns an updated Map with entries grouped by branch.
4
+ */
5
+ export function processBranchLogBatch(prev, batch, maxPerBranch) {
6
+ const next = new Map(prev);
7
+ for (const entry of batch) {
8
+ if (!entry.branch)
9
+ continue;
10
+ const existing = next.get(entry.branch) ?? [];
11
+ existing.push(entry);
12
+ if (existing.length > maxPerBranch) {
13
+ next.set(entry.branch, existing.slice(existing.length - maxPerBranch));
14
+ }
15
+ else {
16
+ next.set(entry.branch, existing);
17
+ }
18
+ }
19
+ return next;
20
+ }
21
+ /**
22
+ * Processes a batch of log entries for general logging.
23
+ * Returns updated state with capped entries and latest timestamp.
24
+ */
25
+ export function processLogBatch(prev, batch, maxEntries) {
26
+ const next = [...prev.entries, ...batch];
27
+ return {
28
+ ...prev,
29
+ entries: next.length > maxEntries ? next.slice(next.length - maxEntries) : next,
30
+ lastTimestamp: batch.length > 0 ? batch[batch.length - 1].timestamp : prev.lastTimestamp,
31
+ };
32
+ }
33
+ //# sourceMappingURL=logFlushUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logFlushUtils.js","sourceRoot":"","sources":["../../../../src/tui/hooks/logFlushUtils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAA6B,EAC7B,KAAiB,EACjB,YAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,SAAS;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,QAAQ,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAO,EACP,KAAiB,EACjB,UAAkB;IAElB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC;IACzC,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;QAC/E,aAAa,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa;KACzF,CAAC;AACJ,CAAC"}