lv24-opencode-consilium 0.0.0-stage → 1.4.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 (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +499 -3
  3. package/README.ru.md +500 -0
  4. package/README.zh.md +188 -0
  5. package/bin/cli.js +19 -0
  6. package/bin/mcp.js +24 -0
  7. package/consilium.config.example.json +84 -0
  8. package/dist/agents.d.ts +79 -0
  9. package/dist/agents.d.ts.map +1 -0
  10. package/dist/agents.js +1051 -0
  11. package/dist/agents.js.map +1 -0
  12. package/dist/artifacts.d.ts +75 -0
  13. package/dist/artifacts.d.ts.map +1 -0
  14. package/dist/artifacts.js +464 -0
  15. package/dist/artifacts.js.map +1 -0
  16. package/dist/cli.d.ts +12 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +1392 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/compat.d.ts +160 -0
  21. package/dist/compat.d.ts.map +1 -0
  22. package/dist/compat.js +419 -0
  23. package/dist/compat.js.map +1 -0
  24. package/dist/config.d.ts +112 -0
  25. package/dist/config.d.ts.map +1 -0
  26. package/dist/config.js +728 -0
  27. package/dist/config.js.map +1 -0
  28. package/dist/consensus.d.ts +73 -0
  29. package/dist/consensus.d.ts.map +1 -0
  30. package/dist/consensus.js +273 -0
  31. package/dist/consensus.js.map +1 -0
  32. package/dist/defaults.d.ts +34 -0
  33. package/dist/defaults.d.ts.map +1 -0
  34. package/dist/defaults.js +102 -0
  35. package/dist/defaults.js.map +1 -0
  36. package/dist/doctor.d.ts +27 -0
  37. package/dist/doctor.d.ts.map +1 -0
  38. package/dist/doctor.js +798 -0
  39. package/dist/doctor.js.map +1 -0
  40. package/dist/fallback.d.ts +50 -0
  41. package/dist/fallback.d.ts.map +1 -0
  42. package/dist/fallback.js +134 -0
  43. package/dist/fallback.js.map +1 -0
  44. package/dist/git.d.ts +28 -0
  45. package/dist/git.d.ts.map +1 -0
  46. package/dist/git.js +71 -0
  47. package/dist/git.js.map +1 -0
  48. package/dist/index.d.ts +100 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +653 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/mcp.d.ts +20 -0
  53. package/dist/mcp.d.ts.map +1 -0
  54. package/dist/mcp.js +1215 -0
  55. package/dist/mcp.js.map +1 -0
  56. package/dist/models.d.ts +97 -0
  57. package/dist/models.d.ts.map +1 -0
  58. package/dist/models.js +873 -0
  59. package/dist/models.js.map +1 -0
  60. package/dist/plugin.d.ts +59 -0
  61. package/dist/plugin.d.ts.map +1 -0
  62. package/dist/plugin.js +223 -0
  63. package/dist/plugin.js.map +1 -0
  64. package/dist/presets.d.ts +27 -0
  65. package/dist/presets.d.ts.map +1 -0
  66. package/dist/presets.js +86 -0
  67. package/dist/presets.js.map +1 -0
  68. package/dist/replay.d.ts +37 -0
  69. package/dist/replay.d.ts.map +1 -0
  70. package/dist/replay.js +103 -0
  71. package/dist/replay.js.map +1 -0
  72. package/dist/report.d.ts +28 -0
  73. package/dist/report.d.ts.map +1 -0
  74. package/dist/report.js +300 -0
  75. package/dist/report.js.map +1 -0
  76. package/dist/smart-experts.d.ts +44 -0
  77. package/dist/smart-experts.d.ts.map +1 -0
  78. package/dist/smart-experts.js +242 -0
  79. package/dist/smart-experts.js.map +1 -0
  80. package/dist/stream.d.ts +50 -0
  81. package/dist/stream.d.ts.map +1 -0
  82. package/dist/stream.js +219 -0
  83. package/dist/stream.js.map +1 -0
  84. package/dist/tool-run.d.ts +49 -0
  85. package/dist/tool-run.d.ts.map +1 -0
  86. package/dist/tool-run.js +143 -0
  87. package/dist/tool-run.js.map +1 -0
  88. package/dist/types.d.ts +352 -0
  89. package/dist/types.d.ts.map +1 -0
  90. package/dist/types.js +6 -0
  91. package/dist/types.js.map +1 -0
  92. package/dist/variants.d.ts +30 -0
  93. package/dist/variants.d.ts.map +1 -0
  94. package/dist/variants.js +111 -0
  95. package/dist/variants.js.map +1 -0
  96. package/dist/verify.d.ts +33 -0
  97. package/dist/verify.d.ts.map +1 -0
  98. package/dist/verify.js +80 -0
  99. package/dist/verify.js.map +1 -0
  100. package/dist/watch.d.ts +73 -0
  101. package/dist/watch.d.ts.map +1 -0
  102. package/dist/watch.js +350 -0
  103. package/dist/watch.js.map +1 -0
  104. package/docs/session-and-plugin.md +642 -0
  105. package/package.json +90 -6
  106. package/schema/config.schema.json +100 -0
package/dist/compat.js ADDED
@@ -0,0 +1,419 @@
1
+ /**
2
+ * @fileoverview Совместимость с OpenCode V1 и V2
3
+ * @module lv24-opencode-consilium
4
+ *
5
+ * Модуль не работает с файловой системой: все функции чистые, чтобы их можно
6
+ * было покрыть тестами и переиспользовать в CLI, MCP и doctor.
7
+ *
8
+ * Правила совместимости:
9
+ * - OpenCode V2 читает V1-конфигурацию, поэтому V1-форма остаётся базовой.
10
+ * - Нативные V2-поля (`agents`, `commands`, `providers`, `permissions`,
11
+ * `mcp.servers`) в V1 не работают, поэтому писать их можно только в файл,
12
+ * который уже ведётся в нативном V2-формате.
13
+ * - Внутри одной записи агента нельзя смешивать V1-поля (`prompt`, `disable`,
14
+ * `permission`) и V2-поля (`system`, `disabled`, `permissions`).
15
+ * - `opencode run --agent` в V2 не применяет модель агента из конфигурации,
16
+ * поэтому модель всегда нужно передавать через `--model`.
17
+ */
18
+ /** Поля V1-конфигурации, которые OpenCode V2 переименовывает или игнорирует */
19
+ export const LEGACY_V1_FIELDS = [
20
+ 'theme',
21
+ 'autoupdate',
22
+ 'logLevel',
23
+ 'server',
24
+ 'subagent_depth',
25
+ 'small_model',
26
+ 'snapshot',
27
+ 'attachment'
28
+ ];
29
+ /** Проверяет, является ли значение обычным объектом */
30
+ function isRecord(value) {
31
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
32
+ }
33
+ /** Возвращает объект только для объектных значений */
34
+ function recordOf(value) {
35
+ return isRecord(value) ? value : {};
36
+ }
37
+ /** Преобразует раздел агентов в карту записей */
38
+ function agentMapOf(value, invalid) {
39
+ const result = {};
40
+ for (const [name, entry] of Object.entries(recordOf(value))) {
41
+ if (isRecord(entry)) {
42
+ result[name] = entry;
43
+ }
44
+ else {
45
+ invalid.push(name);
46
+ }
47
+ }
48
+ return result;
49
+ }
50
+ /**
51
+ * Разбирает вывод `opencode --version`.
52
+ * Понимает `opencode v2.2.6`, `2.2.6` и строки с суффиксами сборки.
53
+ */
54
+ export function parseOpenCodeVersion(raw) {
55
+ const text = typeof raw === 'string' ? raw.trim() : '';
56
+ const match = /(\d+)\.(\d+)\.(\d+)/.exec(text);
57
+ if (!match) {
58
+ return { raw: text.length > 0 ? text : null, version: null, major: null };
59
+ }
60
+ const version = `${match[1]}.${match[2]}.${match[3]}`;
61
+ const majorNumber = Number(match[1]);
62
+ return {
63
+ raw: text.length > 0 ? text : null,
64
+ version,
65
+ major: majorNumber >= 2 ? 2 : 1
66
+ };
67
+ }
68
+ /**
69
+ * Определяет формат конфигурации по набору нативных V2-ключей.
70
+ * Отсутствие маркеров означает V1-формат (он совместим с обеими версиями).
71
+ */
72
+ export function detectConfigFlavor(config) {
73
+ if (!isRecord(config))
74
+ return 'v1';
75
+ const v2TopLevel = [
76
+ 'agents',
77
+ 'commands',
78
+ 'providers',
79
+ 'permissions',
80
+ 'policies',
81
+ 'plugins',
82
+ 'snapshots',
83
+ 'media',
84
+ 'update'
85
+ ];
86
+ for (const key of v2TopLevel) {
87
+ if (key in config)
88
+ return 'v2';
89
+ }
90
+ const mcp = recordOf(config.mcp);
91
+ if (isRecord(mcp.servers))
92
+ return 'v2';
93
+ if (Array.isArray(config.skills))
94
+ return 'v2';
95
+ return 'v1';
96
+ }
97
+ /** Возвращает человекочитаемое название формата */
98
+ export function describeConfigFlavor(flavor) {
99
+ return flavor === 'v2' ? 'V2 (native)' : 'V1 (совместим с V1 и V2)';
100
+ }
101
+ /**
102
+ * Нормализует ссылку на модель.
103
+ * Поддерживает строку и расширенный объект V2 (`providerID`/`model`/`variant`).
104
+ */
105
+ export function toModelRef(value) {
106
+ if (typeof value === 'string') {
107
+ const trimmed = value.trim();
108
+ return trimmed.length > 0 ? trimmed : undefined;
109
+ }
110
+ if (!isRecord(value))
111
+ return undefined;
112
+ const provider = typeof value.providerID === 'string'
113
+ ? value.providerID
114
+ : typeof value.provider === 'string'
115
+ ? value.provider
116
+ : undefined;
117
+ const model = typeof value.model === 'string'
118
+ ? value.model
119
+ : typeof value.modelID === 'string'
120
+ ? value.modelID
121
+ : undefined;
122
+ if (provider === undefined || model === undefined)
123
+ return undefined;
124
+ if (provider.trim().length === 0 || model.trim().length === 0)
125
+ return undefined;
126
+ const variant = typeof value.variant === 'string' ? value.variant.trim() : '';
127
+ return variant.length > 0 ? `${provider}/${model}#${variant}` : `${provider}/${model}`;
128
+ }
129
+ /** Делит ссылку `provider/model#variant` на модель и вариант */
130
+ export function splitModelRef(ref) {
131
+ const hash = ref.indexOf('#');
132
+ if (hash === -1)
133
+ return { model: ref };
134
+ const variant = ref.slice(hash + 1).trim();
135
+ return variant.length > 0
136
+ ? { model: ref.slice(0, hash), variant }
137
+ : { model: ref.slice(0, hash) };
138
+ }
139
+ /** Признаки нативных V2-полей в записи агента */
140
+ const AGENT_V2_FIELDS = ['system', 'permissions', 'disabled', 'steps', 'request', 'color', 'hidden'];
141
+ /** Нормализует запись агента из opencode.json */
142
+ export function readAgentDefinition(value) {
143
+ const entry = recordOf(value);
144
+ const nativeV2 = AGENT_V2_FIELDS.some(field => field in entry);
145
+ const prompt = typeof entry.system === 'string'
146
+ ? entry.system
147
+ : typeof entry.prompt === 'string'
148
+ ? entry.prompt
149
+ : undefined;
150
+ return {
151
+ model: toModelRef(entry.model),
152
+ mode: typeof entry.mode === 'string' ? entry.mode : undefined,
153
+ disabled: entry.disabled === true || entry.disable === true,
154
+ prompt,
155
+ description: typeof entry.description === 'string' ? entry.description : undefined,
156
+ nativeV2
157
+ };
158
+ }
159
+ /**
160
+ * Читает раздел агентов из конфигурации OpenCode.
161
+ * Поддерживает V1 (`agent`), V2 (`agents`) и файлы, где есть оба раздела.
162
+ */
163
+ export function readAgentSection(config) {
164
+ const root = recordOf(config);
165
+ const invalid = [];
166
+ const v1 = agentMapOf(root.agent, invalid);
167
+ const v2 = agentMapOf(root.agents, invalid);
168
+ const flavor = detectConfigFlavor(root);
169
+ const entries = { ...v1 };
170
+ for (const [name, entry] of Object.entries(v2)) {
171
+ entries[name] = entry;
172
+ }
173
+ const duplicated = Object.keys(v1).filter(name => Object.prototype.hasOwnProperty.call(v2, name));
174
+ return {
175
+ flavor,
176
+ key: flavor === 'v2' ? 'agents' : 'agent',
177
+ entries,
178
+ duplicated,
179
+ invalid,
180
+ v1,
181
+ v2
182
+ };
183
+ }
184
+ /**
185
+ * Выбирает стиль полей по разделу: `agents` — нативный V2, `agent` — V1.
186
+ * Внутри одной записи нельзя смешивать `prompt`/`system`.
187
+ */
188
+ function pickAgentFieldStyle(section) {
189
+ return section === 'agents' ? 'v2' : 'v1';
190
+ }
191
+ /** Поля V1, которые нельзя однозначно перевести в V2 при миграции */
192
+ const MIGRATION_UNSAFE_FIELDS = ['tools', 'permission', 'temperature', 'top_p', 'maxSteps', 'max_steps'];
193
+ /** Собирает запись агента в выбранном стиле */
194
+ function buildAgentEntry(base, write, style) {
195
+ const entry = { ...base };
196
+ if (write.model !== undefined && write.model.trim().length > 0) {
197
+ entry.model = write.model.trim();
198
+ }
199
+ if (write.mode !== undefined && write.mode.trim().length > 0) {
200
+ entry.mode = write.mode.trim();
201
+ }
202
+ if (write.description !== undefined &&
203
+ write.description.trim().length > 0 &&
204
+ typeof entry.description !== 'string') {
205
+ entry.description = write.description.trim();
206
+ }
207
+ if (write.prompt !== undefined && write.prompt.trim().length > 0) {
208
+ if (style === 'v2') {
209
+ entry.system = write.prompt;
210
+ }
211
+ else {
212
+ entry.prompt = write.prompt;
213
+ }
214
+ }
215
+ // Нормализуем промпт под формат раздела: в `agents` только system, в `agent` только prompt.
216
+ if (style === 'v2') {
217
+ if (entry.system === undefined && typeof entry.prompt === 'string') {
218
+ entry.system = entry.prompt;
219
+ }
220
+ delete entry.prompt;
221
+ }
222
+ else {
223
+ if (entry.prompt === undefined && typeof entry.system === 'string') {
224
+ entry.prompt = entry.system;
225
+ }
226
+ delete entry.system;
227
+ }
228
+ // Отключение агента переносим между форматами, чтобы миграция не включала его обратно.
229
+ if (style === 'v2') {
230
+ if ('disable' in entry) {
231
+ if (entry.disable === true)
232
+ entry.disabled = true;
233
+ delete entry.disable;
234
+ }
235
+ }
236
+ else if ('disabled' in entry) {
237
+ if (entry.disabled === true)
238
+ entry.disable = true;
239
+ delete entry.disabled;
240
+ }
241
+ return entry;
242
+ }
243
+ /**
244
+ * Записывает агентов в конфигурацию OpenCode, сохраняя её формат.
245
+ *
246
+ * - В V2-файл пишем `agents` + `system`, в V1-файл — `agent` + `prompt`.
247
+ * - Если агент уже есть в обоих разделах, обновляем обе записи: иначе V2
248
+ * отдаст приоритет нативной записи и наши изменения потеряются.
249
+ * - `migrate: true` переносит управляемых агентов из `agent` в `agents`.
250
+ */
251
+ export function upsertAgents(config, definitions, options = {}) {
252
+ const root = recordOf(config);
253
+ const section = readAgentSection(root);
254
+ const flavor = options.flavor ?? section.flavor;
255
+ const migrateRequested = options.migrate === true;
256
+ const migrate = migrateRequested && flavor === 'v2';
257
+ const v1 = { ...section.v1 };
258
+ const v2 = { ...section.v2 };
259
+ const written = {};
260
+ const warnings = [];
261
+ if (migrateRequested && !migrate) {
262
+ warnings.push('migrate: файл ведётся в V1-формате, перенос в agents не выполнен.');
263
+ }
264
+ for (const [name, write] of Object.entries(definitions)) {
265
+ const inV1 = Object.prototype.hasOwnProperty.call(v1, name);
266
+ const inV2 = Object.prototype.hasOwnProperty.call(v2, name);
267
+ // Не переносим агентов, у которых есть V1-ограничения: в V2 их нельзя
268
+ // перевести без потери смысла, а смешивать поля в одной записи нельзя.
269
+ if (migrate && inV1) {
270
+ const unsafe = MIGRATION_UNSAFE_FIELDS.filter(field => field in v1[name]);
271
+ if (unsafe.length > 0) {
272
+ v1[name] = buildAgentEntry(v1[name], write, 'v1');
273
+ warnings.push(`Агент "${name}" не перенесён в agents: поля ${unsafe.join(', ')} нельзя однозначно ` +
274
+ 'перевести в V2 (ограничения инструментов/сэмплинга). Запись в agent обновлена и оставлена.');
275
+ written[name] = 'agent';
276
+ continue;
277
+ }
278
+ }
279
+ let targets;
280
+ if (migrate) {
281
+ targets = ['agents'];
282
+ }
283
+ else if (inV1 && inV2) {
284
+ targets = ['agent', 'agents'];
285
+ warnings.push(`Агент "${name}" задан и в agent, и в agents: обновлены обе записи, иначе V2 проигнорирует V1-определение.`);
286
+ }
287
+ else if (inV2) {
288
+ targets = ['agents'];
289
+ }
290
+ else if (inV1) {
291
+ targets = ['agent'];
292
+ }
293
+ else {
294
+ targets = [flavor === 'v2' ? 'agents' : 'agent'];
295
+ }
296
+ for (const target of targets) {
297
+ const targetMap = target === 'agents' ? v2 : v1;
298
+ // При миграции переносим существующую V1-запись целиком, иначе потеряются
299
+ // mode/description/disable и другие поля, которых нет в definitions.
300
+ const base = target === 'agents' && migrate
301
+ ? { ...(v1[name] ?? {}), ...(v2[name] ?? {}) }
302
+ : targetMap[name] ?? {};
303
+ const style = pickAgentFieldStyle(target);
304
+ targetMap[name] = buildAgentEntry(base, write, style);
305
+ }
306
+ if (migrate && inV1) {
307
+ delete v1[name];
308
+ warnings.push(`Агент "${name}" перенесён из agent в agents (native V2).`);
309
+ }
310
+ written[name] = targets.length === 2 ? 'both' : targets[0];
311
+ }
312
+ const next = { ...root };
313
+ if (Object.keys(v1).length > 0) {
314
+ next.agent = v1;
315
+ }
316
+ else if ('agent' in root && !migrate) {
317
+ next.agent = v1;
318
+ }
319
+ else {
320
+ delete next.agent;
321
+ }
322
+ if (Object.keys(v2).length > 0 || 'agents' in root) {
323
+ next.agents = v2;
324
+ }
325
+ return { config: next, flavor, written, warnings };
326
+ }
327
+ /**
328
+ * Читает MCP-серверы из конфигурации OpenCode.
329
+ * V1 хранит их плоско в `mcp.<name>`, V2 — в `mcp.servers.<name>`.
330
+ */
331
+ export function readMcpSection(config) {
332
+ const root = recordOf(config);
333
+ const mcp = recordOf(root.mcp);
334
+ const flavor = detectConfigFlavor(root);
335
+ const servers = {};
336
+ for (const [name, entry] of Object.entries(recordOf(mcp.servers))) {
337
+ servers[name] = recordOf(entry);
338
+ }
339
+ const flat = {};
340
+ for (const [name, entry] of Object.entries(mcp)) {
341
+ if (name === 'servers' || name === 'timeout')
342
+ continue;
343
+ if (!isRecord(entry))
344
+ continue;
345
+ flat[name] = entry;
346
+ }
347
+ const duplicated = Object.keys(flat).filter(name => Object.prototype.hasOwnProperty.call(servers, name));
348
+ return { flavor, servers, flat, duplicated };
349
+ }
350
+ /** Собирает запись MCP-сервера в формате нужной версии */
351
+ export function buildMcpServerEntry(flavor, spec) {
352
+ const entry = {
353
+ type: 'local',
354
+ command: [...spec.command]
355
+ };
356
+ if (spec.environment !== undefined && Object.keys(spec.environment).length > 0) {
357
+ entry.environment = { ...spec.environment };
358
+ }
359
+ if (spec.cwd !== undefined && spec.cwd.trim().length > 0) {
360
+ entry.cwd = spec.cwd.trim();
361
+ }
362
+ if (flavor === 'v2') {
363
+ if (spec.enabled === false)
364
+ entry.disabled = true;
365
+ }
366
+ else if (spec.enabled === false) {
367
+ entry.enabled = false;
368
+ }
369
+ return entry;
370
+ }
371
+ /**
372
+ * Записывает MCP-сервер в конфигурацию OpenCode.
373
+ * V2 игнорирует плоские записи `mcp.<name>`, поэтому формат выбирается по файлу.
374
+ */
375
+ export function upsertMcpServer(config, name, spec, options = {}) {
376
+ const root = recordOf(config);
377
+ const section = readMcpSection(root);
378
+ const flavor = options.flavor ?? section.flavor;
379
+ const warnings = [];
380
+ const mcp = { ...recordOf(root.mcp) };
381
+ if (flavor === 'v2') {
382
+ const servers = { ...recordOf(mcp.servers) };
383
+ const existing = recordOf(servers[name]);
384
+ servers[name] = { ...existing, ...buildMcpServerEntry('v2', spec) };
385
+ mcp.servers = servers;
386
+ if (Object.prototype.hasOwnProperty.call(section.flat, name)) {
387
+ warnings.push(`Плоская запись mcp.${name} игнорируется OpenCode V2. Удалите её, чтобы не было двух источников правды.`);
388
+ }
389
+ }
390
+ else {
391
+ const existing = recordOf(mcp[name]);
392
+ mcp[name] = { ...existing, ...buildMcpServerEntry('v1', spec) };
393
+ if (Object.prototype.hasOwnProperty.call(section.servers, name)) {
394
+ warnings.push(`OpenCode V1 не читает mcp.servers.${name}; запись добавлена в плоский раздел mcp.`);
395
+ }
396
+ }
397
+ return {
398
+ config: { ...root, mcp },
399
+ flavor,
400
+ key: flavor === 'v2' ? 'mcp.servers' : 'mcp',
401
+ warnings
402
+ };
403
+ }
404
+ /**
405
+ * Возвращает V1-поля, которые OpenCode V2 переименовывает или игнорирует.
406
+ * Используется диагностикой, чтобы предупредить о настройках без эффекта.
407
+ */
408
+ export function findLegacyV1Fields(config) {
409
+ const root = recordOf(config);
410
+ return LEGACY_V1_FIELDS.filter(field => field in root);
411
+ }
412
+ /** Ссылка на команду установки MCP-сервера для текущего формата */
413
+ export function describeMcpShellCommand(name, flavor) {
414
+ if (flavor === 'v2') {
415
+ return `opencode mcp add ${name} -- npx -y lv24-opencode-consilium mcp`;
416
+ }
417
+ return 'mcp.consilium: { "type": "local", "command": ["npx", "-y", "lv24-opencode-consilium", "mcp"] }';
418
+ }
419
+ //# sourceMappingURL=compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compat.js","sourceRoot":"","sources":["../src/compat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * @fileoverview Загрузчик конфигурации
3
+ * @module lv24-opencode-consilium
4
+ */
5
+ import type { ConsiliumConfig } from './types.js';
6
+ import { type AgentSectionView } from './compat.js';
7
+ /**
8
+ * Результат загрузки конфигурации
9
+ */
10
+ export interface ConfigLoadResult {
11
+ config: ConsiliumConfig;
12
+ configPath: string | null;
13
+ warnings: string[];
14
+ errors?: string[];
15
+ }
16
+ type JsonRecord = Record<string, unknown>;
17
+ /**
18
+ * Удаляет комментарии и висячие запятые из JSONC, не трогая строки
19
+ */
20
+ export declare function stripJsonComments(text: string): string;
21
+ /**
22
+ * Читает JSON/JSONC файл
23
+ */
24
+ export declare function readJsonFile(path: string): unknown;
25
+ /**
26
+ * Глубокое клонирование конфигурации с сохранением функций
27
+ */
28
+ export declare function cloneConfig(config: ConsiliumConfig): ConsiliumConfig;
29
+ /**
30
+ * Объединяет частичный конфиг с конфигурацией по умолчанию
31
+ */
32
+ export declare function mergeWithDefaults(partial: Partial<ConsiliumConfig>): ConsiliumConfig;
33
+ /**
34
+ * Возвращает все найденные файлы конфигурации OpenCode в порядке возрастания
35
+ * приоритета: глобальный → прямые файлы от корня к cwd → `.opencode`-файлы
36
+ * от корня к cwd. OpenCode сливает их именно в таком порядке.
37
+ */
38
+ export declare function listOpenCodeConfigPaths(cwd?: string): string[];
39
+ /**
40
+ * Находит основной файл конфигурации OpenCode (наивысший приоритет).
41
+ * Если заданный `opencodeConfigPath` не существует, используется автоопределение.
42
+ */
43
+ export declare function findOpenCodeConfigPath(configuredPath?: string, cwd?: string): string | null;
44
+ /** Снимок агентов из конфигурации OpenCode */
45
+ export interface OpenCodeAgentSnapshot {
46
+ /** Файл с наивысшим приоритетом */
47
+ path: string | null;
48
+ /** Слитая конфигурация */
49
+ config: JsonRecord | null;
50
+ section: AgentSectionView | null;
51
+ /** Все прочитанные файлы в порядке возрастания приоритета */
52
+ files: string[];
53
+ /** Причина, по которой конфигурация не прочитана */
54
+ error?: string;
55
+ /** Некритичное предупреждение (например, заданный путь не найден) */
56
+ warning?: string;
57
+ }
58
+ /**
59
+ * Читает агентов из opencode.json, понимая V1 (`agent`) и V2 (`agents`).
60
+ * Без явного пути сливает все слои так же, как OpenCode.
61
+ */
62
+ export declare function loadOpenCodeAgents(options?: {
63
+ opencodeConfigPath?: string;
64
+ cwd?: string;
65
+ }): OpenCodeAgentSnapshot;
66
+ /**
67
+ * Проверяет, существует ли агент и какую модель он использует.
68
+ *
69
+ * Нужна для OpenCode V2: `opencode run --agent` не применяет модель агента
70
+ * из конфигурации, поэтому её приходится передавать через `--model`, а для
71
+ * несуществующего агента — сразу запускать default-агент.
72
+ */
73
+ export declare function resolveOpenCodeAgent(agentName: string, options?: {
74
+ opencodeConfigPath?: string;
75
+ cwd?: string;
76
+ }): {
77
+ exists: boolean;
78
+ model?: string;
79
+ };
80
+ /**
81
+ * Возвращает модель агента из opencode.json.
82
+ */
83
+ export declare function resolveOpenCodeAgentModel(agentName: string, options?: {
84
+ opencodeConfigPath?: string;
85
+ cwd?: string;
86
+ }): string | undefined;
87
+ /**
88
+ * Проверяет формат модели
89
+ */
90
+ export declare function isValidModelId(model: string): boolean;
91
+ /**
92
+ * Валидирует конфигурацию
93
+ */
94
+ export declare function validateConfig(config: ConsiliumConfig): string[];
95
+ /**
96
+ * Загружает конфигурацию из файла
97
+ */
98
+ export declare function loadConfig(explicitPath?: string): ConfigLoadResult;
99
+ /**
100
+ * Создаёт минимальный конфиг
101
+ */
102
+ export declare function createMinimalConfig(experts?: string[]): ConsiliumConfig;
103
+ /**
104
+ * Генерирует пример конфигурационного файла
105
+ */
106
+ export declare function generateExampleConfig(): string;
107
+ /**
108
+ * Возвращает директорию конфигурационного файла (для относительных путей)
109
+ */
110
+ export declare function configDirectory(configPath: string | null): string;
111
+ export {};
112
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,YAAY,CAAC;AAOpB,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAW1C;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA6DtD;AA6CD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAapE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAqCpF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAmC9D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa3F;AA2BD,8CAA8C;AAC9C,MAAM,WAAW,qBAAqB;IACpC,mCAAmC;IACnC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,0BAA0B;IAC1B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC,6DAA6D;IAC7D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1D,qBAAqB,CAwDvB;AAuCD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1D;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAcrC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1D,MAAM,GAAG,SAAS,CAEpB;AAoCD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,EAAE,CAgIhE;AAwCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA8FlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAAM,EAAO,GAAG,eAAe,CAa3E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA4D9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAEjE"}