berget 1.3.1 → 2.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 (67) hide show
  1. package/.env.example +5 -0
  2. package/.github/workflows/publish.yml +56 -0
  3. package/.github/workflows/test.yml +38 -0
  4. package/AGENTS.md +184 -0
  5. package/README.md +177 -38
  6. package/TODO.md +2 -0
  7. package/blog-post.md +176 -0
  8. package/dist/index.js +11 -8
  9. package/dist/package.json +14 -3
  10. package/dist/src/commands/api-keys.js +4 -2
  11. package/dist/src/commands/chat.js +182 -23
  12. package/dist/src/commands/code.js +1424 -0
  13. package/dist/src/commands/index.js +2 -0
  14. package/dist/src/constants/command-structure.js +12 -0
  15. package/dist/src/schemas/opencode-schema.json +1121 -0
  16. package/dist/src/services/chat-service.js +10 -10
  17. package/dist/src/services/cluster-service.js +1 -1
  18. package/dist/src/utils/default-api-key.js +2 -2
  19. package/dist/src/utils/env-manager.js +86 -0
  20. package/dist/src/utils/error-handler.js +10 -3
  21. package/dist/src/utils/markdown-renderer.js +4 -4
  22. package/dist/src/utils/opencode-validator.js +122 -0
  23. package/dist/src/utils/token-manager.js +2 -2
  24. package/dist/tests/commands/chat.test.js +109 -0
  25. package/dist/tests/commands/code.test.js +414 -0
  26. package/dist/tests/utils/env-manager.test.js +148 -0
  27. package/dist/tests/utils/opencode-validator.test.js +103 -0
  28. package/dist/vitest.config.js +9 -0
  29. package/index.ts +67 -32
  30. package/opencode.json +182 -0
  31. package/package.json +14 -3
  32. package/src/client.ts +20 -20
  33. package/src/commands/api-keys.ts +93 -60
  34. package/src/commands/auth.ts +4 -2
  35. package/src/commands/billing.ts +6 -3
  36. package/src/commands/chat.ts +291 -97
  37. package/src/commands/clusters.ts +2 -2
  38. package/src/commands/code.ts +1696 -0
  39. package/src/commands/index.ts +2 -0
  40. package/src/commands/models.ts +3 -3
  41. package/src/commands/users.ts +2 -2
  42. package/src/constants/command-structure.ts +112 -58
  43. package/src/schemas/opencode-schema.json +991 -0
  44. package/src/services/api-key-service.ts +1 -1
  45. package/src/services/auth-service.ts +27 -25
  46. package/src/services/chat-service.ts +37 -44
  47. package/src/services/cluster-service.ts +5 -5
  48. package/src/services/collaborator-service.ts +3 -3
  49. package/src/services/flux-service.ts +2 -2
  50. package/src/services/helm-service.ts +2 -2
  51. package/src/services/kubectl-service.ts +3 -6
  52. package/src/types/api.d.ts +1032 -1010
  53. package/src/types/json.d.ts +3 -3
  54. package/src/utils/default-api-key.ts +54 -42
  55. package/src/utils/env-manager.ts +98 -0
  56. package/src/utils/error-handler.ts +24 -15
  57. package/src/utils/logger.ts +12 -12
  58. package/src/utils/markdown-renderer.ts +18 -18
  59. package/src/utils/opencode-validator.ts +134 -0
  60. package/src/utils/token-manager.ts +35 -23
  61. package/tests/commands/chat.test.ts +129 -0
  62. package/tests/commands/code.test.ts +505 -0
  63. package/tests/utils/env-manager.test.ts +199 -0
  64. package/tests/utils/opencode-validator.test.ts +118 -0
  65. package/tsconfig.json +8 -8
  66. package/vitest.config.ts +8 -0
  67. package/-27b-it +0 -0
