wepscli 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 (130) hide show
  1. package/README.md +293 -0
  2. package/dist/WEPSCLI-shell/agent-runtime.js +824 -0
  3. package/dist/WEPSCLI-shell/agent-runtime.js.map +1 -0
  4. package/dist/WEPSCLI-shell/approval-overlay.js +275 -0
  5. package/dist/WEPSCLI-shell/approval-overlay.js.map +1 -0
  6. package/dist/WEPSCLI-shell/chat-components.js +760 -0
  7. package/dist/WEPSCLI-shell/chat-components.js.map +1 -0
  8. package/dist/WEPSCLI-shell/components.js +850 -0
  9. package/dist/WEPSCLI-shell/components.js.map +1 -0
  10. package/dist/WEPSCLI-shell/config-overlays.js +205 -0
  11. package/dist/WEPSCLI-shell/config-overlays.js.map +1 -0
  12. package/dist/WEPSCLI-shell/debug-log.js +16 -0
  13. package/dist/WEPSCLI-shell/debug-log.js.map +1 -0
  14. package/dist/WEPSCLI-shell/file-change-preview.js +261 -0
  15. package/dist/WEPSCLI-shell/file-change-preview.js.map +1 -0
  16. package/dist/WEPSCLI-shell/helpers.js +112 -0
  17. package/dist/WEPSCLI-shell/helpers.js.map +1 -0
  18. package/dist/WEPSCLI-shell/index.js +3 -0
  19. package/dist/WEPSCLI-shell/index.js.map +1 -0
  20. package/dist/WEPSCLI-shell/provider-add-flow.js +406 -0
  21. package/dist/WEPSCLI-shell/provider-add-flow.js.map +1 -0
  22. package/dist/WEPSCLI-shell/run-wepscli-shell.js +21 -0
  23. package/dist/WEPSCLI-shell/run-wepscli-shell.js.map +1 -0
  24. package/dist/WEPSCLI-shell/runtime-recovery.js +37 -0
  25. package/dist/WEPSCLI-shell/runtime-recovery.js.map +1 -0
  26. package/dist/WEPSCLI-shell/runtime-status.js +66 -0
  27. package/dist/WEPSCLI-shell/runtime-status.js.map +1 -0
  28. package/dist/WEPSCLI-shell/shell-app.js +1047 -0
  29. package/dist/WEPSCLI-shell/shell-app.js.map +1 -0
  30. package/dist/WEPSCLI-shell/shell-modes.js +77 -0
  31. package/dist/WEPSCLI-shell/shell-modes.js.map +1 -0
  32. package/dist/WEPSCLI-shell/slash-commands.js +135 -0
  33. package/dist/WEPSCLI-shell/slash-commands.js.map +1 -0
  34. package/dist/WEPSCLI-shell/theme.js +19 -0
  35. package/dist/WEPSCLI-shell/theme.js.map +1 -0
  36. package/dist/WEPSCLI-shell/tool-approval.js +85 -0
  37. package/dist/WEPSCLI-shell/tool-approval.js.map +1 -0
  38. package/dist/WEPSCLI-shell/tool-diff.js +76 -0
  39. package/dist/WEPSCLI-shell/tool-diff.js.map +1 -0
  40. package/dist/WEPSCLI-shell/tool-file-changes.js +268 -0
  41. package/dist/WEPSCLI-shell/tool-file-changes.js.map +1 -0
  42. package/dist/WEPSCLI-shell/tool-message-detail.js +138 -0
  43. package/dist/WEPSCLI-shell/tool-message-detail.js.map +1 -0
  44. package/dist/WEPSCLI-shell/tool-messages.js +145 -0
  45. package/dist/WEPSCLI-shell/tool-messages.js.map +1 -0
  46. package/dist/WEPSCLI-shell/transcript-panel.js +372 -0
  47. package/dist/WEPSCLI-shell/transcript-panel.js.map +1 -0
  48. package/dist/WEPSCLI-shell/transcript-state.js +62 -0
  49. package/dist/WEPSCLI-shell/transcript-state.js.map +1 -0
  50. package/dist/WEPSCLI-shell/types.js +1 -0
  51. package/dist/WEPSCLI-shell/types.js.map +1 -0
  52. package/dist/cli.js +11 -0
  53. package/dist/cli.js.map +1 -0
  54. package/dist/config.js +40 -0
  55. package/dist/config.js.map +1 -0
  56. package/dist/index.js +4 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/main.js +140 -0
  59. package/dist/main.js.map +1 -0
  60. package/dist/onboarding/action-screen.js +90 -0
  61. package/dist/onboarding/action-screen.js.map +1 -0
  62. package/dist/onboarding/framed-screen.js +35 -0
  63. package/dist/onboarding/framed-screen.js.map +1 -0
  64. package/dist/onboarding/onboarding-app.js +312 -0
  65. package/dist/onboarding/onboarding-app.js.map +1 -0
  66. package/dist/onboarding/run-onboarding.js +23 -0
  67. package/dist/onboarding/run-onboarding.js.map +1 -0
  68. package/dist/onboarding/select-screen.js +21 -0
  69. package/dist/onboarding/select-screen.js.map +1 -0
  70. package/dist/onboarding/summary-screen.js +23 -0
  71. package/dist/onboarding/summary-screen.js.map +1 -0
  72. package/dist/onboarding/text-input-screen.js +55 -0
  73. package/dist/onboarding/text-input-screen.js.map +1 -0
  74. package/dist/onboarding/theme.js +26 -0
  75. package/dist/onboarding/theme.js.map +1 -0
  76. package/dist/provider-profiles/api-key-store.js +51 -0
  77. package/dist/provider-profiles/api-key-store.js.map +1 -0
  78. package/dist/provider-profiles/defaults.js +18 -0
  79. package/dist/provider-profiles/defaults.js.map +1 -0
  80. package/dist/provider-profiles/fetch-models.js +53 -0
  81. package/dist/provider-profiles/fetch-models.js.map +1 -0
  82. package/dist/provider-profiles/index.js +6 -0
  83. package/dist/provider-profiles/index.js.map +1 -0
  84. package/dist/provider-profiles/provider-profile-service.js +223 -0
  85. package/dist/provider-profiles/provider-profile-service.js.map +1 -0
  86. package/dist/provider-profiles/providers-config-store.js +17 -0
  87. package/dist/provider-profiles/providers-config-store.js.map +1 -0
  88. package/dist/provider-profiles/types.js +1 -0
  89. package/dist/provider-profiles/types.js.map +1 -0
  90. package/dist/session-history/session-history-service.js +142 -0
  91. package/dist/session-history/session-history-service.js.map +1 -0
  92. package/dist/shell/animator.js +30 -0
  93. package/dist/shell/animator.js.map +1 -0
  94. package/dist/shell/clickables.js +101 -0
  95. package/dist/shell/clickables.js.map +1 -0
  96. package/dist/shell/dashboard-shell.js +292 -0
  97. package/dist/shell/dashboard-shell.js.map +1 -0
  98. package/dist/shell/index.js +5 -0
  99. package/dist/shell/index.js.map +1 -0
  100. package/dist/shell/keymap.js +14 -0
  101. package/dist/shell/keymap.js.map +1 -0
  102. package/dist/shell/mouse.js +39 -0
  103. package/dist/shell/mouse.js.map +1 -0
  104. package/dist/shell/render.js +122 -0
  105. package/dist/shell/render.js.map +1 -0
  106. package/dist/shell/run-shell.js +36 -0
  107. package/dist/shell/run-shell.js.map +1 -0
  108. package/dist/shell/theme.js +56 -0
  109. package/dist/shell/theme.js.map +1 -0
  110. package/dist/storage/locked-json-file.js +88 -0
  111. package/dist/storage/locked-json-file.js.map +1 -0
  112. package/dist/workbench/animator.js +30 -0
  113. package/dist/workbench/animator.js.map +1 -0
  114. package/dist/workbench/index.js +6 -0
  115. package/dist/workbench/index.js.map +1 -0
  116. package/dist/workbench/mouse.js +39 -0
  117. package/dist/workbench/mouse.js.map +1 -0
  118. package/dist/workbench/render.js +82 -0
  119. package/dist/workbench/render.js.map +1 -0
  120. package/dist/workbench/renderer.js +364 -0
  121. package/dist/workbench/renderer.js.map +1 -0
  122. package/dist/workbench/run-workbench.js +36 -0
  123. package/dist/workbench/run-workbench.js.map +1 -0
  124. package/dist/workbench/theme.js +63 -0
  125. package/dist/workbench/theme.js.map +1 -0
  126. package/dist/workbench/types.js +1 -0
  127. package/dist/workbench/types.js.map +1 -0
  128. package/dist/workbench/workbench-shell.js +649 -0
  129. package/dist/workbench/workbench-shell.js.map +1 -0
  130. package/package.json +65 -0
