@yeshwanthyk/coding-agent 0.3.13 → 0.3.15

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 (44) hide show
  1. package/dist/adapters/tui/app.js +29 -17
  2. package/dist/adapters/tui/{app.js.map → app.jsx.map} +1 -1
  3. package/dist/components/Footer.js +60 -24
  4. package/dist/components/{Footer.js.map → Footer.jsx.map} +1 -1
  5. package/dist/components/Header.js +312 -96
  6. package/dist/components/{Header.js.map → Header.jsx.map} +1 -1
  7. package/dist/components/MessageList.js +393 -146
  8. package/dist/components/MessageList.jsx.map +1 -0
  9. package/dist/runtime/context.js +15 -9
  10. package/dist/runtime/context.jsx.map +1 -0
  11. package/dist/session-picker.js +123 -69
  12. package/dist/session-picker.jsx.map +1 -0
  13. package/dist/tui-open-rendering.js +716 -343
  14. package/dist/tui-open-rendering.jsx.map +1 -0
  15. package/dist/ui/app-shell/TuiApp.js +590 -441
  16. package/dist/ui/app-shell/{TuiApp.js.map → TuiApp.jsx.map} +1 -1
  17. package/dist/ui/components/modals/ConfirmModal.js +80 -23
  18. package/dist/ui/components/modals/ConfirmModal.jsx.map +1 -0
  19. package/dist/ui/components/modals/EditorModal.js +55 -15
  20. package/dist/ui/components/modals/EditorModal.jsx.map +1 -0
  21. package/dist/ui/components/modals/InputModal.js +36 -9
  22. package/dist/ui/components/modals/InputModal.jsx.map +1 -0
  23. package/dist/ui/components/modals/ModalContainer.js +72 -16
  24. package/dist/ui/components/modals/ModalContainer.jsx.map +1 -0
  25. package/dist/ui/components/modals/SelectModal.js +53 -24
  26. package/dist/ui/components/modals/SelectModal.jsx.map +1 -0
  27. package/dist/ui/features/composer/Composer.js +145 -26
  28. package/dist/ui/features/composer/Composer.jsx.map +1 -0
  29. package/dist/ui/features/main-view/MainView.js +341 -248
  30. package/dist/ui/features/main-view/{MainView.js.map → MainView.jsx.map} +1 -1
  31. package/dist/ui/features/message-pane/MessagePane.js +46 -4
  32. package/dist/ui/features/message-pane/MessagePane.jsx.map +1 -0
  33. package/package.json +3 -3
  34. package/dist/components/MessageList.js.map +0 -1
  35. package/dist/runtime/context.js.map +0 -1
  36. package/dist/session-picker.js.map +0 -1
  37. package/dist/tui-open-rendering.js.map +0 -1
  38. package/dist/ui/components/modals/ConfirmModal.js.map +0 -1
  39. package/dist/ui/components/modals/EditorModal.js.map +0 -1
  40. package/dist/ui/components/modals/InputModal.js.map +0 -1
  41. package/dist/ui/components/modals/ModalContainer.js.map +0 -1
  42. package/dist/ui/components/modals/SelectModal.js.map +0 -1
  43. package/dist/ui/features/composer/Composer.js.map +0 -1
  44. package/dist/ui/features/message-pane/MessagePane.js.map +0 -1
@@ -1,4 +1,10 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
1
+ import { effect as _$effect } from "@opentui/solid";
2
+ import { insert as _$insert } from "@opentui/solid";
3
+ import { createComponent as _$createComponent } from "@opentui/solid";
4
+ import { createTextNode as _$createTextNode } from "@opentui/solid";
5
+ import { insertNode as _$insertNode } from "@opentui/solid";
6
+ import { setProp as _$setProp } from "@opentui/solid";
7
+ import { createElement as _$createElement } from "@opentui/solid";
2
8
  /**
3
9
  * OpenTUI-based session picker
4
10
  */
@@ -6,84 +12,132 @@ import { render, useTerminalDimensions, useKeyboard } from "@opentui/solid";
6
12
  import { SelectList, ThemeProvider, useTheme } from "@yeshwanthyk/open-tui";
7
13
  /** Detect system dark/light mode (macOS only, defaults to dark) */
