| 1 | #nullable enable |
| 2 | |
| 3 | namespace CascadeIDE.Services; |
| 4 | |
| 5 | /// <remarks>TOML v2: <c>[[command]]</c> — якорь <c>command_id</c>; melody — поля на команде; slash — <c>[[command.form.slash]]</c>.</remarks> |
| 6 | internal sealed class CommandToml |
| 7 | { |
| 8 | public string? CommandId { get; set; } |
| 9 | public bool? Enabled { get; set; } |
| 10 | public string? SlashGroup { get; set; } |
| 11 | |
| 12 | // Flat melody на [[command]] (предпочтительная раскладка; legacy — [command.melody]) |
| 13 | public string? MelodySlug { get; set; } |
| 14 | public string? MelodyShape { get; set; } |
| 15 | public bool? MelodyShowUsageHintIfBareSlug { get; set; } |
| 16 | public string? MelodyTailSignature { get; set; } |
| 17 | public string? MelodyWireClass { get; set; } |
| 18 | public string? MelodyChordCommit { get; set; } |
| 19 | public string? MelodyPaletteHintSlug { get; set; } |
| 20 | public string? MelodyPaletteUsageHint { get; set; } |
| 21 | public string? MelodyPaletteUsageCategory { get; set; } |
| 22 | |
| 23 | /// <summary>Legacy: <c>[command.melody]</c> / <c>[command.form.melody]</c>.</summary> |
| 24 | public MelodyFormToml? Melody { get; set; } |
| 25 | |
| 26 | public CommandFormToml? Form { get; set; } |
| 27 | |
| 28 | /// <summary>Legacy: <c>[[command.slash]]</c>.</summary> |
| 29 | public List<SlashFormToml>? Slash { get; set; } |
| 30 | } |
| 31 | |
| 32 | internal sealed class CommandFormToml |
| 33 | { |
| 34 | public MelodyFormToml? Melody { get; set; } |
| 35 | public List<SlashFormToml>? Slash { get; set; } |
| 36 | } |
| 37 | |
| 38 | /// <remarks>Форма <c>c:slug</c> (вложенная или плоские поля на <see cref="CommandToml"/>).</remarks> |
| 39 | internal sealed class MelodyFormToml |
| 40 | { |
| 41 | public string? Slug { get; set; } |
| 42 | public string? Shape { get; set; } |
| 43 | public bool? ShowUsageHintIfBareSlug { get; set; } |
| 44 | public string? TailSignature { get; set; } |
| 45 | public string? WireClass { get; set; } |
| 46 | public string? ChordCommit { get; set; } |
| 47 | public string? PaletteHintSlug { get; set; } |
| 48 | public string? PaletteUsageHint { get; set; } |
| 49 | public string? PaletteUsageCategory { get; set; } |
| 50 | } |
| 51 | |
| 52 | /// <remarks>Форма <c>/intent action</c> — <c>[[command.form.slash]]</c>.</remarks> |
| 53 | internal sealed class SlashFormToml |
| 54 | { |
| 55 | public bool? Enabled { get; set; } |
| 56 | public string? Path { get; set; } |
| 57 | public string? Help { get; set; } |
| 58 | public string? Group { get; set; } |
| 59 | public string? Kind { get; set; } |
| 60 | public SlashStaticArgsToml? Args { get; set; } |
| 61 | public string? MfdPage { get; set; } |
| 62 | public string? PrimarySurface { get; set; } |
| 63 | /// <summary><c>workspace_files</c> — динамические подсказки файлов после пробела (ADR 0125).</summary> |
| 64 | public string? Completion { get; set; } |
| 65 | /// <summary>Обработчик локального отчёта при <c>kind=report</c> (см. <see cref="Chat.ChatSlashReportHandlers"/>).</summary> |
| 66 | public string? ReportHandler { get; set; } |
| 67 | /// <summary>Обработчик Intercom при <c>kind=intercom</c> (см. <see cref="Chat.ChatSlashIntercomHandlers"/>).</summary> |
| 68 | public string? IntercomHandler { get; set; } |
| 69 | /// <summary><c>self</c> (по умолчанию) или <c>channel</c> — видимость ответа слэша в ленте (ADR 0119).</summary> |
| 70 | public string? Audience { get; set; } |
| 71 | /// <summary>После Tab/autocomplete — сразу выполнить без второго Enter (ADR 0119).</summary> |
| 72 | public bool? AutoRunOnCommit { get; set; } |
| 73 | /// <summary>При <see cref="AutoRunOnCommit"/> — только если в строке уже есть args-хвост (по умолчанию true).</summary> |
| 74 | public bool? AutoRunRequiresArgs { get; set; } |
| 75 | /// <summary>Явно: autocomplete должен оставить хвост для аргументов (иначе — эвристика из каталога).</summary> |
| 76 | public bool? RequiresArgTail { get; set; } |
| 77 | /// <summary><c>none</c> | <c>optional</c> | <c>required</c> — режим хвоста после пути (ADR 0150).</summary> |
| 78 | public string? ArgTail { get; set; } |
| 79 | /// <summary>Slash domain (ADR 0154).</summary> |
| 80 | public string? Domain { get; set; } |
| 81 | /// <summary>Slash object (ADR 0154).</summary> |
| 82 | public string? Object { get; set; } |
| 83 | /// <summary>Slash intent (ADR 0154).</summary> |
| 84 | public string? Intent { get; set; } |
| 85 | /// <summary><c>canonical</c> | <c>alias</c> (ADR 0154).</summary> |
| 86 | public string? PathRole { get; set; } |
| 87 | } |
| 88 | |
| 89 | /// <remarks><c>[command.form.slash.args]</c> → JSON args исполнителя.</remarks> |
| 90 | internal sealed class SlashStaticArgsToml |
| 91 | { |
| 92 | public string? Page { get; set; } |
| 93 | public string? Surface { get; set; } |
| 94 | public string? Level { get; set; } |
| 95 | } |
| 96 | |