@@ -0,0 +1,760 @@
1
+ import { use as _$use } from "@opentui/solid";
2
+ import { memo as _$memo } from "@opentui/solid";
3
+ import { createTextNode as _$createTextNode } from "@opentui/solid";
4
+ import { effect as _$effect } from "@opentui/solid";
5
+ import { createComponent as _$createComponent } from "@opentui/solid";
6
+ import { insertNode as _$insertNode } from "@opentui/solid";
7
+ import { insert as _$insert } from "@opentui/solid";
8
+ import { setProp as _$setProp } from "@opentui/solid";
9
+ import { createElement as _$createElement } from "@opentui/solid";
10
+ import { useKeyboard } from "@opentui/solid";
11
+ import { For, Show, createEffect, createMemo, createSignal } from "solid-js";
12
+ import { getSlashCommands } from "./slash-commands.js";
13
+ import { wepscliShellTheme as theme } from "./theme.js";
14
+ export function ChatTopBar(props) {
15
+ return (() => {
16
+ var _el$ = _$createElement("box"),
17
+ _el$2 = _$createElement("box"),
18
+ _el$3 = _$createElement("box"),
19
+ _el$4 = _$createElement("text"),
20
+ _el$5 = _$createElement("text"),
21
+ _el$6 = _$createElement("text"),
22
+ _el$7 = _$createElement("box");
23
+ _$insertNode(_el$, _el$2);
24
+ _$insertNode(_el$, _el$7);
25
+ _$setProp(_el$, "flexShrink", 0);
26
+ _$setProp(_el$, "paddingLeft", 2);
27
+ _$setProp(_el$, "paddingRight", 2);
28
+ _$setProp(_el$, "paddingTop", 1);
29
+ _$setProp(_el$, "paddingBottom", 1);
30
+ _$setProp(_el$, "flexDirection", "column");
31
+ _$setProp(_el$, "gap", 1);
32
+ _$insertNode(_el$2, _el$3);
33
+ _$insertNode(_el$2, _el$6);
34
+ _$setProp(_el$2, "flexDirection", "row");
35
+ _$setProp(_el$2, "justifyContent", "space-between");
36
+ _$setProp(_el$2, "gap", 1);
37
+ _$insertNode(_el$3, _el$4);
38
+ _$insertNode(_el$3, _el$5);
39
+ _$setProp(_el$3, "flexDirection", "row");
40
+ _$setProp(_el$3, "gap", 1);
41
+ _$setProp(_el$3, "minWidth", 0);
42
+ _$setProp(_el$3, "flexGrow", 1);
43
+ _$insert(_el$4, () => props.logo);
44
+ _$insert(_el$5, () => truncateText(props.sessionTitle, 40));
45
+ _$insert(_el$6, () => truncateText(props.statusLabel, 40));
46
+ _$setProp(_el$7, "flexDirection", "row");
47
+ _$setProp(_el$7, "gap", 1);
48
+ _$insert(_el$7, _$createComponent(Chip, {
49
+ get label() {
50
+ return `Provider ${truncateText(props.providerLabel, 14)}`;
51
+ },
52
+ tone: "accent",
53
+ onClick: () => props.onAction("overlay:provider")
54
+ }), null);
55
+ _$insert(_el$7, _$createComponent(Chip, {
56
+ get label() {
57
+ return `Model ${truncateText(props.modelLabel, 14)}`;
58
+ },
59
+ tone: "muted",
60
+ onClick: () => props.onAction("overlay:model")
61
+ }), null);
62
+ _$insert(_el$7, _$createComponent(Chip, {
63
+ label: "New",
64
+ tone: "accent",
65
+ onClick: () => props.onAction("session:new")
66
+ }), null);
67
+ _$insert(_el$7, _$createComponent(Chip, {
68
+ label: "Sessions",
69
+ tone: "muted",
70
+ onClick: () => props.onAction("overlay:session")
71
+ }), null);
72
+ _$effect(_p$ => {
73
+ var _v$ = theme.header,
74
+ _v$2 = theme.accentStrong,
75
+ _v$3 = theme.text,
76
+ _v$4 = theme.muted;
77
+ _v$ !== _p$.e && (_p$.e = _$setProp(_el$, "backgroundColor", _v$, _p$.e));
78
+ _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, "fg", _v$2, _p$.t));
79
+ _v$3 !== _p$.a && (_p$.a = _$setProp(_el$5, "fg", _v$3, _p$.a));
80
+ _v$4 !== _p$.o && (_p$.o = _$setProp(_el$6, "fg", _v$4, _p$.o));
81
+ return _p$;
82
+ }, {
83
+ e: undefined,
84
+ t: undefined,
85
+ a: undefined,
86
+ o: undefined
87
+ });
88
+ return _el$;
89
+ })();
90
+ }
91
+ export function ChatTranscript(props) {
92
+ return (() => {
93
+ var _el$8 = _$createElement("box"),
94
+ _el$9 = _$createElement("box"),
95
+ _el$0 = _$createElement("text"),
96
+ _el$10 = _$createElement("text"),
97
+ _el$11 = _$createElement("scrollbox"),
98
+ _el$12 = _$createElement("box");
99
+ _$insertNode(_el$8, _el$9);
100
+ _$insertNode(_el$8, _el$11);
101
+ _$setProp(_el$8, "flexGrow", 1);
102
+ _$setProp(_el$8, "minHeight", 0);
103
+ _$setProp(_el$8, "border", ["top", "right", "bottom", "left"]);
104
+ _$setProp(_el$8, "padding", 1);
105
+ _$setProp(_el$8, "flexDirection", "column");
106
+ _$setProp(_el$8, "gap", 1);
107
+ _$insertNode(_el$9, _el$0);
108
+ _$insertNode(_el$9, _el$10);
109
+ _$setProp(_el$9, "flexDirection", "row");
110
+ _$setProp(_el$9, "justifyContent", "space-between");
111
+ _$setProp(_el$9, "gap", 1);
112
+ _$insertNode(_el$0, _$createTextNode(`Conversation`));
113
+ _$insert(_el$10, () => truncateText(props.activeModelLabel, 32));
114
+ _$insertNode(_el$11, _el$12);
115
+ _$setProp(_el$11, "flexGrow", 1);
116
+ _$setProp(_el$11, "minHeight", 0);
117
+ _$setProp(_el$12, "flexDirection", "column");
118
+ _$setProp(_el$12, "gap", 1);
119
+ _$insert(_el$12, _$createComponent(Show, {
120
+ get when() {
121
+ return props.messages.length > 0;
122
+ },
123
+ get fallback() {
124
+ return (() => {
125
+ var _el$13 = _$createElement("box"),
126
+ _el$14 = _$createElement("text"),
127
+ _el$16 = _$createElement("text"),
128
+ _el$17 = _$createElement("text");
129
+ _$insertNode(_el$13, _el$14);
130
+ _$insertNode(_el$13, _el$16);
131
+ _$insertNode(_el$13, _el$17);
132
+ _$setProp(_el$13, "border", ["top", "right", "bottom", "left"]);
133
+ _$setProp(_el$13, "padding", 1);
134
+ _$setProp(_el$13, "flexDirection", "column");
135
+ _$setProp(_el$13, "gap", 1);
136
+ _$insertNode(_el$14, _$createTextNode(`Ready for a task`));
137
+ _$setProp(_el$16, "wrapMode", "word");
138
+ _$insert(_el$16, () => props.emptyHint);
139
+ _$insertNode(_el$17, _$createTextNode(`Enter a prompt below, or type / for commands.`));
140
+ _$setProp(_el$17, "wrapMode", "word");
141
+ _$effect(_p$ => {
142
+ var _v$9 = theme.panelAlt,
143
+ _v$0 = theme.border,
144
+ _v$1 = theme.accentStrong,
145
+ _v$10 = theme.text,
146
+ _v$11 = theme.muted;
147
+ _v$9 !== _p$.e && (_p$.e = _$setProp(_el$13, "backgroundColor", _v$9, _p$.e));
148
+ _v$0 !== _p$.t && (_p$.t = _$setProp(_el$13, "borderColor", _v$0, _p$.t));
149
+ _v$1 !== _p$.a && (_p$.a = _$setProp(_el$14, "fg", _v$1, _p$.a));
150
+ _v$10 !== _p$.o && (_p$.o = _$setProp(_el$16, "fg", _v$10, _p$.o));
151
+ _v$11 !== _p$.i && (_p$.i = _$setProp(_el$17, "fg", _v$11, _p$.i));
152
+ return _p$;
153
+ }, {
154
+ e: undefined,
155
+ t: undefined,
156
+ a: undefined,
157
+ o: undefined,
158
+ i: undefined
159
+ });
160
+ return _el$13;
161
+ })();
162
+ },
163
+ get children() {
164
+ return _$createComponent(For, {
165
+ get each() {
166
+ return props.messages;
167
+ },
168
+ children: message => _$createComponent(MessageBubble, {
169
+ message: message
170
+ })
171
+ });
172
+ }
173
+ }));
174
+ _$effect(_p$ => {
175
+ var _v$5 = theme.panel,
176
+ _v$6 = theme.border,
177
+ _v$7 = theme.accent,
178
+ _v$8 = theme.muted;
179
+ _v$5 !== _p$.e && (_p$.e = _$setProp(_el$8, "backgroundColor", _v$5, _p$.e));
180
+ _v$6 !== _p$.t && (_p$.t = _$setProp(_el$8, "borderColor", _v$6, _p$.t));
181
+ _v$7 !== _p$.a && (_p$.a = _$setProp(_el$0, "fg", _v$7, _p$.a));
182
+ _v$8 !== _p$.o && (_p$.o = _$setProp(_el$10, "fg", _v$8, _p$.o));
183
+ return _p$;
184
+ }, {
185
+ e: undefined,
186
+ t: undefined,
187
+ a: undefined,
188
+ o: undefined
189
+ });
190
+ return _el$8;
191
+ })();
192
+ }
193
+ export function ChatComposer(props) {
194
+ let inputRef;
195
+ const [draftValue, setDraftValue] = createSignal(props.value);
196
+ const [slashIndex, setSlashIndex] = createSignal(0);
197
+ const slashOptions = createMemo(() => getSlashCommands(draftValue()));
198
+ const visibleSlashOptions = createMemo(() => slashOptions().slice(0, 6));
199
+ createEffect(() => {
200
+ const nextValue = props.value;
201
+ setDraftValue(nextValue);
202
+ if (!nextValue.trim().startsWith("/")) setSlashIndex(0);
203
+ });
204
+ useKeyboard(evt => {
205
+ if (!props.focused || visibleSlashOptions().length === 0 || !draftValue().trim().startsWith("/")) {
206
+ return;
207
+ }
208
+ if (evt.name === "up") {
209
+ evt.preventDefault();
210
+ setSlashIndex(current => current <= 0 ? visibleSlashOptions().length - 1 : current - 1);
211
+ return;
212
+ }
213
+ if (evt.name === "down") {
214
+ evt.preventDefault();
215
+ setSlashIndex(current => (current + 1) % visibleSlashOptions().length);
216
+ return;
217
+ }
218
+ if (evt.name === "return") {
219
+ const command = visibleSlashOptions()[slashIndex()] ?? visibleSlashOptions()[0];
220
+ if (!command) {
221
+ return;
222
+ }
223
+ evt.preventDefault();
224
+ props.onSelectSlashCommand(command.id);
225
+ }
226
+ });
227
+ function updateValue(nextValue) {
228
+ setDraftValue(nextValue);
229
+ if (!nextValue.trim().startsWith("/")) setSlashIndex(0);
230
+ props.onInput(nextValue);
231
+ }
232
+ function submitCurrentValue(value) {
233
+ const matchingCommands = getSlashCommands(value).slice(0, 6);
234
+ if (value.trim().startsWith("/") && matchingCommands.length > 0) {
235
+ const command = matchingCommands[slashIndex()] ?? matchingCommands[0];
236
+ if (command) {
237
+ props.onSelectSlashCommand(command.id);
238
+ return;
239
+ }
240
+ }
241
+ props.onSubmit(value);
242
+ }
243
+ return (() => {
244
+ var _el$19 = _$createElement("box"),
245
+ _el$20 = _$createElement("box"),
246
+ _el$21 = _$createElement("box"),
247
+ _el$22 = _$createElement("input"),
248
+ _el$23 = _$createElement("box"),
249
+ _el$24 = _$createElement("text");
250
+ _$insertNode(_el$19, _el$20);
251
+ _$setProp(_el$19, "flexShrink", 0);
252
+ _$setProp(_el$19, "border", ["top", "right", "bottom", "left"]);
253
+ _$setProp(_el$19, "paddingLeft", 1);
254
+ _$setProp(_el$19, "paddingRight", 1);
255
+ _$setProp(_el$19, "paddingTop", 0);
256
+ _$setProp(_el$19, "paddingBottom", 0);
257
+ _$setProp(_el$19, "flexDirection", "column");
258
+ _$setProp(_el$19, "gap", 0);
259
+ _$insert(_el$19, (() => {
260
+ var _c$ = _$memo(() => visibleSlashOptions().length > 0);
261
+ return () => _c$() ? (() => {
262
+ var _el$25 = _$createElement("box");
263
+ _$setProp(_el$25, "border", ["bottom"]);
264
+ _$setProp(_el$25, "paddingLeft", 1);
265
+ _$setProp(_el$25, "paddingRight", 1);
266
+ _$setProp(_el$25, "paddingTop", 0);
267
+ _$setProp(_el$25, "paddingBottom", 0);
268
+ _$setProp(_el$25, "flexDirection", "column");
269
+ _$setProp(_el$25, "gap", 0);
270
+ _$insert(_el$25, _$createComponent(For, {
271
+ get each() {
272
+ return visibleSlashOptions();
273
+ },
274
+ children: (option, index) => (() => {
275
+ var _el$26 = _$createElement("box"),
276
+ _el$27 = _$createElement("text");
277
+ _$insertNode(_el$26, _el$27);
278
+ _$setProp(_el$26, "paddingLeft", 1);
279
+ _$setProp(_el$26, "paddingRight", 1);
280
+ _$setProp(_el$26, "flexDirection", "row");
281
+ _$setProp(_el$26, "onMouseUp", () => props.onSelectSlashCommand(option.id));
282
+ _$insert(_el$27, () => truncateText(option.label, 24));
283
+ _$effect(_p$ => {
284
+ var _v$30 = slashIndex() === index() ? theme.accent : theme.panelAlt,
285
+ _v$31 = slashIndex() === index() ? theme.background : theme.text;
286
+ _v$30 !== _p$.e && (_p$.e = _$setProp(_el$26, "backgroundColor", _v$30, _p$.e));
287
+ _v$31 !== _p$.t && (_p$.t = _$setProp(_el$27, "fg", _v$31, _p$.t));
288
+ return _p$;
289
+ }, {
290
+ e: undefined,
291
+ t: undefined
292
+ });
293
+ return _el$26;
294
+ })()
295
+ }));
296
+ _$effect(_p$ => {
297
+ var _v$28 = theme.panel,
298
+ _v$29 = theme.border;
299
+ _v$28 !== _p$.e && (_p$.e = _$setProp(_el$25, "backgroundColor", _v$28, _p$.e));
300
+ _v$29 !== _p$.t && (_p$.t = _$setProp(_el$25, "borderColor", _v$29, _p$.t));
301
+ return _p$;
302
+ }, {
303
+ e: undefined,
304
+ t: undefined
305
+ });
306
+ return _el$25;
307
+ })() : null;
308
+ })(), _el$20);
309
+ _$insertNode(_el$20, _el$21);
310
+ _$insertNode(_el$20, _el$23);
311
+ _$setProp(_el$20, "paddingLeft", 0);
312
+ _$setProp(_el$20, "paddingRight", 0);
313
+ _$setProp(_el$20, "paddingTop", 0);
314
+ _$setProp(_el$20, "paddingBottom", 0);
315
+ _$setProp(_el$20, "flexDirection", "row");
316
+ _$setProp(_el$20, "gap", 0);
317
+ _$insertNode(_el$21, _el$22);
318
+ _$setProp(_el$21, "flexGrow", 1);
319
+ _$setProp(_el$21, "minWidth", 0);
320
+ _$use(ref => {
321
+ inputRef = ref;
322
+ props.inputRef(ref);
323
+ }, _el$22);
324
+ _$setProp(_el$22, "placeholder", "Type / or ask");
325
+ _$setProp(_el$22, "onInput", value => updateValue(value));
326
+ _$setProp(_el$22, "onSubmit", value => submitCurrentValue(value));
327
+ _$insertNode(_el$23, _el$24);
328
+ _$setProp(_el$23, "flexShrink", 0);
329
+ _$setProp(_el$23, "width", 14);
330
+ _$setProp(_el$23, "border", ["left"]);
331
+ _$setProp(_el$23, "paddingLeft", 1);
332
+ _$setProp(_el$23, "paddingRight", 1);
333
+ _$setProp(_el$23, "alignItems", "center");
334
+ _$setProp(_el$23, "justifyContent", "center");
335
+ _$insert(_el$24, () => truncateText(props.modeLabel, 12));
336
+ _$effect(_p$ => {
337
+ var _v$12 = theme.panelAlt,
338
+ _v$13 = props.focused ? theme.accent : theme.border,
339
+ _v$14 = theme.panelAlt,
340
+ _v$15 = props.onFocus,
341
+ _v$16 = props.focused,
342
+ _v$17 = draftValue(),
343
+ _v$18 = theme.panelAlt,
344
+ _v$19 = theme.text,
345
+ _v$20 = theme.panelAlt,
346
+ _v$21 = theme.text,
347
+ _v$22 = theme.accent,
348
+ _v$23 = props.onFocus,
349
+ _v$24 = modeBackgroundColor(props.modeTone),
350
+ _v$25 = props.focused ? theme.accent : theme.border,
351
+ _v$26 = props.onModeClick,
352
+ _v$27 = modeForegroundColor(props.modeTone);
353
+ _v$12 !== _p$.e && (_p$.e = _$setProp(_el$19, "backgroundColor", _v$12, _p$.e));
354
+ _v$13 !== _p$.t && (_p$.t = _$setProp(_el$19, "borderColor", _v$13, _p$.t));
355
+ _v$14 !== _p$.a && (_p$.a = _$setProp(_el$20, "backgroundColor", _v$14, _p$.a));
356
+ _v$15 !== _p$.o && (_p$.o = _$setProp(_el$20, "onMouseUp", _v$15, _p$.o));
357
+ _v$16 !== _p$.i && (_p$.i = _$setProp(_el$22, "focused", _v$16, _p$.i));
358
+ _v$17 !== _p$.n && (_p$.n = _$setProp(_el$22, "value", _v$17, _p$.n));
359
+ _v$18 !== _p$.s && (_p$.s = _$setProp(_el$22, "backgroundColor", _v$18, _p$.s));
360
+ _v$19 !== _p$.h && (_p$.h = _$setProp(_el$22, "textColor", _v$19, _p$.h));
361
+ _v$20 !== _p$.r && (_p$.r = _$setProp(_el$22, "focusedBackgroundColor", _v$20, _p$.r));
362
+ _v$21 !== _p$.d && (_p$.d = _$setProp(_el$22, "focusedTextColor", _v$21, _p$.d));
363
+ _v$22 !== _p$.l && (_p$.l = _$setProp(_el$22, "cursorColor", _v$22, _p$.l));
364
+ _v$23 !== _p$.u && (_p$.u = _$setProp(_el$22, "onMouseUp", _v$23, _p$.u));
365
+ _v$24 !== _p$.c && (_p$.c = _$setProp(_el$23, "backgroundColor", _v$24, _p$.c));
366
+ _v$25 !== _p$.w && (_p$.w = _$setProp(_el$23, "borderColor", _v$25, _p$.w));
367
+ _v$26 !== _p$.m && (_p$.m = _$setProp(_el$23, "onMouseUp", _v$26, _p$.m));
368
+ _v$27 !== _p$.f && (_p$.f = _$setProp(_el$24, "fg", _v$27, _p$.f));
369
+ return _p$;
370
+ }, {
371
+ e: undefined,
372
+ t: undefined,
373
+ a: undefined,
374
+ o: undefined,
375
+ i: undefined,
376
+ n: undefined,
377
+ s: undefined,
378
+ h: undefined,
379
+ r: undefined,
380
+ d: undefined,
381
+ l: undefined,
382
+ u: undefined,
383
+ c: undefined,
384
+ w: undefined,
385
+ m: undefined,
386
+ f: undefined
387
+ });
388
+ return _el$19;
389
+ })();
390
+ }
391
+ export function ChatSidebar(props) {
392
+ return (() => {
393
+ var _el$28 = _$createElement("box"),
394
+ _el$29 = _$createElement("text"),
395
+ _el$31 = _$createElement("text"),
396
+ _el$33 = _$createElement("text"),
397
+ _el$35 = _$createElement("text");
398
+ _$insertNode(_el$28, _el$29);
399
+ _$insertNode(_el$28, _el$31);
400
+ _$insertNode(_el$28, _el$33);
401
+ _$insertNode(_el$28, _el$35);
402
+ _$setProp(_el$28, "width", 34);
403
+ _$setProp(_el$28, "border", ["top", "right", "bottom", "left"]);
404
+ _$setProp(_el$28, "padding", 1);
405
+ _$setProp(_el$28, "flexDirection", "column");
406
+ _$setProp(_el$28, "gap", 1);
407
+ _$insertNode(_el$29, _$createTextNode(`Context`));
408
+ _$insert(_el$28, _$createComponent(MetaRow, {
409
+ label: "Session",
410
+ get value() {
411
+ return truncateText(props.sessionTitle, 18);
412
+ }
413
+ }), _el$31);
414
+ _$insert(_el$28, _$createComponent(MetaRow, {
415
+ label: "Summary",
416
+ get value() {
417
+ return truncateText(props.sessionSummary, 18);
418
+ }
419
+ }), _el$31);
420
+ _$insert(_el$28, _$createComponent(MetaRow, {
421
+ label: "Provider",
422
+ get value() {
423
+ return truncateText(props.providerLabel, 18);
424
+ }
425
+ }), _el$31);
426
+ _$insert(_el$28, _$createComponent(MetaRow, {
427
+ label: "Model",
428
+ get value() {
429
+ return truncateText(props.modelLabel, 18);
430
+ }
431
+ }), _el$31);
432
+ _$insertNode(_el$31, _$createTextNode(`Recent chats`));
433
+ _$insert(_el$28, _$createComponent(For, {
434
+ get each() {
435
+ return props.recentSessions.slice(0, 4);
436
+ },
437
+ children: session => (() => {
438
+ var _el$37 = _$createElement("box"),
439
+ _el$38 = _$createElement("box"),
440
+ _el$39 = _$createElement("text"),
441
+ _el$40 = _$createElement("text"),
442
+ _el$41 = _$createElement("text");
443
+ _$insertNode(_el$37, _el$38);
444
+ _$insertNode(_el$37, _el$41);
445
+ _$setProp(_el$37, "border", ["top", "right", "bottom", "left"]);
446
+ _$setProp(_el$37, "padding", 1);
447
+ _$setProp(_el$37, "flexDirection", "column");
448
+ _$setProp(_el$37, "gap", 1);
449
+ _$setProp(_el$37, "onMouseUp", () => props.onOpenSession(session.id));
450
+ _$insertNode(_el$38, _el$39);
451
+ _$insertNode(_el$38, _el$40);
452
+ _$setProp(_el$38, "flexDirection", "row");
453
+ _$setProp(_el$38, "justifyContent", "space-between");
454
+ _$setProp(_el$38, "gap", 1);
455
+ _$insert(_el$39, () => truncateText(session.title, 20));
456
+ _$insert(_el$40, () => truncateText(session.state.toUpperCase(), 8));
457
+ _$setProp(_el$41, "wrapMode", "word");
458
+ _$insert(_el$41, () => truncateText(session.summary, 28));
459
+ _$effect(_p$ => {
460
+ var _v$38 = theme.panel,
461
+ _v$39 = theme.border,
462
+ _v$40 = theme.text,
463
+ _v$41 = session.state === "active" ? theme.success : theme.muted,
464
+ _v$42 = theme.muted;
465
+ _v$38 !== _p$.e && (_p$.e = _$setProp(_el$37, "backgroundColor", _v$38, _p$.e));
466
+ _v$39 !== _p$.t && (_p$.t = _$setProp(_el$37, "borderColor", _v$39, _p$.t));
467
+ _v$40 !== _p$.a && (_p$.a = _$setProp(_el$39, "fg", _v$40, _p$.a));
468
+ _v$41 !== _p$.o && (_p$.o = _$setProp(_el$40, "fg", _v$41, _p$.o));
469
+ _v$42 !== _p$.i && (_p$.i = _$setProp(_el$41, "fg", _v$42, _p$.i));
470
+ return _p$;
471
+ }, {
472
+ e: undefined,
473
+ t: undefined,
474
+ a: undefined,
475
+ o: undefined,
476
+ i: undefined
477
+ });
478
+ return _el$37;
479
+ })()
480
+ }), _el$33);
481
+ _$insertNode(_el$33, _$createTextNode(`Shortcuts`));
482
+ _$insertNode(_el$35, _$createTextNode(`Tab focus | h home | p provider | m model | s sessions`));
483
+ _$setProp(_el$35, "wrapMode", "word");
484
+ _$insert(_el$28, _$createComponent(MiniChip, {
485
+ label: "Provider",
486
+ tone: "accent",
487
+ onClick: () => props.onAction("overlay:provider")
488
+ }), null);
489
+ _$insert(_el$28, _$createComponent(MiniChip, {
490
+ label: "Model",
491
+ tone: "muted",
492
+ onClick: () => props.onAction("overlay:model")
493
+ }), null);
494
+ _$insert(_el$28, _$createComponent(MiniChip, {
495
+ label: "New chat",
496
+ tone: "accent",
497
+ onClick: () => props.onAction("session:new")
498
+ }), null);
499
+ _$effect(_p$ => {
500
+ var _v$32 = theme.panelMuted,
501
+ _v$33 = theme.border,
502
+ _v$34 = theme.accent,
503
+ _v$35 = theme.accent,
504
+ _v$36 = theme.accent,
505
+ _v$37 = theme.muted;
506
+ _v$32 !== _p$.e && (_p$.e = _$setProp(_el$28, "backgroundColor", _v$32, _p$.e));
507
+ _v$33 !== _p$.t && (_p$.t = _$setProp(_el$28, "borderColor", _v$33, _p$.t));
508
+ _v$34 !== _p$.a && (_p$.a = _$setProp(_el$29, "fg", _v$34, _p$.a));
509
+ _v$35 !== _p$.o && (_p$.o = _$setProp(_el$31, "fg", _v$35, _p$.o));
510
+ _v$36 !== _p$.i && (_p$.i = _$setProp(_el$33, "fg", _v$36, _p$.i));
511
+ _v$37 !== _p$.n && (_p$.n = _$setProp(_el$35, "fg", _v$37, _p$.n));
512
+ return _p$;
513
+ }, {
514
+ e: undefined,
515
+ t: undefined,
516
+ a: undefined,
517
+ o: undefined,
518
+ i: undefined,
519
+ n: undefined
520
+ });
521
+ return _el$28;
522
+ })();
523
+ }
524
+ export function OverlayPicker(props) {
525
+ return (() => {
526
+ var _el$42 = _$createElement("box"),
527
+ _el$43 = _$createElement("box"),
528
+ _el$44 = _$createElement("box"),
529
+ _el$45 = _$createElement("text"),
530
+ _el$46 = _$createElement("text"),
531
+ _el$48 = _$createElement("text");
532
+ _$insertNode(_el$42, _el$43);
533
+ _$setProp(_el$42, "position", "absolute");
534
+ _$setProp(_el$42, "width", "100%");
535
+ _$setProp(_el$42, "height", "100%");
536
+ _$setProp(_el$42, "alignItems", "center");
537
+ _$setProp(_el$42, "justifyContent", "center");
538
+ _$insertNode(_el$43, _el$44);
539
+ _$insertNode(_el$43, _el$48);
540
+ _$setProp(_el$43, "width", "70%");
541
+ _$setProp(_el$43, "maxWidth", 80);
542
+ _$setProp(_el$43, "border", ["top", "right", "bottom", "left"]);
543
+ _$setProp(_el$43, "padding", 1);
544
+ _$setProp(_el$43, "flexDirection", "column");
545
+ _$setProp(_el$43, "gap", 1);
546
+ _$insertNode(_el$44, _el$45);
547
+ _$insertNode(_el$44, _el$46);
548
+ _$setProp(_el$44, "flexDirection", "row");
549
+ _$setProp(_el$44, "justifyContent", "space-between");
550
+ _$setProp(_el$44, "gap", 1);
551
+ _$insert(_el$45, () => truncateText(props.title, 32));
552
+ _$insertNode(_el$46, _$createTextNode(`esc`));
553
+ _$setProp(_el$48, "wrapMode", "word");
554
+ _$insert(_el$48, () => truncateText(props.description, 96));
555
+ _$insert(_el$43, _$createComponent(Show, {
556
+ get when() {
557
+ return props.options.length > 0;
558
+ },
559
+ get fallback() {
560
+ return (() => {
561
+ var _el$51 = _$createElement("text");
562
+ _$insertNode(_el$51, _$createTextNode(`No options are available yet.`));
563
+ _$effect(_$p => _$setProp(_el$51, "fg", theme.warning, _$p));
564
+ return _el$51;
565
+ })();
566
+ },
567
+ get children() {
568
+ var _el$49 = _$createElement("scrollbox"),
569
+ _el$50 = _$createElement("box");
570
+ _$insertNode(_el$49, _el$50);
571
+ _$setProp(_el$49, "maxHeight", 12);
572
+ _$setProp(_el$50, "flexDirection", "column");
573
+ _$setProp(_el$50, "gap", 1);
574
+ _$insert(_el$50, _$createComponent(For, {
575
+ get each() {
576
+ return props.options;
577
+ },
578
+ children: (option, index) => (() => {
579
+ var _el$53 = _$createElement("box"),
580
+ _el$54 = _$createElement("box"),
581
+ _el$55 = _$createElement("text"),
582
+ _el$56 = _$createElement("text");
583
+ _$insertNode(_el$53, _el$54);
584
+ _$insertNode(_el$53, _el$56);
585
+ _$setProp(_el$53, "paddingLeft", 1);
586
+ _$setProp(_el$53, "paddingRight", 1);
587
+ _$setProp(_el$53, "paddingTop", 1);
588
+ _$setProp(_el$53, "paddingBottom", 1);
589
+ _$setProp(_el$53, "flexDirection", "column");
590
+ _$setProp(_el$53, "onMouseUp", () => props.onSelect(option.id, index()));
591
+ _$insertNode(_el$54, _el$55);
592
+ _$setProp(_el$54, "flexDirection", "row");
593
+ _$setProp(_el$54, "justifyContent", "space-between");
594
+ _$setProp(_el$54, "gap", 1);
595
+ _$insert(_el$55, () => truncateText(option.label, 28));
596
+ _$insert(_el$54, (() => {
597
+ var _c$2 = _$memo(() => !!option.badge);
598
+ return () => _c$2() ? (() => {
599
+ var _el$57 = _$createElement("text");
600
+ _$insert(_el$57, () => truncateText(option.badge, 10));
601
+ _$effect(_$p => _$setProp(_el$57, "fg", props.selectedIndex === index() ? theme.background : theme.success, _$p));
602
+ return _el$57;
603
+ })() : null;
604
+ })(), null);
605
+ _$setProp(_el$56, "wrapMode", "word");
606
+ _$insert(_el$56, () => option.description);
607
+ _$effect(_p$ => {
608
+ var _v$49 = props.selectedIndex === index() ? theme.accent : theme.panel,
609
+ _v$50 = props.selectedIndex === index() ? theme.background : theme.text,
610
+ _v$51 = props.selectedIndex === index() ? theme.background : theme.muted;
611
+ _v$49 !== _p$.e && (_p$.e = _$setProp(_el$53, "backgroundColor", _v$49, _p$.e));
612
+ _v$50 !== _p$.t && (_p$.t = _$setProp(_el$55, "fg", _v$50, _p$.t));
613
+ _v$51 !== _p$.a && (_p$.a = _$setProp(_el$56, "fg", _v$51, _p$.a));
614
+ return _p$;
615
+ }, {
616
+ e: undefined,
617
+ t: undefined,
618
+ a: undefined
619
+ });
620
+ return _el$53;
621
+ })()
622
+ }));
623
+ return _el$49;
624
+ }
625
+ }), null);
626
+ _$effect(_p$ => {
627
+ var _v$43 = theme.panelAlt,
628
+ _v$44 = theme.accent,
629
+ _v$45 = theme.accentStrong,
630
+ _v$46 = theme.muted,
631
+ _v$47 = props.onClose,
632
+ _v$48 = theme.muted;
633
+ _v$43 !== _p$.e && (_p$.e = _$setProp(_el$43, "backgroundColor", _v$43, _p$.e));
634
+ _v$44 !== _p$.t && (_p$.t = _$setProp(_el$43, "borderColor", _v$44, _p$.t));
635
+ _v$45 !== _p$.a && (_p$.a = _$setProp(_el$45, "fg", _v$45, _p$.a));
636
+ _v$46 !== _p$.o && (_p$.o = _$setProp(_el$46, "fg", _v$46, _p$.o));
637
+ _v$47 !== _p$.i && (_p$.i = _$setProp(_el$46, "onMouseUp", _v$47, _p$.i));
638
+ _v$48 !== _p$.n && (_p$.n = _$setProp(_el$48, "fg", _v$48, _p$.n));
639
+ return _p$;
640
+ }, {
641
+ e: undefined,
642
+ t: undefined,
643
+ a: undefined,
644
+ o: undefined,
645
+ i: undefined,
646
+ n: undefined
647
+ });
648
+ return _el$42;
649
+ })();
650
+ }
651
+ function MessageBubble(props) {
652
+ const tone = props.message.role === "user" ? theme.accent : props.message.role === "assistant" ? theme.success : theme.muted;
653
+ return (() => {
654
+ var _el$58 = _$createElement("box"),
655
+ _el$59 = _$createElement("box"),
656
+ _el$60 = _$createElement("text"),
657
+ _el$61 = _$createElement("text"),
658
+ _el$62 = _$createElement("text");
659
+ _$insertNode(_el$58, _el$59);
660
+ _$insertNode(_el$58, _el$62);
661
+ _$setProp(_el$58, "border", ["top", "right", "bottom", "left"]);
662
+ _$setProp(_el$58, "borderColor", tone);
663
+ _$setProp(_el$58, "padding", 1);
664
+ _$setProp(_el$58, "flexDirection", "column");
665
+ _$setProp(_el$58, "gap", 1);
666
+ _$insertNode(_el$59, _el$60);
667
+ _$insertNode(_el$59, _el$61);
668
+ _$setProp(_el$59, "flexDirection", "row");
669
+ _$setProp(_el$59, "justifyContent", "space-between");
670
+ _$setProp(_el$59, "gap", 1);
671
+ _$setProp(_el$60, "fg", tone);
672
+ _$insert(_el$60, () => props.message.role.toUpperCase());
673
+ _$insert(_el$61, () => truncateText(props.message.time, 12));
674
+ _$setProp(_el$62, "wrapMode", "word");
675
+ _$insert(_el$62, () => props.message.content);
676
+ _$effect(_p$ => {
677
+ var _v$52 = theme.panelAlt,
678
+ _v$53 = theme.muted,
679
+ _v$54 = theme.text;
680
+ _v$52 !== _p$.e && (_p$.e = _$setProp(_el$58, "backgroundColor", _v$52, _p$.e));
681
+ _v$53 !== _p$.t && (_p$.t = _$setProp(_el$61, "fg", _v$53, _p$.t));
682
+ _v$54 !== _p$.a && (_p$.a = _$setProp(_el$62, "fg", _v$54, _p$.a));
683
+ return _p$;
684
+ }, {
685
+ e: undefined,
686
+ t: undefined,
687
+ a: undefined
688
+ });
689
+ return _el$58;
690
+ })();
691
+ }
692
+ function MetaRow(props) {
693
+ return (() => {
694
+ var _el$63 = _$createElement("box"),
695
+ _el$64 = _$createElement("text"),
696
+ _el$65 = _$createElement("text");
697
+ _$insertNode(_el$63, _el$64);
698
+ _$insertNode(_el$63, _el$65);
699
+ _$setProp(_el$63, "flexDirection", "row");
700
+ _$setProp(_el$63, "justifyContent", "space-between");
701
+ _$setProp(_el$63, "gap", 1);
702
+ _$insert(_el$64, () => props.label);
703
+ _$insert(_el$65, () => truncateText(props.value, 18));
704
+ _$effect(_p$ => {
705
+ var _v$55 = theme.muted,
706
+ _v$56 = theme.text;
707
+ _v$55 !== _p$.e && (_p$.e = _$setProp(_el$64, "fg", _v$55, _p$.e));
708
+ _v$56 !== _p$.t && (_p$.t = _$setProp(_el$65, "fg", _v$56, _p$.t));
709
+ return _p$;
710
+ }, {
711
+ e: undefined,
712
+ t: undefined
713
+ });
714
+ return _el$63;
715
+ })();
716
+ }
717
+ function Chip(props) {
718
+ const backgroundColor = props.tone === "accent" ? theme.accent : theme.panel;
719
+ const foregroundColor = props.tone === "accent" ? theme.background : theme.text;
720
+ return (() => {
721
+ var _el$66 = _$createElement("box"),
722
+ _el$67 = _$createElement("text");
723
+ _$insertNode(_el$66, _el$67);
724
+ _$setProp(_el$66, "backgroundColor", backgroundColor);
725
+ _$setProp(_el$66, "paddingLeft", 1);
726
+ _$setProp(_el$66, "paddingRight", 1);
727
+ _$setProp(_el$67, "fg", foregroundColor);
728
+ _$insert(_el$67, () => truncateText(props.label, 24));
729
+ _$effect(_$p => _$setProp(_el$66, "onMouseUp", props.onClick, _$p));
730
+ return _el$66;
731
+ })();
732
+ }
733
+ function MiniChip(props) {
734
+ return _$createComponent(Chip, props);
735
+ }
736
+ function truncateText(value, maxLength) {
737
+ return value.length <= maxLength ? value : `${value.slice(0, Math.max(0, maxLength - 3))}...`;
738
+ }
739
+ function modeBackgroundColor(tone) {
740
+ switch (tone) {
741
+ case "accent":
742
+ return theme.accent;
743
+ case "warning":
744
+ return theme.warning;
745
+ case "muted":
746
+ return theme.panelMuted;
747
+ case "danger":
748
+ return theme.danger;
749
+ }
750
+ }
751
+ function modeForegroundColor(tone) {
752
+ switch (tone) {
753
+ case "accent":
754
+ case "warning":
755
+ case "danger":
756
+ return theme.background;
757
+ case "muted":
758
+ return theme.text;
759
+ }
760
+ }