@@ -0,0 +1,1121 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "ref": "Config",
4
+ "type": "object",
5
+ "properties": {
6
+ "$schema": {
7
+ "description": "JSON schema reference for configuration validation",
8
+ "type": "string"
9
+ },
10
+ "theme": {
11
+ "description": "Theme name to use for the interface",
12
+ "type": "string"
13
+ },
14
+ "keybinds": {
15
+ "description": "Custom keybind configurations",
16
+ "ref": "KeybindsConfig",
17
+ "type": "object",
18
+ "properties": {
19
+ "leader": {
20
+ "description": "Leader key for keybind combinations\n\ndefault: `ctrl+x`",
21
+ "default": "ctrl+x",
22
+ "type": "string",
23
+ "examples": [
24
+ "ctrl+x"
25
+ ]
26
+ },
27
+ "app_exit": {
28
+ "description": "Exit the application\n\ndefault: `ctrl+c,ctrl+d,<leader>q`",
29
+ "default": "ctrl+c,ctrl+d,<leader>q",
30
+ "type": "string",
31
+ "examples": [
32
+ "ctrl+c,ctrl+d,<leader>q"
33
+ ]
34
+ },
35
+ "editor_open": {
36
+ "description": "Open external editor\n\ndefault: `<leader>e`",
37
+ "default": "<leader>e",
38
+ "type": "string",
39
+ "examples": [
40
+ "<leader>e"
41
+ ]
42
+ },
43
+ "theme_list": {
44
+ "description": "List available themes\n\ndefault: `<leader>t`",
45
+ "default": "<leader>t",
46
+ "type": "string",
47
+ "examples": [
48
+ "<leader>t"
49
+ ]
50
+ },
51
+ "sidebar_toggle": {
52
+ "description": "Toggle sidebar\n\ndefault: `<leader>b`",
53
+ "default": "<leader>b",
54
+ "type": "string",
55
+ "examples": [
56
+ "<leader>b"
57
+ ]
58
+ },
59
+ "status_view": {
60
+ "description": "View status\n\ndefault: `<leader>s`",
61
+ "default": "<leader>s",
62
+ "type": "string",
63
+ "examples": [
64
+ "<leader>s"
65
+ ]
66
+ },
67
+ "session_export": {
68
+ "description": "Export session to editor\n\ndefault: `<leader>x`",
69
+ "default": "<leader>x",
70
+ "type": "string",
71
+ "examples": [
72
+ "<leader>x"
73
+ ]
74
+ },
75
+ "session_new": {
76
+ "description": "Create a new session\n\ndefault: `<leader>n`",
77
+ "default": "<leader>n",
78
+ "type": "string",
79
+ "examples": [
80
+ "<leader>n"
81
+ ]
82
+ },
83
+ "session_list": {
84
+ "description": "List all sessions\n\ndefault: `<leader>l`",
85
+ "default": "<leader>l",
86
+ "type": "string",
87
+ "examples": [
88
+ "<leader>l"
89
+ ]
90
+ },
91
+ "session_timeline": {
92
+ "description": "Show session timeline\n\ndefault: `<leader>g`",
93
+ "default": "<leader>g",
94
+ "type": "string",
95
+ "examples": [
96
+ "<leader>g"
97
+ ]
98
+ },
99
+ "session_share": {
100
+ "description": "Share current session\n\ndefault: `none`",
101
+ "default": "none",
102
+ "type": "string",
103
+ "examples": [
104
+ "none"
105
+ ]
106
+ },
107
+ "session_unshare": {
108
+ "description": "Unshare current session\n\ndefault: `none`",
109
+ "default": "none",
110
+ "type": "string",
111
+ "examples": [
112
+ "none"
113
+ ]
114
+ },
115
+ "session_interrupt": {
116
+ "description": "Interrupt current session\n\ndefault: `escape`",
117
+ "default": "escape",
118
+ "type": "string",
119
+ "examples": [
120
+ "escape"
121
+ ]
122
+ },
123
+ "session_compact": {
124
+ "description": "Compact the session\n\ndefault: `<leader>c`",
125
+ "default": "<leader>c",
126
+ "type": "string",
127
+ "examples": [
128
+ "<leader>c"
129
+ ]
130
+ },
131
+ "messages_page_up": {
132
+ "description": "Scroll messages up by one page\n\ndefault: `pageup`",
133
+ "default": "pageup",
134
+ "type": "string",
135
+ "examples": [
136
+ "pageup"
137
+ ]
138
+ },
139
+ "messages_page_down": {
140
+ "description": "Scroll messages down by one page\n\ndefault: `pagedown`",
141
+ "default": "pagedown",
142
+ "type": "string",
143
+ "examples": [
144
+ "pagedown"
145
+ ]
146
+ },
147
+ "messages_half_page_up": {
148
+ "description": "Scroll messages up by half page\n\ndefault: `ctrl+alt+u`",
149
+ "default": "ctrl+alt+u",
150
+ "type": "string",
151
+ "examples": [
152
+ "ctrl+alt+u"
153
+ ]
154
+ },
155
+ "messages_half_page_down": {
156
+ "description": "Scroll messages down by half page\n\ndefault: `ctrl+alt+d`",
157
+ "default": "ctrl+alt+d",
158
+ "type": "string",
159
+ "examples": [
160
+ "ctrl+alt+d"
161
+ ]
162
+ },
163
+ "messages_first": {
164
+ "description": "Navigate to first message\n\ndefault: `ctrl+g,home`",
165
+ "default": "ctrl+g,home",
166
+ "type": "string",
167
+ "examples": [
168
+ "ctrl+g,home"
169
+ ]
170
+ },
171
+ "messages_last": {
172
+ "description": "Navigate to last message\n\ndefault: `ctrl+alt+g,end`",
173
+ "default": "ctrl+alt+g,end",
174
+ "type": "string",
175
+ "examples": [
176
+ "ctrl+alt+g,end"
177
+ ]
178
+ },
179
+ "messages_copy": {
180
+ "description": "Copy message\n\ndefault: `<leader>y`",
181
+ "default": "<leader>y",
182
+ "type": "string",
183
+ "examples": [
184
+ "<leader>y"
185
+ ]
186
+ },
187
+ "messages_undo": {
188
+ "description": "Undo message\n\ndefault: `<leader>u`",
189
+ "default": "<leader>u",
190
+ "type": "string",
191
+ "examples": [
192
+ "<leader>u"
193
+ ]
194
+ },
195
+ "messages_redo": {
196
+ "description": "Redo message\n\ndefault: `<leader>r`",
197
+ "default": "<leader>r",
198
+ "type": "string",
199
+ "examples": [
200
+ "<leader>r"
201
+ ]
202
+ },
203
+ "messages_toggle_conceal": {
204
+ "description": "Toggle code block concealment in messages\n\ndefault: `<leader>h`",
205
+ "default": "<leader>h",
206
+ "type": "string",
207
+ "examples": [
208
+ "<leader>h"
209
+ ]
210
+ },
211
+ "model_list": {
212
+ "description": "List available models\n\ndefault: `<leader>m`",
213
+ "default": "<leader>m",
214
+ "type": "string",
215
+ "examples": [
216
+ "<leader>m"
217
+ ]
218
+ },
219
+ "model_cycle_recent": {
220
+ "description": "Next recently used model\n\ndefault: `f2`",
221
+ "default": "f2",
222
+ "type": "string",
223
+ "examples": [
224
+ "f2"
225
+ ]
226
+ },
227
+ "model_cycle_recent_reverse": {
228
+ "description": "Previous recently used model\n\ndefault: `shift+f2`",
229
+ "default": "shift+f2",
230
+ "type": "string",
231
+ "examples": [
232
+ "shift+f2"
233
+ ]
234
+ },
235
+ "command_list": {
236
+ "description": "List available commands\n\ndefault: `ctrl+p`",
237
+ "default": "ctrl+p",
238
+ "type": "string",
239
+ "examples": [
240
+ "ctrl+p"
241
+ ]
242
+ },
243
+ "agent_list": {
244
+ "description": "List agents\n\ndefault: `<leader>a`",
245
+ "default": "<leader>a",
246
+ "type": "string",
247
+ "examples": [
248
+ "<leader>a"
249
+ ]
250
+ },
251
+ "agent_cycle": {
252
+ "description": "Next agent\n\ndefault: `tab`",
253
+ "default": "tab",
254
+ "type": "string",
255
+ "examples": [
256
+ "tab"
257
+ ]
258
+ },
259
+ "agent_cycle_reverse": {
260
+ "description": "Previous agent\n\ndefault: `shift+tab`",
261
+ "default": "shift+tab",
262
+ "type": "string",
263
+ "examples": [
264
+ "shift+tab"
265
+ ]
266
+ },
267
+ "input_clear": {
268
+ "description": "Clear input field\n\ndefault: `ctrl+c`",
269
+ "default": "ctrl+c",
270
+ "type": "string",
271
+ "examples": [
272
+ "ctrl+c"
273
+ ]
274
+ },
275
+ "input_forward_delete": {
276
+ "description": "Forward delete\n\ndefault: `ctrl+d`",
277
+ "default": "ctrl+d",
278
+ "type": "string",
279
+ "examples": [
280
+ "ctrl+d"
281
+ ]
282
+ },
283
+ "input_paste": {
284
+ "description": "Paste from clipboard\n\ndefault: `ctrl+v`",
285
+ "default": "ctrl+v",
286
+ "type": "string",
287
+ "examples": [
288
+ "ctrl+v"
289
+ ]
290
+ },
291
+ "input_submit": {
292
+ "description": "Submit input\n\ndefault: `return`",
293
+ "default": "return",
294
+ "type": "string",
295
+ "examples": [
296
+ "return"
297
+ ]
298
+ },
299
+ "input_newline": {
300
+ "description": "Insert newline in input\n\ndefault: `shift+return,ctrl+j`",
301
+ "default": "shift+return,ctrl+j",
302
+ "type": "string",
303
+ "examples": [
304
+ "shift+return,ctrl+j"
305
+ ]
306
+ },
307
+ "history_previous": {
308
+ "description": "Previous history item\n\ndefault: `up`",
309
+ "default": "up",
310
+ "type": "string",
311
+ "examples": [
312
+ "up"
313
+ ]
314
+ },
315
+ "history_next": {
316
+ "description": "Next history item\n\ndefault: `down`",
317
+ "default": "down",
318
+ "type": "string",
319
+ "examples": [
320
+ "down"
321
+ ]
322
+ },
323
+ "session_child_cycle": {
324
+ "description": "Next child session\n\ndefault: `ctrl+right`",
325
+ "default": "ctrl+right",
326
+ "type": "string",
327
+ "examples": [
328
+ "ctrl+right"
329
+ ]
330
+ },
331
+ "session_child_cycle_reverse": {
332
+ "description": "Previous child session\n\ndefault: `ctrl+left`",
333
+ "default": "ctrl+left",
334
+ "type": "string",
335
+ "examples": [
336
+ "ctrl+left"
337
+ ]
338
+ }
339
+ },
340
+ "additionalProperties": false
341
+ },
342
+ "tui": {
343
+ "description": "TUI specific settings",
344
+ "type": "object",
345
+ "properties": {
346
+ "scroll_speed": {
347
+ "description": "TUI scroll speed",
348
+ "default": 2,
349
+ "type": "number",
350
+ "minimum": 1
351
+ }
352
+ },
353
+ "additionalProperties": false
354
+ },
355
+ "command": {
356
+ "description": "Command configuration, see https://opencode.ai/docs/commands",
357
+ "type": "object",
358
+ "propertyNames": {
359
+ "type": "string"
360
+ },
361
+ "additionalProperties": {
362
+ "type": "object",
363
+ "properties": {
364
+ "template": {
365
+ "type": "string"
366
+ },
367
+ "description": {
368
+ "type": "string"
369
+ },
370
+ "agent": {
371
+ "type": "string"
372
+ },
373
+ "model": {
374
+ "type": "string"
375
+ },
376
+ "subtask": {
377
+ "type": "boolean"
378
+ }
379
+ },
380
+ "required": [
381
+ "template"
382
+ ],
383
+ "additionalProperties": false
384
+ }
385
+ },
386
+ "watcher": {
387
+ "type": "object",
388
+ "properties": {
389
+ "ignore": {
390
+ "type": "array",
391
+ "items": {
392
+ "type": "string"
393
+ }
394
+ }
395
+ },
396
+ "additionalProperties": false
397
+ },
398
+ "plugin": {
399
+ "type": "array",
400
+ "items": {
401
+ "type": "string"
402
+ }
403
+ },
404
+ "snapshot": {
405
+ "type": "boolean"
406
+ },
407
+ "share": {
408
+ "description": "Control sharing behavior:'manual' allows manual sharing via commands, 'auto' enables automatic sharing, 'disabled' disables all sharing",
409
+ "type": "string",
410
+ "enum": [
411
+ "manual",
412
+ "auto",
413
+ "disabled"
414
+ ]
415
+ },
416
+ "autoshare": {
417
+ "description": "@deprecated Use 'share' field instead. Share newly created sessions automatically",
418
+ "type": "boolean"
419
+ },
420
+ "autoupdate": {
421
+ "description": "Automatically update to the latest version",
422
+ "type": "boolean"
423
+ },
424
+ "disabled_providers": {
425
+ "description": "Disable providers that are loaded automatically",
426
+ "type": "array",
427
+ "items": {
428
+ "type": "string"
429
+ }
430
+ },
431
+ "model": {
432
+ "description": "Model to use in the format of provider/model, eg anthropic/claude-2",
433
+ "type": "string"
434
+ },
435
+ "small_model": {
436
+ "description": "Small model to use for tasks like title generation in the format of provider/model",
437
+ "type": "string"
438
+ },
439
+ "username": {
440
+ "description": "Custom username to display in conversations instead of system username",
441
+ "type": "string"
442
+ },
443
+ "mode": {
444
+ "description": "@deprecated Use `agent` field instead.",
445
+ "type": "object",
446
+ "additionalProperties": {
447
+ "ref": "AgentConfig",
448
+ "type": "object",
449
+ "properties": {
450
+ "model": {
451
+ "type": "string"
452
+ },
453
+ "temperature": {
454
+ "type": "number"
455
+ },
456
+ "top_p": {
457
+ "type": "number"
458
+ },
459
+ "prompt": {
460
+ "type": "string"
461
+ },
462
+ "tools": {
463
+ "type": "object",
464
+ "propertyNames": {
465
+ "type": "string"
466
+ },
467
+ "additionalProperties": {
468
+ "type": "boolean"
469
+ }
470
+ },
471
+ "disable": {
472
+ "type": "boolean"
473
+ },
474
+ "description": {
475
+ "description": "Description of when to use the agent",
476
+ "type": "string"
477
+ },
478
+ "mode": {
479
+ "enum": ["subagent", "primary", "all"]
480
+ },
481
+ "permission": {
482
+ "type": "object",
483
+ "properties": {
484
+ "edit": {
485
+ "enum": ["ask", "allow", "deny"]
486
+ },
487
+ "bash": {
488
+ "anyOf": [
489
+ {
490
+ "enum": ["ask", "allow", "deny"]
491
+ },
492
+ {
493
+ "type": "object",
494
+ "propertyNames": {
495
+ "type": "string"
496
+ },
497
+ "additionalProperties": {
498
+ "enum": ["ask", "allow", "deny"]
499
+ }
500
+ }
501
+ ]
502
+ },
503
+ "webfetch": {
504
+ "enum": ["ask", "allow", "deny"]
505
+ }
506
+ },
507
+ "additionalProperties": false
508
+ }
509
+ },
510
+ "additionalProperties": true
511
+ }
512
+ },
513
+ "agent": {
514
+ "description": "Agent configuration, see https://opencode.ai/docs/agent",
515
+ "type": "object",
516
+ "additionalProperties": {
517
+ "ref": "AgentConfig",
518
+ "type": "object",
519
+ "properties": {
520
+ "model": {
521
+ "type": "string"
522
+ },
523
+ "temperature": {
524
+ "type": "number"
525
+ },
526
+ "top_p": {
527
+ "type": "number"
528
+ },
529
+ "prompt": {
530
+ "type": "string"
531
+ },
532
+ "tools": {
533
+ "type": "object",
534
+ "propertyNames": {
535
+ "type": "string"
536
+ },
537
+ "additionalProperties": {
538
+ "type": "boolean"
539
+ }
540
+ },
541
+ "disable": {
542
+ "type": "boolean"
543
+ },
544
+ "description": {
545
+ "description": "Description of when to use the agent",
546
+ "type": "string"
547
+ },
548
+ "mode": {
549
+ "enum": ["subagent", "primary", "all"]
550
+ },
551
+ "permission": {
552
+ "type": "object",
553
+ "properties": {
554
+ "edit": {
555
+ "enum": ["ask", "allow", "deny"]
556
+ },
557
+ "bash": {
558
+ "anyOf": [
559
+ {
560
+ "enum": ["ask", "allow", "deny"]
561
+ },
562
+ {
563
+ "type": "object",
564
+ "propertyNames": {
565
+ "type": "string"
566
+ },
567
+ "additionalProperties": {
568
+ "enum": ["ask", "allow", "deny"]
569
+ }
570
+ }
571
+ ]
572
+ },
573
+ "webfetch": {
574
+ "enum": ["ask", "allow", "deny"]
575
+ }
576
+ },
577
+ "additionalProperties": false
578
+ }
579
+ },
580
+ "additionalProperties": true
581
+ }
582
+ },
583
+ "provider": {
584
+ "description": "Custom provider configurations and model overrides",
585
+ "type": "object",
586
+ "propertyNames": {
587
+ "type": "string"
588
+ },
589
+ "additionalProperties": {
590
+ "type": "object",
591
+ "properties": {
592
+ "api": {
593
+ "type": "string"
594
+ },
595
+ "name": {
596
+ "type": "string"
597
+ },
598
+ "env": {
599
+ "type": "array",
600
+ "items": {
601
+ "type": "string"
602
+ }
603
+ },
604
+ "id": {
605
+ "type": "string"
606
+ },
607
+ "npm": {
608
+ "type": "string"
609
+ },
610
+ "models": {
611
+ "type": "object",
612
+ "propertyNames": {
613
+ "type": "string"
614
+ },
615
+ "additionalProperties": {
616
+ "type": "object",
617
+ "properties": {
618
+ "id": {
619
+ "type": "string"
620
+ },
621
+ "name": {
622
+ "type": "string"
623
+ },
624
+ "release_date": {
625
+ "type": "string"
626
+ },
627
+ "attachment": {
628
+ "type": "boolean"
629
+ },
630
+ "reasoning": {
631
+ "type": "boolean"
632
+ },
633
+ "temperature": {
634
+ "type": "boolean"
635
+ },
636
+ "tool_call": {
637
+ "type": "boolean"
638
+ },
639
+ "cost": {
640
+ "type": "object",
641
+ "properties": {
642
+ "input": {
643
+ "type": "number"
644
+ },
645
+ "output": {
646
+ "type": "number"
647
+ },
648
+ "cache_read": {
649
+ "type": "number"
650
+ },
651
+ "cache_write": {
652
+ "type": "number"
653
+ }
654
+ },
655
+ "required": [
656
+ "input",
657
+ "output"
658
+ ],
659
+ "additionalProperties": false
660
+ },
661
+ "limit": {
662
+ "type": "object",
663
+ "properties": {
664
+ "context": {
665
+ "type": "number"
666
+ },
667
+ "output": {
668
+ "type": "number"
669
+ }
670
+ },
671
+ "required": [
672
+ "context",
673
+ "output"
674
+ ],
675
+ "additionalProperties": false
676
+ },
677
+ "modalities": {
678
+ "type": "object",
679
+ "properties": {
680
+ "input": {
681
+ "type": "array",
682
+ "items": {
683
+ "type": "string",
684
+ "enum": [
685
+ "text",
686
+ "audio",
687
+ "image",
688
+ "video",
689
+ "pdf"
690
+ ]
691
+ }
692
+ },
693
+ "output": {
694
+ "type": "array",
695
+ "items": {
696
+ "type": "string",
697
+ "enum": [
698
+ "text",
699
+ "audio",
700
+ "image",
701
+ "video",
702
+ "pdf"
703
+ ]
704
+ }
705
+ }
706
+ },
707
+ "required": [
708
+ "input",
709
+ "output"
710
+ ],
711
+ "additionalProperties": false
712
+ },
713
+ "experimental": {
714
+ "type": "boolean"
715
+ },
716
+ "status": {
717
+ "type": "string",
718
+ "enum": [
719
+ "alpha",
720
+ "beta",
721
+ "deprecated"
722
+ ]
723
+ },
724
+ "options": {
725
+ "type": "object",
726
+ "propertyNames": {
727
+ "type": "string"
728
+ },
729
+ "additionalProperties": {}
730
+ },
731
+ "headers": {
732
+ "type": "object",
733
+ "propertyNames": {
734
+ "type": "string"
735
+ },
736
+ "additionalProperties": {
737
+ "type": "string"
738
+ }
739
+ },
740
+ "provider": {
741
+ "type": "object",
742
+ "properties": {
743
+ "npm": {
744
+ "type": "string"
745
+ }
746
+ },
747
+ "required": [
748
+ "npm"
749
+ ],
750
+ "additionalProperties": false
751
+ }
752
+ },
753
+ "additionalProperties": false
754
+ }
755
+ },
756
+ "options": {
757
+ "type": "object",
758
+ "properties": {
759
+ "apiKey": {
760
+ "type": "string"
761
+ },
762
+ "baseURL": {
763
+ "type": "string"
764
+ },
765
+ "enterpriseUrl": {
766
+ "description": "GitHub Enterprise URL for copilot authentication",
767
+ "type": "string"
768
+ },
769
+ "timeout": {
770
+ "description": "Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout.",
771
+ "anyOf": [
772
+ {
773
+ "description": "Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout.",
774
+ "type": "integer",
775
+ "exclusiveMinimum": 0,
776
+ "maximum": 9007199254740991
777
+ },
778
+ {
779
+ "description": "Disable timeout for this provider entirely.",
780
+ "type": "boolean",
781
+ "const": false
782
+ }
783
+ ]
784
+ }
785
+ },
786
+ "additionalProperties": {}
787
+ }
788
+ },
789
+ "additionalProperties": false
790
+ }
791
+ },
792
+ "mcp": {
793
+ "description": "MCP (Model Context Protocol) server configurations",
794
+ "type": "object",
795
+ "propertyNames": {
796
+ "type": "string"
797
+ },
798
+ "additionalProperties": {
799
+ "anyOf": [
800
+ {
801
+ "ref": "McpLocalConfig",
802
+ "type": "object",
803
+ "properties": {
804
+ "type": {
805
+ "description": "Type of MCP server connection",
806
+ "type": "string",
807
+ "const": "local"
808
+ },
809
+ "command": {
810
+ "description": "Command and arguments to run the MCP server",
811
+ "type": "array",
812
+ "items": {
813
+ "type": "string"
814
+ }
815
+ },
816
+ "environment": {
817
+ "description": "Environment variables to set when running the MCP server",
818
+ "type": "object",
819
+ "propertyNames": {
820
+ "type": "string"
821
+ },
822
+ "additionalProperties": {
823
+ "type": "string"
824
+ }
825
+ },
826
+ "enabled": {
827
+ "description": "Enable or disable the MCP server on startup",
828
+ "type": "boolean"
829
+ },
830
+ "timeout": {
831
+ "description": "Timeout in ms for fetching tools from the MCP server. Defaults to 5000 (5 seconds) if not specified.",
832
+ "type": "integer",
833
+ "exclusiveMinimum": 0,
834
+ "maximum": 9007199254740991
835
+ }
836
+ },
837
+ "required": [
838
+ "type",
839
+ "command"
840
+ ],
841
+ "additionalProperties": false
842
+ },
843
+ {
844
+ "ref": "McpRemoteConfig",
845
+ "type": "object",
846
+ "properties": {
847
+ "type": {
848
+ "description": "Type of MCP server connection",
849
+ "type": "string",
850
+ "const": "remote"
851
+ },
852
+ "url": {
853
+ "description": "URL of the remote MCP server",
854
+ "type": "string"
855
+ },
856
+ "enabled": {
857
+ "description": "Enable or disable the MCP server on startup",
858
+ "type": "boolean"
859
+ },
860
+ "headers": {
861
+ "description": "Headers to send with the request",
862
+ "type": "object",
863
+ "propertyNames": {
864
+ "type": "string"
865
+ },
866
+ "additionalProperties": {
867
+ "type": "string"
868
+ }
869
+ },
870
+ "timeout": {
871
+ "description": "Timeout in ms for fetching tools from the MCP server. Defaults to 5000 (5 seconds) if not specified.",
872
+ "type": "integer",
873
+ "exclusiveMinimum": 0,
874
+ "maximum": 9007199254740991
875
+ }
876
+ },
877
+ "required": [
878
+ "type",
879
+ "url"
880
+ ],
881
+ "additionalProperties": false
882
+ }
883
+ ]
884
+ }
885
+ },
886
+ "formatter": {
887
+ "type": "object",
888
+ "propertyNames": {
889
+ "type": "string"
890
+ },
891
+ "additionalProperties": {
892
+ "type": "object",
893
+ "properties": {
894
+ "disabled": {
895
+ "type": "boolean"
896
+ },
897
+ "command": {
898
+ "type": "array",
899
+ "items": {
900
+ "type": "string"
901
+ }
902
+ },
903
+ "environment": {
904
+ "type": "object",
905
+ "propertyNames": {
906
+ "type": "string"
907
+ },
908
+ "additionalProperties": {
909
+ "type": "string"
910
+ }
911
+ },
912
+ "extensions": {
913
+ "type": "array",
914
+ "items": {
915
+ "type": "string"
916
+ }
917
+ }
918
+ },
919
+ "additionalProperties": false
920
+ }
921
+ },
922
+ "lsp": {
923
+ "type": "object",
924
+ "propertyNames": {
925
+ "type": "string"
926
+ },
927
+ "additionalProperties": {
928
+ "anyOf": [
929
+ {
930
+ "type": "object",
931
+ "properties": {
932
+ "disabled": {
933
+ "type": "boolean",
934
+ "const": true
935
+ }
936
+ },
937
+ "required": [
938
+ "disabled"
939
+ ],
940
+ "additionalProperties": false
941
+ },
942
+ {
943
+ "type": "object",
944
+ "properties": {
945
+ "command": {
946
+ "type": "array",
947
+ "items": {
948
+ "type": "string"
949
+ }
950
+ },
951
+ "extensions": {
952
+ "type": "array",
953
+ "items": {
954
+ "type": "string"
955
+ }
956
+ },
957
+ "disabled": {
958
+ "type": "boolean"
959
+ },
960
+ "env": {
961
+ "type": "object",
962
+ "propertyNames": {
963
+ "type": "string"
964
+ },
965
+ "additionalProperties": {
966
+ "type": "string"
967
+ }
968
+ },
969
+ "initialization": {
970
+ "type": "object",
971
+ "propertyNames": {
972
+ "type": "string"
973
+ },
974
+ "additionalProperties": {}
975
+ }
976
+ },
977
+ "required": [
978
+ "command"
979
+ ],
980
+ "additionalProperties": false
981
+ }
982
+ ]
983
+ }
984
+ },
985
+ "instructions": {
986
+ "description": "Additional instruction files or patterns to include",
987
+ "type": "array",
988
+ "items": {
989
+ "type": "string"
990
+ }
991
+ },
992
+ "layout": {
993
+ "description": "@deprecated Always uses stretch layout.",
994
+ "ref": "LayoutConfig",
995
+ "type": "string",
996
+ "enum": [
997
+ "auto",
998
+ "stretch"
999
+ ]
1000
+ },
1001
+ "permission": {
1002
+ "type": "object",
1003
+ "properties": {
1004
+ "edit": {
1005
+ "enum": ["ask", "allow", "deny"]
1006
+ },
1007
+ "bash": {
1008
+ "anyOf": [
1009
+ {
1010
+ "enum": ["ask", "allow", "deny"]
1011
+ },
1012
+ {
1013
+ "type": "object",
1014
+ "propertyNames": {
1015
+ "type": "string"
1016
+ },
1017
+ "additionalProperties": {
1018
+ "enum": ["ask", "allow", "deny"]
1019
+ }
1020
+ }
1021
+ ]
1022
+ },
1023
+ "webfetch": {
1024
+ "enum": ["ask", "allow", "deny"]
1025
+ }
1026
+ },
1027
+ "additionalProperties": false
1028
+ },
1029
+ "tools": {
1030
+ "type": "object",
1031
+ "propertyNames": {
1032
+ "type": "string"
1033
+ },
1034
+ "additionalProperties": {
1035
+ "type": "boolean"
1036
+ }
1037
+ },
1038
+ "experimental": {
1039
+ "type": "object",
1040
+ "properties": {
1041
+ "hook": {
1042
+ "type": "object",
1043
+ "properties": {
1044
+ "file_edited": {
1045
+ "type": "object",
1046
+ "propertyNames": {
1047
+ "type": "string"
1048
+ },
1049
+ "additionalProperties": {
1050
+ "type": "array",
1051
+ "items": {
1052
+ "type": "object",
1053
+ "properties": {
1054
+ "command": {
1055
+ "type": "array",
1056
+ "items": {
1057
+ "type": "string"
1058
+ }
1059
+ },
1060
+ "environment": {
1061
+ "type": "object",
1062
+ "propertyNames": {
1063
+ "type": "string"
1064
+ },
1065
+ "additionalProperties": {
1066
+ "type": "string"
1067
+ }
1068
+ }
1069
+ },
1070
+ "required": [
1071
+ "command"
1072
+ ],
1073
+ "additionalProperties": false
1074
+ }
1075
+ }
1076
+ },
1077
+ "session_completed": {
1078
+ "type": "array",
1079
+ "items": {
1080
+ "type": "object",
1081
+ "properties": {
1082
+ "command": {
1083
+ "type": "array",
1084
+ "items": {
1085
+ "type": "string"
1086
+ }
1087
+ },
1088
+ "environment": {
1089
+ "type": "object",
1090
+ "propertyNames": {
1091
+ "type": "string"
1092
+ },
1093
+ "additionalProperties": {
1094
+ "type": "string"
1095
+ }
1096
+ }
1097
+ },
1098
+ "required": [
1099
+ "command"
1100
+ ],
1101
+ "additionalProperties": false
1102
+ }
1103
+ }
1104
+ },
1105
+ "additionalProperties": false
1106
+ },
1107
+ "chatMaxRetries": {
1108
+ "description": "Number of retries for chat completions on failure",
1109
+ "type": "number"
1110
+ },
1111
+ "disable_paste_summary": {
1112
+ "type": "boolean"
1113
+ }
1114
+ },
1115
+ "additionalProperties": false
1116
+ }
1117
+ },
1118
+ "additionalProperties": false,
1119
+ "allowComments": true,
1120
+ "allowTrailingCommas": true
1121
+ }