@suchitraswain/nightcode-cli 1.0.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 (51) hide show
  1. package/bin/nightcode.cjs +10 -0
  2. package/bin/nightcode.ts +5 -0
  3. package/package.json +50 -0
  4. package/src/bootstrap-env.ts +33 -0
  5. package/src/components/border.tsx +18 -0
  6. package/src/components/command-menu/commands.tsx +147 -0
  7. package/src/components/command-menu/filter-commands.ts +8 -0
  8. package/src/components/command-menu/index.tsx +74 -0
  9. package/src/components/command-menu/types.ts +20 -0
  10. package/src/components/command-menu/use-command-menu.ts +113 -0
  11. package/src/components/dialog-search-list.tsx +127 -0
  12. package/src/components/dialogs/agents-dialog.tsx +47 -0
  13. package/src/components/dialogs/index.tsx +4 -0
  14. package/src/components/dialogs/models-dialog.tsx +41 -0
  15. package/src/components/dialogs/sessions-dialog.tsx +94 -0
  16. package/src/components/dialogs/theme-dialog.tsx +58 -0
  17. package/src/components/header.tsx +10 -0
  18. package/src/components/input-bar.tsx +611 -0
  19. package/src/components/messages/bot-message.tsx +160 -0
  20. package/src/components/messages/error-message.tsx +36 -0
  21. package/src/components/messages/index.tsx +3 -0
  22. package/src/components/messages/user-message.tsx +36 -0
  23. package/src/components/session-shell.tsx +65 -0
  24. package/src/components/spinner.tsx +14 -0
  25. package/src/components/status-bar.tsx +23 -0
  26. package/src/hooks/use-chat.ts +107 -0
  27. package/src/hosted-config.ts +6 -0
  28. package/src/index.tsx +29 -0
  29. package/src/layouts/root-layout.tsx +25 -0
  30. package/src/layouts/themed-root.tsx +21 -0
  31. package/src/lib/api-client.ts +25 -0
  32. package/src/lib/auth.ts +38 -0
  33. package/src/lib/http-errors.ts +18 -0
  34. package/src/lib/local-tools.ts +170 -0
  35. package/src/lib/oauth.ts +166 -0
  36. package/src/lib/upgrade.ts +27 -0
  37. package/src/providers/dialog/index.tsx +123 -0
  38. package/src/providers/dialog/types.ts +6 -0
  39. package/src/providers/keyboard-layer/index.tsx +98 -0
  40. package/src/providers/prompt-config/index.tsx +52 -0
  41. package/src/providers/theme/index.tsx +75 -0
  42. package/src/providers/toast/index.tsx +118 -0
  43. package/src/providers/toast/types.ts +9 -0
  44. package/src/screens/home.tsx +39 -0
  45. package/src/screens/new-session.tsx +82 -0
  46. package/src/screens/session.tsx +171 -0
  47. package/src/theme.ts +568 -0
  48. package/vendor/shared/api-types.ts +11 -0
  49. package/vendor/shared/index.ts +20 -0
  50. package/vendor/shared/models.ts +72 -0
  51. package/vendor/shared/schemas.ts +87 -0