8
14
  function detectThemeMode() {
9
- try {
10
- const result = Bun.spawnSync(["defaults", "read", "-g", "AppleInterfaceStyle"]);
11
- return result.stdout.toString().trim().toLowerCase() === "dark" ? "dark" : "light";
12
- }
13
- catch {
14
- return "dark";
15
- }
15
+ try {
16
+ const result = Bun.spawnSync(["defaults", "read", "-g", "AppleInterfaceStyle"]);
17
+ return result.stdout.toString().trim().toLowerCase() === "dark" ? "dark" : "light";
18
+ } catch {
19
+ return "dark";
20
+ }
16
21
  }
17
22
  function SessionPickerApp(props) {
18
- const { theme } = useTheme();
19
- const dimensions = useTerminalDimensions();
20
- let listRef;
21
- const items = props.sessions.map((s) => ({
22
- value: s.path,
23
- label: formatFirstMessage(s.firstMessage),
24
- description: formatMeta(s.timestamp, s.messageCount, s.modelId),
25
- }));
26
- useKeyboard((e) => {
27
- if (e.name === "up" || (e.ctrl && e.name === "p")) {
28
- listRef?.moveUp();
29
- }
30
- else if (e.name === "down" || (e.ctrl && e.name === "n")) {
31
- listRef?.moveDown();
32
- }
33
- else if (e.name === "return") {
34
- listRef?.select();
35
- }
36
- else if (e.name === "escape" || (e.ctrl && e.name === "c")) {
37
- props.onCancel();
38
- }
23
+ const {
24
+ theme
25
+ } = useTheme();
26
+ const dimensions = useTerminalDimensions();
27
+ let listRef;
28
+ const items = props.sessions.map(s => ({
29
+ value: s.path,
30
+ label: formatFirstMessage(s.firstMessage),
31
+ description: formatMeta(s.timestamp, s.messageCount, s.modelId)
32
+ }));
33
+ useKeyboard(e => {
34
+ if (e.name === "up" || e.ctrl && e.name === "p") {
35
+ listRef?.moveUp();
36
+ } else if (e.name === "down" || e.ctrl && e.name === "n") {
37
+ listRef?.moveDown();
38
+ } else if (e.name === "return") {
39
+ listRef?.select();
40
+ } else if (e.name === "escape" || e.ctrl && e.name === "c") {
41
+ props.onCancel();
42
+ }
43
+ });
44
+ return (() => {
45
+ var _el$ = _$createElement("box"),
46
+ _el$2 = _$createElement("text"),
47
+ _el$4 = _$createElement("box"),
48
+ _el$5 = _$createElement("box"),
49
+ _el$6 = _$createElement("text");
50
+ _$insertNode(_el$, _el$2);
51
+ _$insertNode(_el$, _el$4);
52
+ _$insertNode(_el$, _el$5);
53
+ _$insertNode(_el$, _el$6);
54
+ _$setProp(_el$, "flexDirection", "column");
55
+ _$insertNode(_el$2, _$createTextNode(`Resume Session`));
56
+ _$setProp(_el$4, "height", 1);
57
+ _$insert(_el$, _$createComponent(SelectList, {
58
+ ref: r => {
59
+ listRef = r;
60
+ },
61
+ items: items,
62
+ get maxVisible() {
63
+ return Math.min(10, dimensions().height - 4);
64
+ },
65
+ get width() {
66
+ return dimensions().width - 2;
67
+ },
68
+ onSelect: item => props.onSelect(item.value),
69
+ get onCancel() {
70
+ return props.onCancel;
71
+ }
72
+ }), _el$5);
73
+ _$setProp(_el$5, "flexGrow", 1);
74
+ _$insertNode(_el$6, _$createTextNode(`↑/↓ navigate · Enter select · Esc cancel`));
75
+ _$effect(_p$ => {
76
+ var _v$ = dimensions().width,
77
+ _v$2 = dimensions().height,
78
+ _v$3 = theme.textMuted,
79
+ _v$4 = theme.textMuted;
80
+ _v$ !== _p$.e && (_p$.e = _$setProp(_el$, "width", _v$, _p$.e));
81
+ _v$2 !== _p$.t && (_p$.t = _$setProp(_el$, "height", _v$2, _p$.t));
82
+ _v$3 !== _p$.a && (_p$.a = _$setProp(_el$2, "fg", _v$3, _p$.a));
83
+ _v$4 !== _p$.o && (_p$.o = _$setProp(_el$6, "fg", _v$4, _p$.o));
84
+ return _p$;
85
+ }, {
86
+ e: undefined,
87
+ t: undefined,
88
+ a: undefined,
89
+ o: undefined
39
90
  });
40
- return (_jsxs("box", { flexDirection: "column", width: dimensions().width, height: dimensions().height, children: [_jsx("text", { fg: theme.textMuted, children: "Resume Session" }), _jsx("box", { height: 1 }), _jsx(SelectList, { ref: (r) => { listRef = r; }, items: items, maxVisible: Math.min(10, dimensions().height - 4), width: dimensions().width - 2, onSelect: (item) => props.onSelect(item.value), onCancel: props.onCancel }), _jsx("box", { flexGrow: 1 }), _jsx("text", { fg: theme.textMuted, children: "\u2191/\u2193 navigate \u00B7 Enter select \u00B7 Esc cancel" })] }));
91
+ return _el$;
92
+ })();
41
93
  }
42
94
  function formatFirstMessage(msg) {
43
- return msg.replace(/\n/g, " ").slice(0, 60);
95
+ return msg.replace(/\n/g, " ").slice(0, 60);
44
96
  }
45
97
  function formatMeta(ts, count, model) {
46
- const ago = formatRelativeTime(ts);
47
- return `${ago} · ${count} msgs · ${model}`;
98
+ const ago = formatRelativeTime(ts);
99
+ return `${ago} · ${count} msgs · ${model}`;
48
100
  }
49
101
  function formatRelativeTime(ts) {
50
- const seconds = Math.floor((Date.now() - ts) / 1000);
51
- if (seconds < 60)
52
- return `${seconds}s ago`;
53
- const minutes = Math.floor(seconds / 60);
54
- if (minutes < 60)
55
- return `${minutes}m ago`;
56
- const hours = Math.floor(minutes / 60);
57
- if (hours < 24)
58
- return `${hours}h ago`;
59
- const days = Math.floor(hours / 24);
60
- return `${days}d ago`;
102
+ const seconds = Math.floor((Date.now() - ts) / 1000);
103
+ if (seconds < 60) return `${seconds}s ago`;
104
+ const minutes = Math.floor(seconds / 60);
105
+ if (minutes < 60) return `${minutes}m ago`;
106
+ const hours = Math.floor(minutes / 60);
107
+ if (hours < 24) return `${hours}h ago`;
108
+ const days = Math.floor(hours / 24);
109
+ return `${days}d ago`;
61
110
  }
62
111
  export async function selectSession(sessionManager) {
63
- const sessions = sessionManager.loadAllSessions();
64
- if (sessions.length === 0)
65
- return null;
66
- if (sessions.length === 1)
67
- return sessions[0].path;
68
- return new Promise((resolve) => {
69
- let resolved = false;
70
- const doResolve = (value) => {
71
- if (resolved)
72
- return;
73
- resolved = true;
74
- if (value === null) {
75
- // Cancel - exit immediately since we're done
76
- process.stdout.write("\nNo session selected\n");
77
- process.exit(0);
78
- }
79
- resolve(value);
80
- };
81
- const themeMode = detectThemeMode();
82
- render(() => (_jsx(ThemeProvider, { mode: themeMode, children: _jsx(SessionPickerApp, { sessions: sessions, onSelect: (path) => doResolve(path), onCancel: () => doResolve(null) }) })), {
83
- targetFps: 30,
84
- exitOnCtrlC: false,
85
- useKittyKeyboard: {},
112
+ const sessions = sessionManager.loadAllSessions();
113
+ if (sessions.length === 0) return null;
114
+ if (sessions.length === 1) return sessions[0].path;
115
+ return new Promise(resolve => {
116
+ let resolved = false;
117
+ const doResolve = value => {
118
+ if (resolved) return;
119
+ resolved = true;
120
+ if (value === null) {
121
+ // Cancel - exit immediately since we're done
122
+ process.stdout.write("\nNo session selected\n");
123
+ process.exit(0);
124
+ }
125
+ resolve(value);
126
+ };
127
+ const themeMode = detectThemeMode();
128
+ render(() => _$createComponent(ThemeProvider, {
129
+ mode: themeMode,
130
+ get children() {
131
+ return _$createComponent(SessionPickerApp, {
132
+ sessions: sessions,
133
+ onSelect: path => doResolve(path),
134
+ onCancel: () => doResolve(null)
86
135
  });
136
+ }
137
+ }), {
138
+ targetFps: 30,
139
+ exitOnCtrlC: false,
140
+ useKittyKeyboard: {}
87
141
  });
88
- }
89
- //# sourceMappingURL=session-picker.js.map
142
+ });
143
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-picker.jsx","sourceRoot":"","sources":["../src/session-picker.tsx"],"names":[],"mappings":"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"}