@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.
- package/LICENSE +6 -0
- package/README.md +178 -0
- package/dist/bin/orc.d.ts +3 -0
- package/dist/bin/orc.d.ts.map +1 -0
- package/dist/bin/orc.js +4 -0
- package/dist/bin/orc.js.map +1 -0
- package/dist/src/cli.d.ts +6 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +28 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/init.d.ts +6 -0
- package/dist/src/commands/init.d.ts.map +1 -0
- package/dist/src/commands/init.js +58 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/start.d.ts +17 -0
- package/dist/src/commands/start.d.ts.map +1 -0
- package/dist/src/commands/start.js +146 -0
- package/dist/src/commands/start.js.map +1 -0
- package/dist/src/constants.d.ts +18 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +42 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/core/comment-categorizer.d.ts +20 -0
- package/dist/src/core/comment-categorizer.d.ts.map +1 -0
- package/dist/src/core/comment-categorizer.js +208 -0
- package/dist/src/core/comment-categorizer.js.map +1 -0
- package/dist/src/core/comment-fetcher.d.ts +37 -0
- package/dist/src/core/comment-fetcher.d.ts.map +1 -0
- package/dist/src/core/comment-fetcher.js +138 -0
- package/dist/src/core/comment-fetcher.js.map +1 -0
- package/dist/src/core/daemon.d.ts +92 -0
- package/dist/src/core/daemon.d.ts.map +1 -0
- package/dist/src/core/daemon.js +896 -0
- package/dist/src/core/daemon.js.map +1 -0
- package/dist/src/core/fix-executor.d.ts +50 -0
- package/dist/src/core/fix-executor.d.ts.map +1 -0
- package/dist/src/core/fix-executor.js +374 -0
- package/dist/src/core/fix-executor.js.map +1 -0
- package/dist/src/core/git-manager.d.ts +44 -0
- package/dist/src/core/git-manager.d.ts.map +1 -0
- package/dist/src/core/git-manager.js +230 -0
- package/dist/src/core/git-manager.js.map +1 -0
- package/dist/src/core/pilot-config.d.ts +18 -0
- package/dist/src/core/pilot-config.d.ts.map +1 -0
- package/dist/src/core/pilot-config.js +76 -0
- package/dist/src/core/pilot-config.js.map +1 -0
- package/dist/src/core/progress-store.d.ts +32 -0
- package/dist/src/core/progress-store.d.ts.map +1 -0
- package/dist/src/core/progress-store.js +106 -0
- package/dist/src/core/progress-store.js.map +1 -0
- package/dist/src/core/repo-config.d.ts +11 -0
- package/dist/src/core/repo-config.d.ts.map +1 -0
- package/dist/src/core/repo-config.js +168 -0
- package/dist/src/core/repo-config.js.map +1 -0
- package/dist/src/core/session-controller.d.ts +61 -0
- package/dist/src/core/session-controller.d.ts.map +1 -0
- package/dist/src/core/session-controller.js +926 -0
- package/dist/src/core/session-controller.js.map +1 -0
- package/dist/src/core/thread-responder.d.ts +28 -0
- package/dist/src/core/thread-responder.d.ts.map +1 -0
- package/dist/src/core/thread-responder.js +193 -0
- package/dist/src/core/thread-responder.js.map +1 -0
- package/dist/src/core/worktree-manager.d.ts +26 -0
- package/dist/src/core/worktree-manager.d.ts.map +1 -0
- package/dist/src/core/worktree-manager.js +189 -0
- package/dist/src/core/worktree-manager.js.map +1 -0
- package/dist/src/github/gh-client.d.ts +57 -0
- package/dist/src/github/gh-client.d.ts.map +1 -0
- package/dist/src/github/gh-client.js +236 -0
- package/dist/src/github/gh-client.js.map +1 -0
- package/dist/src/github/queries.d.ts +9 -0
- package/dist/src/github/queries.d.ts.map +1 -0
- package/dist/src/github/queries.js +152 -0
- package/dist/src/github/queries.js.map +1 -0
- package/dist/src/github/types.d.ts +114 -0
- package/dist/src/github/types.d.ts.map +1 -0
- package/dist/src/github/types.js +3 -0
- package/dist/src/github/types.js.map +1 -0
- package/dist/src/tui/App.d.ts +8 -0
- package/dist/src/tui/App.d.ts.map +1 -0
- package/dist/src/tui/App.js +407 -0
- package/dist/src/tui/App.js.map +1 -0
- package/dist/src/tui/components/ActivityPane.d.ts +7 -0
- package/dist/src/tui/components/ActivityPane.d.ts.map +1 -0
- package/dist/src/tui/components/ActivityPane.js +10 -0
- package/dist/src/tui/components/ActivityPane.js.map +1 -0
- package/dist/src/tui/components/DetailPanel.d.ts +15 -0
- package/dist/src/tui/components/DetailPanel.d.ts.map +1 -0
- package/dist/src/tui/components/DetailPanel.js +137 -0
- package/dist/src/tui/components/DetailPanel.js.map +1 -0
- package/dist/src/tui/components/DrillInOverlay.d.ts +13 -0
- package/dist/src/tui/components/DrillInOverlay.d.ts.map +1 -0
- package/dist/src/tui/components/DrillInOverlay.js +85 -0
- package/dist/src/tui/components/DrillInOverlay.js.map +1 -0
- package/dist/src/tui/components/ExpandedContent.d.ts +10 -0
- package/dist/src/tui/components/ExpandedContent.d.ts.map +1 -0
- package/dist/src/tui/components/ExpandedContent.js +99 -0
- package/dist/src/tui/components/ExpandedContent.js.map +1 -0
- package/dist/src/tui/components/Header.d.ts +12 -0
- package/dist/src/tui/components/Header.d.ts.map +1 -0
- package/dist/src/tui/components/Header.js +35 -0
- package/dist/src/tui/components/Header.js.map +1 -0
- package/dist/src/tui/components/HelpBar.d.ts +2 -0
- package/dist/src/tui/components/HelpBar.d.ts.map +1 -0
- package/dist/src/tui/components/HelpBar.js +11 -0
- package/dist/src/tui/components/HelpBar.js.map +1 -0
- package/dist/src/tui/components/KeybindLegend.d.ts +7 -0
- package/dist/src/tui/components/KeybindLegend.d.ts.map +1 -0
- package/dist/src/tui/components/KeybindLegend.js +53 -0
- package/dist/src/tui/components/KeybindLegend.js.map +1 -0
- package/dist/src/tui/components/LogPane.d.ts +11 -0
- package/dist/src/tui/components/LogPane.d.ts.map +1 -0
- package/dist/src/tui/components/LogPane.js +31 -0
- package/dist/src/tui/components/LogPane.js.map +1 -0
- package/dist/src/tui/components/SessionList.d.ts +14 -0
- package/dist/src/tui/components/SessionList.d.ts.map +1 -0
- package/dist/src/tui/components/SessionList.js +31 -0
- package/dist/src/tui/components/SessionList.js.map +1 -0
- package/dist/src/tui/components/SessionRow.d.ts +10 -0
- package/dist/src/tui/components/SessionRow.d.ts.map +1 -0
- package/dist/src/tui/components/SessionRow.js +52 -0
- package/dist/src/tui/components/SessionRow.js.map +1 -0
- package/dist/src/tui/components/SettingsPanel.d.ts +8 -0
- package/dist/src/tui/components/SettingsPanel.d.ts.map +1 -0
- package/dist/src/tui/components/SettingsPanel.js +191 -0
- package/dist/src/tui/components/SettingsPanel.js.map +1 -0
- package/dist/src/tui/components/StatusBadge.d.ts +9 -0
- package/dist/src/tui/components/StatusBadge.d.ts.map +1 -0
- package/dist/src/tui/components/StatusBadge.js +52 -0
- package/dist/src/tui/components/StatusBadge.js.map +1 -0
- package/dist/src/tui/components/Toolbar.d.ts +5 -0
- package/dist/src/tui/components/Toolbar.d.ts.map +1 -0
- package/dist/src/tui/components/Toolbar.js +2 -0
- package/dist/src/tui/components/Toolbar.js.map +1 -0
- package/dist/src/tui/components/comment-constants.d.ts +4 -0
- package/dist/src/tui/components/comment-constants.d.ts.map +1 -0
- package/dist/src/tui/components/comment-constants.js +15 -0
- package/dist/src/tui/components/comment-constants.js.map +1 -0
- package/dist/src/tui/hooks/logFlushUtils.d.ts +15 -0
- package/dist/src/tui/hooks/logFlushUtils.d.ts.map +1 -0
- package/dist/src/tui/hooks/logFlushUtils.js +33 -0
- package/dist/src/tui/hooks/logFlushUtils.js.map +1 -0
- package/dist/src/tui/hooks/useBranchLogs.d.ts +7 -0
- package/dist/src/tui/hooks/useBranchLogs.d.ts.map +1 -0
- package/dist/src/tui/hooks/useBranchLogs.js +58 -0
- package/dist/src/tui/hooks/useBranchLogs.js.map +1 -0
- package/dist/src/tui/hooks/useDaemonState.d.ts +19 -0
- package/dist/src/tui/hooks/useDaemonState.d.ts.map +1 -0
- package/dist/src/tui/hooks/useDaemonState.js +152 -0
- package/dist/src/tui/hooks/useDaemonState.js.map +1 -0
- package/dist/src/tui/hooks/useInitialDiscovery.d.ts +8 -0
- package/dist/src/tui/hooks/useInitialDiscovery.d.ts.map +1 -0
- package/dist/src/tui/hooks/useInitialDiscovery.js +31 -0
- package/dist/src/tui/hooks/useInitialDiscovery.js.map +1 -0
- package/dist/src/tui/hooks/useLogBuffer.d.ts +7 -0
- package/dist/src/tui/hooks/useLogBuffer.d.ts.map +1 -0
- package/dist/src/tui/hooks/useLogBuffer.js +52 -0
- package/dist/src/tui/hooks/useLogBuffer.js.map +1 -0
- package/dist/src/tui/hooks/useNextCheckCountdown.d.ts +7 -0
- package/dist/src/tui/hooks/useNextCheckCountdown.d.ts.map +1 -0
- package/dist/src/tui/hooks/useNextCheckCountdown.js +42 -0
- package/dist/src/tui/hooks/useNextCheckCountdown.js.map +1 -0
- package/dist/src/tui/hooks/useTerminalFocus.d.ts +9 -0
- package/dist/src/tui/hooks/useTerminalFocus.d.ts.map +1 -0
- package/dist/src/tui/hooks/useTerminalFocus.js +43 -0
- package/dist/src/tui/hooks/useTerminalFocus.js.map +1 -0
- package/dist/src/tui/theme.d.ts +32 -0
- package/dist/src/tui/theme.d.ts.map +1 -0
- package/dist/src/tui/theme.js +61 -0
- package/dist/src/tui/theme.js.map +1 -0
- package/dist/src/types/config.d.ts +35 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +14 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/index.d.ts +107 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +3 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/concurrency.d.ts +7 -0
- package/dist/src/utils/concurrency.d.ts.map +1 -0
- package/dist/src/utils/concurrency.js +26 -0
- package/dist/src/utils/concurrency.js.map +1 -0
- package/dist/src/utils/format.d.ts +2 -0
- package/dist/src/utils/format.d.ts.map +1 -0
- package/dist/src/utils/format.js +8 -0
- package/dist/src/utils/format.js.map +1 -0
- package/dist/src/utils/logger.d.ts +39 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +120 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/notify.d.ts +6 -0
- package/dist/src/utils/notify.d.ts.map +1 -0
- package/dist/src/utils/notify.js +15 -0
- package/dist/src/utils/notify.js.map +1 -0
- package/dist/src/utils/open-terminal.d.ts +12 -0
- package/dist/src/utils/open-terminal.d.ts.map +1 -0
- package/dist/src/utils/open-terminal.js +93 -0
- package/dist/src/utils/open-terminal.js.map +1 -0
- package/dist/src/utils/process.d.ts +14 -0
- package/dist/src/utils/process.d.ts.map +1 -0
- package/dist/src/utils/process.js +36 -0
- package/dist/src/utils/process.js.map +1 -0
- package/dist/src/utils/project-detector.d.ts +12 -0
- package/dist/src/utils/project-detector.d.ts.map +1 -0
- package/dist/src/utils/project-detector.js +123 -0
- package/dist/src/utils/project-detector.js.map +1 -0
- package/dist/src/utils/quoting.d.ts +15 -0
- package/dist/src/utils/quoting.d.ts.map +1 -0
- package/dist/src/utils/quoting.js +39 -0
- package/dist/src/utils/quoting.js.map +1 -0
- package/dist/src/utils/retry.d.ts +14 -0
- package/dist/src/utils/retry.d.ts.map +1 -0
- package/dist/src/utils/retry.js +41 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/settings.d.ts +14 -0
- package/dist/src/utils/settings.d.ts.map +1 -0
- package/dist/src/utils/settings.js +21 -0
- package/dist/src/utils/settings.js.map +1 -0
- package/dist/src/utils/time.d.ts +2 -0
- package/dist/src/utils/time.d.ts.map +1 -0
- package/dist/src/utils/time.js +5 -0
- package/dist/src/utils/time.js.map +1 -0
- 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":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AAUnD,SAAS,WAAW,CAAC,KAAY;IAC/B,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,OAAO;QACnB,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,GAAG,MAAM,EAAgB;IACpG,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC,EACnD,OAAO,CAAC,MAAM,GAAG,MAAM,CACxB,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,EACzB,SAAS,EAAE,KAAK,EAChB,YAAY,EAAE,KAAK,aAEnB,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,aACd,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,kBAAE,KAAK,GAAQ,EAClD,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,mBAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAQ,EACrE,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,kBAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAQ,IACzF,EACL,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,YAC7B,KAAC,IAAI,IAAC,QAAQ,yCAA0B,GACpC,CACP,CAAC,CAAC,CAAC,CACF,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBACvB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9D,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;gBAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,OAAO,CACL,MAAC,GAAG,IAAS,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,aACrC,MAAC,IAAI,IAAC,QAAQ,mBAAE,IAAI,SAAS,EAC7B,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,aAC3C,GAAG,OAAG,MAAM,EAAE,KAAK,CAAC,OAAO,IACvB,KAJC,CAAC,CAKL,CACP,CAAC;YACJ,CAAC,CAAC,CACH,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../../src/tui/components/Toolbar.tsx"],"names":[],"mappings":""}
|
|
@@ -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"}
|