workflow-ai 1.0.55 → 1.0.56

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.
@@ -144,6 +144,9 @@ pipeline:
144
144
  # counter: <string> — имя счётчика попыток для этого stage
145
145
  # agent_by_type: — маршрутизация агента по типу задачи (task_type)
146
146
  # <type>: <agent-id> — например: impl: claude-sonnet, arch: claude-opus
147
+ # <type>: — или расширенный формат с fallback_model:
148
+ # agent: <agent-id>
149
+ # fallback_model: <agent-id>
147
150
  # agent_by_attempt: — ротация агента по номеру попытки
148
151
  # <N>: <agent-id> — например: 1: qwen-code, 2: claude-sonnet
149
152
  # goto: — логика переходов по результату
@@ -348,14 +351,21 @@ pipeline:
348
351
  skill: execute-task
349
352
  counter: task_attempts
350
353
  agent_by_type:
351
- coach: claude-coach
352
- qa: claude-qa
353
- impl: kilo-minimax
354
- # fix: claude-sonnet
355
- arch: claude-opus
356
- # review: qwen-code
357
- # docs: qwen-code
358
- admin: kilo-minimax
354
+ coach:
355
+ agent: claude-coach
356
+ fallback_model: claude-sonnet
357
+ qa:
358
+ agent: claude-qa
359
+ fallback_model: claude-sonnet
360
+ impl:
361
+ agent: kilo-minimax
362
+ fallback_model: kilo-glm
363
+ arch:
364
+ agent: claude-opus
365
+ fallback_model: claude-sonnet
366
+ admin:
367
+ agent: kilo-minimax
368
+ fallback_model: kilo-glm
359
369
  agent_by_attempt:
360
370
  2: qwen-code
361
371
  3: claude-sonnet
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workflow-ai",
3
- "version": "1.0.55",
3
+ "version": "1.0.56",
4
4
  "description": "AI Agent Workflow Coordinator — kanban-based pipeline for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
package/src/runner.mjs CHANGED
@@ -796,6 +796,7 @@ class StageExecutor {
796
796
  // 3. stage.agent — явно указанный агент stage
797
797
  // 4. default_agent — глобальный дефолт
798
798
  let agentId = stage.agent || this.pipeline.default_agent;
799
+ let fallbackModelId = stage.fallback_agent; // fallback_model из agent_by_type имеет приоритет
799
800
  const attempt = (stage.counter && this.counters[stage.counter]) || 0;
800
801
 
801
802
  // Фоллбэк: если task_type не задан, вычисляем из префикса ticket_id (PMA-005 → pma)
@@ -805,8 +806,17 @@ class StageExecutor {
805
806
 
806
807
  if (attempt <= 1 && stage.agent_by_type && taskType) {
807
808
  // Первая попытка: выбор по типу задачи
808
- if (stage.agent_by_type[taskType]) {
809
- agentId = stage.agent_by_type[taskType];
809
+ const agentConfig = stage.agent_by_type[taskType];
810
+ if (agentConfig) {
811
+ // Поддержка формата: { agent: string, fallback_model: string } или просто string
812
+ if (typeof agentConfig === 'object' && agentConfig.agent) {
813
+ agentId = agentConfig.agent;
814
+ if (agentConfig.fallback_model) {
815
+ fallbackModelId = agentConfig.fallback_model;
816
+ }
817
+ } else {
818
+ agentId = agentConfig;
819
+ }
810
820
  if (this.logger) {
811
821
  this.logger.info(`Agent by type: task_type="${taskType}" → ${agentId}`, stageId);
812
822
  }
@@ -844,8 +854,8 @@ class StageExecutor {
844
854
  this.fileGuard.takeSnapshot();
845
855
  }
846
856
 
847
- // Вызываем CLI-агента с поддержкой fallback
848
- const result = await this.callAgentWithFallback(agent, prompt, stageId, stage.skill, stage.fallback_agent);
857
+ // Вызываем CLI-агента с поддержкой fallback (приоритет: fallback_model из agent_by_type > stage.fallback_agent)
858
+ const result = await this.callAgentWithFallback(agent, prompt, stageId, stage.skill, fallbackModelId);
849
859
 
850
860
  // Логгируем завершение stage
851
861
  if (this.logger) {