package/src/theme.ts ADDED
@@ -0,0 +1,568 @@
1
+ export type ThemeColors = {
2
+ primary: string;
3
+ planMode: string;
4
+ selection: string;
5
+ thinking: string;
6
+ success: string;
7
+ error: string;
8
+ info: string;
9
+ background: string;
10
+ surface: string;
11
+ dialogSurface: string;
12
+ thinkingBorder: string;
13
+ dimSeparator: string;
14
+ };
15
+
16
+ export type Theme = {
17
+ name: string;
18
+ colors: ThemeColors;
19
+ };
20
+
21
+ export const THEMES: Theme[] = [
22
+ {
23
+ name: "Nightfox",
24
+ colors: {
25
+ primary: "#56D6C2",
26
+ planMode: "#CF8EF4",
27
+ selection: "#89B4FA",
28
+ thinking: "#CF8EF4",
29
+ success: "#82E0AA",
30
+ error: "#E74C5E",
31
+ info: "#56D6C2",
32
+ background: "#0D0D12",
33
+ surface: "#1A1A24",
34
+ dialogSurface: "#0A0A10",
35
+ thinkingBorder: "#34344A",
36
+ dimSeparator: "#4E4E66",
37
+ },
38
+ },
39
+ {
40
+ name: "Catppuccin Mocha",
41
+ colors: {
42
+ primary: "#E0AF68",
43
+ planMode: "#9D7CD8",
44
+ selection: "#B4A4E8",
45
+ thinking: "#9D7CD8",
46
+ success: "#73DACA",
47
+ error: "#F7768E",
48
+ info: "#7AA2F7",
49
+ background: "#11111B",
50
+ surface: "#1E1E2E",
51
+ dialogSurface: "#13131D",
52
+ thinkingBorder: "#45475A",
53
+ dimSeparator: "#585B70",
54
+ },
55
+ },
56
+ {
57
+ name: "Dracula",
58
+ colors: {
59
+ primary: "#BD93F9",
60
+ planMode: "#FF79C6",
61
+ selection: "#6272A4",
62
+ thinking: "#FF79C6",
63
+ success: "#50FA7B",
64
+ error: "#FF5555",
65
+ info: "#8BE9FD",
66
+ background: "#282A36",
67
+ surface: "#343746",
68
+ dialogSurface: "#21222C",
69
+ thinkingBorder: "#6272A4",
70
+ dimSeparator: "#44475A",
71
+ },
72
+ },
73
+ {
74
+ name: "Monokai Pro",
75
+ colors: {
76
+ primary: "#FFD866",
77
+ planMode: "#AB9DF2",
78
+ selection: "#AB9DF2",
79
+ thinking: "#AB9DF2",
80
+ success: "#A9DC76",
81
+ error: "#FF6188",
82
+ info: "#78DCE8",
83
+ background: "#2D2A2E",
84
+ surface: "#403E41",
85
+ dialogSurface: "#221F22",
86
+ thinkingBorder: "#5B595C",
87
+ dimSeparator: "#727072",
88
+ },
89
+ },
90
+ {
91
+ name: "Tokyo Night",
92
+ colors: {
93
+ primary: "#7AA2F7",
94
+ planMode: "#BB9AF7",
95
+ selection: "#7AA2F7",
96
+ thinking: "#BB9AF7",
97
+ success: "#9ECE6A",
98
+ error: "#F7768E",
99
+ info: "#7DCFFF",
100
+ background: "#1A1B26",
101
+ surface: "#24283B",
102
+ dialogSurface: "#16161E",
103
+ thinkingBorder: "#3B4261",
104
+ dimSeparator: "#565F89",
105
+ },
106
+ },
107
+ {
108
+ name: "Nord",
109
+ colors: {
110
+ primary: "#EBCB8B",
111
+ planMode: "#B48EAD",
112
+ selection: "#81A1C1",
113
+ thinking: "#B48EAD",
114
+ success: "#A3BE8C",
115
+ error: "#BF616A",
116
+ info: "#88C0D0",
117
+ background: "#2E3440",
118
+ surface: "#3B4252",
119
+ dialogSurface: "#272C36",
120
+ thinkingBorder: "#4C566A",
121
+ dimSeparator: "#616E88",
122
+ },
123
+ },
124
+ {
125
+ name: "Synthwave",
126
+ colors: {
127
+ primary: "#F472B6",
128
+ planMode: "#A855F7",
129
+ selection: "#E879F9",
130
+ thinking: "#A855F7",
131
+ success: "#4ADE80",
132
+ error: "#EF4444",
133
+ info: "#C084FC",
134
+ background: "#0A0A0A",
135
+ surface: "#171717",
136
+ dialogSurface: "#0D0D0D",
137
+ thinkingBorder: "#404040",
138
+ dimSeparator: "#525252",
139
+ },
140
+ },
141
+ {
142
+ name: "Midnight Sky",
143
+ colors: {
144
+ primary: "#6AAEF5",
145
+ planMode: "#B07AE8",
146
+ selection: "#8CC4F0",
147
+ thinking: "#B07AE8",
148
+ success: "#58CEA0",
149
+ error: "#E8555A",
150
+ info: "#7DCFFF",
151
+ background: "#0A0E14",
152
+ surface: "#141A22",
153
+ dialogSurface: "#0E1319",
154
+ thinkingBorder: "#4A5A6E",
155
+ dimSeparator: "#607080",
156
+ },
157
+ },
158
+ {
159
+ name: "Neon Nights",
160
+ colors: {
161
+ primary: "#E86ACA",
162
+ planMode: "#5ED4E8",
163
+ selection: "#D48EE0",
164
+ thinking: "#5ED4E8",
165
+ success: "#4ED89C",
166
+ error: "#F04858",
167
+ info: "#E86ACA",
168
+ background: "#0C0814",
169
+ surface: "#18122A",
170
+ dialogSurface: "#110C1E",
171
+ thinkingBorder: "#5C4878",
172
+ dimSeparator: "#745E90",
173
+ },
174
+ },
175
+ {
176
+ name: "Hacker Terminal",
177
+ colors: {
178
+ primary: "#00E5A0",
179
+ planMode: "#D946EF",
180
+ selection: "#2DD4BF",
181
+ thinking: "#D946EF",
182
+ success: "#4ADE80",
183
+ error: "#F43F5E",
184
+ info: "#06B6D4",
185
+ background: "#050505",
186
+ surface: "#131313",
187
+ dialogSurface: "#0A0A0A",
188
+ thinkingBorder: "#2E2E2E",
189
+ dimSeparator: "#454545",
190
+ },
191
+ },
192
+ {
193
+ name: "One Dark",
194
+ colors: {
195
+ primary: "#CBAACB",
196
+ planMode: "#55B6C2",
197
+ selection: "#98C379",
198
+ thinking: "#55B6C2",
199
+ success: "#98C379",
200
+ error: "#E06C75",
201
+ info: "#61AFEF",
202
+ background: "#1E2127",
203
+ surface: "#282C34",
204
+ dialogSurface: "#191C21",
205
+ thinkingBorder: "#3E4451",
206
+ dimSeparator: "#5C6370",
207
+ },
208
+ },
209
+ {
210
+ name: "Xcode Midnight",
211
+ colors: {
212
+ primary: "#FF7AB2",
213
+ planMode: "#6BDFFF",
214
+ selection: "#ACF2E4",
215
+ thinking: "#6BDFFF",
216
+ success: "#83C9BC",
217
+ error: "#FF6961",
218
+ info: "#B281EB",
219
+ background: "#1F1F24",
220
+ surface: "#2A2A30",
221
+ dialogSurface: "#18181D",
222
+ thinkingBorder: "#3E3E45",
223
+ dimSeparator: "#57575F",
224
+ },
225
+ },
226
+ {
227
+ name: "Catppuccin Frappe",
228
+ colors: {
229
+ primary: "#8CAAEE",
230
+ planMode: "#CA9EE6",
231
+ selection: "#A6D189",
232
+ thinking: "#CA9EE6",
233
+ success: "#A6D189",
234
+ error: "#E78284",
235
+ info: "#85C1DC",
236
+ background: "#232634",
237
+ surface: "#303446",
238
+ dialogSurface: "#1E2030",
239
+ thinkingBorder: "#51576D",
240
+ dimSeparator: "#626880",
241
+ },
242
+ },
243
+ {
244
+ name: "Vercel Dark",
245
+ colors: {
246
+ primary: "#8B5CF6",
247
+ planMode: "#EC4899",
248
+ selection: "#6366F1",
249
+ thinking: "#EC4899",
250
+ success: "#10B981",
251
+ error: "#EF4444",
252
+ info: "#3B82F6",
253
+ background: "#030712",
254
+ surface: "#111827",
255
+ dialogSurface: "#060C18",
256
+ thinkingBorder: "#1F2937",
257
+ dimSeparator: "#374151",
258
+ },
259
+ },
260
+ {
261
+ name: "Material Ocean",
262
+ colors: {
263
+ primary: "#82AAFF",
264
+ planMode: "#C792EA",
265
+ selection: "#717CB4",
266
+ thinking: "#C792EA",
267
+ success: "#C3E88D",
268
+ error: "#FF5370",
269
+ info: "#89DDFF",
270
+ background: "#0F111A",
271
+ surface: "#1A1C2A",
272
+ dialogSurface: "#090B16",
273
+ thinkingBorder: "#3B3F5C",
274
+ dimSeparator: "#4B5178",
275
+ },
276
+ },
277
+ {
278
+ name: "Dusk",
279
+ colors: {
280
+ primary: "#C9A0DC",
281
+ planMode: "#F2B866",
282
+ selection: "#E8889A",
283
+ thinking: "#F2B866",
284
+ success: "#7ED4A6",
285
+ error: "#E25A6E",
286
+ info: "#C9A0DC",
287
+ background: "#110D16",
288
+ surface: "#1E1726",
289
+ dialogSurface: "#15101C",
290
+ thinkingBorder: "#6B5880",
291
+ dimSeparator: "#7E6E94",
292
+ },
293
+ },
294
+ {
295
+ name: "Ocean",
296
+ colors: {
297
+ primary: "#3B9ECF",
298
+ planMode: "#E0A846",
299
+ selection: "#6CC9A1",
300
+ thinking: "#E0A846",
301
+ success: "#A8D45F",
302
+ error: "#D94F4F",
303
+ info: "#3B9ECF",
304
+ background: "#0B1218",
305
+ surface: "#152028",
306
+ dialogSurface: "#0F181F",
307
+ thinkingBorder: "#4A6A7A",
308
+ dimSeparator: "#5E7888",
309
+ },
310
+ },
311
+ {
312
+ name: "Soft Midnight",
313
+ colors: {
314
+ primary: "#60A5FA",
315
+ planMode: "#F9A8D4",
316
+ selection: "#93C5FD",
317
+ thinking: "#F9A8D4",
318
+ success: "#6EE7B7",
319
+ error: "#FCA5A5",
320
+ info: "#67E8F9",
321
+ background: "#0F172A",
322
+ surface: "#1E293B",
323
+ dialogSurface: "#0C1322",
324
+ thinkingBorder: "#334155",
325
+ dimSeparator: "#475569",
326
+ },
327
+ },
328
+ {
329
+ name: "Minimal Dark",
330
+ colors: {
331
+ primary: "#A78BFA",
332
+ planMode: "#38BDF8",
333
+ selection: "#818CF8",
334
+ thinking: "#38BDF8",
335
+ success: "#34D399",
336
+ error: "#FB7185",
337
+ info: "#22D3EE",
338
+ background: "#09090B",
339
+ surface: "#18181B",
340
+ dialogSurface: "#0C0C0F",
341
+ thinkingBorder: "#3F3F46",
342
+ dimSeparator: "#52525B",
343
+ },
344
+ },
345
+ {
346
+ name: "Solarized Dark",
347
+ colors: {
348
+ primary: "#268BD2",
349
+ planMode: "#6C71C4",
350
+ selection: "#6BC0CC",
351
+ thinking: "#6C71C4",
352
+ success: "#859900",
353
+ error: "#DC322F",
354
+ info: "#2AA198",
355
+ background: "#002B36",
356
+ surface: "#073642",
357
+ dialogSurface: "#00212B",
358
+ thinkingBorder: "#586E75",
359
+ dimSeparator: "#657B83",
360
+ },
361
+ },
362
+ {
363
+ name: "Gruvbox Dark",
364
+ colors: {
365
+ primary: "#FABD2F",
366
+ planMode: "#D3869B",
367
+ selection: "#FABD2F",
368
+ thinking: "#D3869B",
369
+ success: "#B8BB26",
370
+ error: "#FB4934",
371
+ info: "#83A598",
372
+ background: "#282828",
373
+ surface: "#3C3836",
374
+ dialogSurface: "#1D2021",
375
+ thinkingBorder: "#504945",
376
+ dimSeparator: "#665C54",
377
+ },
378
+ },
379
+ {
380
+ name: "Rosé Pine",
381
+ colors: {
382
+ primary: "#EBBCBA",
383
+ planMode: "#C4A7E7",
384
+ selection: "#C4A7E7",
385
+ thinking: "#C4A7E7",
386
+ success: "#31748F",
387
+ error: "#EB6F92",
388
+ info: "#9CCFD8",
389
+ background: "#191724",
390
+ surface: "#1F1D2E",
391
+ dialogSurface: "#16141F",
392
+ thinkingBorder: "#26233A",
393
+ dimSeparator: "#524F67",
394
+ },
395
+ },
396
+ {
397
+ name: "Rosé Pine Moon",
398
+ colors: {
399
+ primary: "#EA9A97",
400
+ planMode: "#C4A7E7",
401
+ selection: "#EA9A97",
402
+ thinking: "#C4A7E7",
403
+ success: "#3E8FB0",
404
+ error: "#EB6F92",
405
+ info: "#9CCFD8",
406
+ background: "#232136",
407
+ surface: "#2A273F",
408
+ dialogSurface: "#1E1C31",
409
+ thinkingBorder: "#393552",
410
+ dimSeparator: "#56526E",
411
+ },
412
+ },
413
+ {
414
+ name: "Kanagawa",
415
+ colors: {
416
+ primary: "#DCD7BA",
417
+ planMode: "#957FB8",
418
+ selection: "#7E9CD8",
419
+ thinking: "#957FB8",
420
+ success: "#76946A",
421
+ error: "#C34043",
422
+ info: "#7E9CD8",
423
+ background: "#1F1F28",
424
+ surface: "#2A2A37",
425
+ dialogSurface: "#16161D",
426
+ thinkingBorder: "#54546D",
427
+ dimSeparator: "#727169",
428
+ },
429
+ },
430
+ {
431
+ name: "Everforest Dark",
432
+ colors: {
433
+ primary: "#A7C080",
434
+ planMode: "#D699B6",
435
+ selection: "#A7C080",
436
+ thinking: "#D699B6",
437
+ success: "#83C092",
438
+ error: "#E67E80",
439
+ info: "#7FBBB3",
440
+ background: "#2D353B",
441
+ surface: "#343F44",
442
+ dialogSurface: "#272E33",
443
+ thinkingBorder: "#4F585E",
444
+ dimSeparator: "#859289",
445
+ },
446
+ },
447
+ {
448
+ name: "Ayu Dark",
449
+ colors: {
450
+ primary: "#E6B450",
451
+ planMode: "#D2A6FF",
452
+ selection: "#73B8FF",
453
+ thinking: "#D2A6FF",
454
+ success: "#7FD962",
455
+ error: "#D95757",
456
+ info: "#59C2FF",
457
+ background: "#0B0E14",
458
+ surface: "#11151C",
459
+ dialogSurface: "#080A0F",
460
+ thinkingBorder: "#2D3640",
461
+ dimSeparator: "#475266",
462
+ },
463
+ },
464
+ {
465
+ name: "GitHub Dark",
466
+ colors: {
467
+ primary: "#79C0FF",
468
+ planMode: "#D2A8FF",
469
+ selection: "#79C0FF",
470
+ thinking: "#D2A8FF",
471
+ success: "#56D364",
472
+ error: "#F85149",
473
+ info: "#58A6FF",
474
+ background: "#0D1117",
475
+ surface: "#161B22",
476
+ dialogSurface: "#090D13",
477
+ thinkingBorder: "#30363D",
478
+ dimSeparator: "#484F58",
479
+ },
480
+ },
481
+ {
482
+ name: "Palenight",
483
+ colors: {
484
+ primary: "#82AAFF",
485
+ planMode: "#C792EA",
486
+ selection: "#82AAFF",
487
+ thinking: "#C792EA",
488
+ success: "#C3E88D",
489
+ error: "#FF5370",
490
+ info: "#89DDFF",
491
+ background: "#292D3E",
492
+ surface: "#343850",
493
+ dialogSurface: "#232738",
494
+ thinkingBorder: "#4E5272",
495
+ dimSeparator: "#676E95",
496
+ },
497
+ },
498
+ {
499
+ name: "Vesper",
500
+ colors: {
501
+ primary: "#FFC799",
502
+ planMode: "#A78BFA",
503
+ selection: "#FFC799",
504
+ thinking: "#A78BFA",
505
+ success: "#6EE7B7",
506
+ error: "#EF4444",
507
+ info: "#FFC799",
508
+ background: "#101010",
509
+ surface: "#1C1C1C",
510
+ dialogSurface: "#0C0C0C",
511
+ thinkingBorder: "#333333",
512
+ dimSeparator: "#505050",
513
+ },
514
+ },
515
+ {
516
+ name: "Poimandres",
517
+ colors: {
518
+ primary: "#ADD7FF",
519
+ planMode: "#A6ACCD",
520
+ selection: "#ADD7FF",
521
+ thinking: "#A6ACCD",
522
+ success: "#5DE4C7",
523
+ error: "#D0679D",
524
+ info: "#89DDFF",
525
+ background: "#1B1E28",
526
+ surface: "#252B37",
527
+ dialogSurface: "#161922",
528
+ thinkingBorder: "#3B4058",
529
+ dimSeparator: "#506477",
530
+ },
531
+ },
532
+ {
533
+ name: "Moonlight",
534
+ colors: {
535
+ primary: "#82AAFF",
536
+ planMode: "#C099FF",
537
+ selection: "#C099FF",
538
+ thinking: "#C099FF",
539
+ success: "#C3E88D",
540
+ error: "#FF757F",
541
+ info: "#77E0C6",
542
+ background: "#1E2030",
543
+ surface: "#2B2F44",
544
+ dialogSurface: "#191B28",
545
+ thinkingBorder: "#3E4265",
546
+ dimSeparator: "#5B5E7A",
547
+ },
548
+ },
549
+ {
550
+ name: "Vitesse Dark",
551
+ colors: {
552
+ primary: "#4FC1FF",
553
+ planMode: "#C186E0",
554
+ selection: "#4FC1FF",
555
+ thinking: "#C186E0",
556
+ success: "#80C97F",
557
+ error: "#E45649",
558
+ info: "#4FC1FF",
559
+ background: "#121212",
560
+ surface: "#1E1E1E",
561
+ dialogSurface: "#0E0E0E",
562
+ thinkingBorder: "#333333",
563
+ dimSeparator: "#555555",
564
+ },
565
+ },
566
+ ];
567
+
568
+ export const DEFAULT_THEME = THEMES.find((t) => t.name === "Nightfox")!;
@@ -0,0 +1,11 @@
1
+ export type SessionSummary = {
2
+ id: string;
3
+ title: string;
4
+ createdAt: string;
5
+ };
6
+
7
+ export type SessionRecord = SessionSummary & {
8
+ userId: string;
9
+ updatedAt: string;
10
+ messages: unknown;
11
+ };
@@ -0,0 +1,20 @@
1
+ export {
2
+ SUPPORTED_CHAT_MODELS,
3
+ DEFAULT_CHAT_MODEL_ID,
4
+ findSupportedChatModel,
5
+ type ModelPricing,
6
+ type SupportedProvider,
7
+ type SupportedChatModel,
8
+ type SupportedChatModelId,
9
+ } from "./models";
10
+
11
+ export {
12
+ Mode,
13
+ modeSchema,
14
+ toolInputSchemas,
15
+ getToolContracts,
16
+ type ToolContracts,
17
+ type ModeType,
18
+ } from "./schemas";
19
+
20
+ export type { SessionSummary, SessionRecord } from "./api-types";
@@ -0,0 +1,72 @@
1
+ export type ModelPricing = {
2
+ inputUsdPerMillionTokens: number;
3
+ outputUsdPerMillionTokens: number;
4
+ };
5
+
6
+ export type SupportedProvider = "anthropic" | "openai";
7
+
8
+ type SupportedChatModelDefinition = {
9
+ id: string;
10
+ provider: SupportedProvider;
11
+ pricing: ModelPricing;
12
+ };
13
+
14
+ export const SUPPORTED_CHAT_MODELS = [
15
+ {
16
+ id: "claude-sonnet-4-6",
17
+ provider: "anthropic",
18
+ pricing: {
19
+ inputUsdPerMillionTokens: 3,
20
+ outputUsdPerMillionTokens: 15,
21
+ },
22
+ },
23
+ {
24
+ id: "claude-haiku-4-5",
25
+ provider: "anthropic",
26
+ pricing: {
27
+ inputUsdPerMillionTokens: 1,
28
+ outputUsdPerMillionTokens: 5,
29
+ },
30
+ },
31
+ {
32
+ id: "claude-opus-4-6",
33
+ provider: "anthropic",
34
+ pricing: {
35
+ inputUsdPerMillionTokens: 5,
36
+ outputUsdPerMillionTokens: 25,
37
+ },
38
+ },
39
+ {
40
+ id: "gpt-5.4",
41
+ provider: "openai",
42
+ pricing: {
43
+ inputUsdPerMillionTokens: 2.5,
44
+ outputUsdPerMillionTokens: 15,
45
+ },
46
+ },
47
+ {
48
+ id: "gpt-5.4-mini",
49
+ provider: "openai",
50
+ pricing: {
51
+ inputUsdPerMillionTokens: 0.75,
52
+ outputUsdPerMillionTokens: 4.5,
53
+ },
54
+ },
55
+ {
56
+ id: "gpt-5.4-nano",
57
+ provider: "openai",
58
+ pricing: {
59
+ inputUsdPerMillionTokens: 0.2,
60
+ outputUsdPerMillionTokens: 1.25,
61
+ },
62
+ },
63
+ ] as const satisfies readonly SupportedChatModelDefinition[];
64
+
65
+ export type SupportedChatModel = (typeof SUPPORTED_CHAT_MODELS)[number];
66
+ export type SupportedChatModelId = SupportedChatModel["id"];
67
+
68
+ export function findSupportedChatModel(modelId: string) {
69
+ return SUPPORTED_CHAT_MODELS.find((model) => model.id === modelId);
70
+ }
71
+
72
+ export const DEFAULT_CHAT_MODEL_ID: SupportedChatModelId = "claude-opus-4-6";