@pellux/goodvibes-sdk 0.33.19 → 0.33.21

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 (58) hide show
  1. package/dist/browser-knowledge.d.ts +49 -0
  2. package/dist/browser-knowledge.d.ts.map +1 -1
  3. package/dist/browser-knowledge.js +22 -0
  4. package/dist/contracts/artifacts/operator-contract.json +4615 -4
  5. package/dist/events/agents.d.ts +11 -0
  6. package/dist/events/agents.d.ts.map +1 -1
  7. package/dist/events/index.d.ts +1 -1
  8. package/dist/events/index.d.ts.map +1 -1
  9. package/dist/events/planner.d.ts +69 -1
  10. package/dist/events/planner.d.ts.map +1 -1
  11. package/dist/platform/agents/wrfc-controller.d.ts +18 -0
  12. package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
  13. package/dist/platform/agents/wrfc-controller.js +237 -13
  14. package/dist/platform/agents/wrfc-types.d.ts +1 -1
  15. package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
  16. package/dist/platform/control-plane/method-catalog-knowledge.d.ts.map +1 -1
  17. package/dist/platform/control-plane/method-catalog-knowledge.js +154 -1
  18. package/dist/platform/control-plane/operator-contract-schemas-project-planning.d.ts +4 -0
  19. package/dist/platform/control-plane/operator-contract-schemas-project-planning.d.ts.map +1 -1
  20. package/dist/platform/control-plane/operator-contract-schemas-project-planning.js +78 -0
  21. package/dist/platform/daemon/http/project-planning-routes.d.ts.map +1 -1
  22. package/dist/platform/daemon/http/project-planning-routes.js +67 -0
  23. package/dist/platform/knowledge/index.d.ts +1 -1
  24. package/dist/platform/knowledge/index.d.ts.map +1 -1
  25. package/dist/platform/knowledge/project-planning/helpers.d.ts +1 -1
  26. package/dist/platform/knowledge/project-planning/helpers.d.ts.map +1 -1
  27. package/dist/platform/knowledge/project-planning/helpers.js +4 -0
  28. package/dist/platform/knowledge/project-planning/index.d.ts +1 -1
  29. package/dist/platform/knowledge/project-planning/index.d.ts.map +1 -1
  30. package/dist/platform/knowledge/project-planning/service.d.ts +21 -1
  31. package/dist/platform/knowledge/project-planning/service.d.ts.map +1 -1
  32. package/dist/platform/knowledge/project-planning/service.js +502 -1
  33. package/dist/platform/knowledge/project-planning/types.d.ts +140 -0
  34. package/dist/platform/knowledge/project-planning/types.d.ts.map +1 -1
  35. package/dist/platform/runtime/emitters/agents.d.ts +11 -0
  36. package/dist/platform/runtime/emitters/agents.d.ts.map +1 -1
  37. package/dist/platform/runtime/emitters/planner.d.ts +22 -0
  38. package/dist/platform/runtime/emitters/planner.d.ts.map +1 -1
  39. package/dist/platform/runtime/emitters/planner.js +15 -0
  40. package/dist/platform/runtime/events/index.d.ts +1 -1
  41. package/dist/platform/runtime/events/index.d.ts.map +1 -1
  42. package/dist/platform/runtime/services.d.ts.map +1 -1
  43. package/dist/platform/runtime/services.js +2 -0
  44. package/dist/platform/runtime/store/domains/agents.d.ts +3 -1
  45. package/dist/platform/runtime/store/domains/agents.d.ts.map +1 -1
  46. package/dist/platform/runtime/store/helpers/reducers/lifecycle.d.ts.map +1 -1
  47. package/dist/platform/runtime/store/helpers/reducers/lifecycle.js +25 -6
  48. package/dist/platform/tools/agent/index.d.ts.map +1 -1
  49. package/dist/platform/tools/agent/index.js +135 -49
  50. package/dist/platform/tools/agent/manager.d.ts +1 -0
  51. package/dist/platform/tools/agent/manager.d.ts.map +1 -1
  52. package/dist/platform/tools/agent/manager.js +35 -5
  53. package/dist/platform/tools/agent/schema.js +4 -4
  54. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts +13 -0
  55. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts.map +1 -0
  56. package/dist/platform/tools/agent/wrfc-batch-policy.js +108 -0
  57. package/dist/platform/version.js +1 -1
  58. package/package.json +9 -9
@@ -5,6 +5,7 @@ import { AGENT_TEMPLATES, AgentManager } from './manager.js';
5
5
  import { evaluateOrchestrationSpawn } from '../../runtime/orchestration/spawn-policy.js';
6
6
  import { summarizeError } from '../../utils/error-display.js';
7
7
  import { toRecord } from '../../utils/record-coerce.js';
8
+ import { evaluateWrfcBatchPolicy } from './wrfc-batch-policy.js';
8
9
  export { AGENT_TEMPLATES, AgentManager } from './manager.js';
9
10
  // ---------------------------------------------------------------------------
10
11
  // Tool implementation
@@ -23,6 +24,72 @@ function summarizeWrfcEvent(event) {
23
24
  issueCount: Array.isArray(event.issues) ? event.issues.length : undefined,
24
25
  };
25
26
  }
27
+ function agentTopology(record) {
28
+ return {
29
+ parentAgentId: record.parentAgentId ?? null,
30
+ wrfcId: record.wrfcId ?? null,
31
+ wrfcRole: record.wrfcRole ?? null,
32
+ wrfcPhaseOrder: record.wrfcPhaseOrder ?? null,
33
+ wrfcRouteReason: record.wrfcRouteReason ?? null,
34
+ orchestrationGraphId: record.orchestrationGraphId ?? null,
35
+ orchestrationNodeId: record.orchestrationNodeId ?? null,
36
+ parentNodeId: record.parentNodeId ?? null,
37
+ };
38
+ }
39
+ function agentExecutionContract(record) {
40
+ return {
41
+ executionIntent: record.executionIntent ?? null,
42
+ tools: record.tools,
43
+ capabilityCeilingTools: record.capabilityCeilingTools ?? record.tools,
44
+ successCriteria: record.successCriteria ?? [],
45
+ requiredEvidence: record.requiredEvidence ?? [],
46
+ writeScope: record.writeScope ?? [],
47
+ executionProtocol: record.executionProtocol,
48
+ reviewMode: record.reviewMode,
49
+ communicationLane: record.communicationLane,
50
+ knowledgeInjections: record.knowledgeInjections ?? [],
51
+ };
52
+ }
53
+ function agentSummary(record) {
54
+ return {
55
+ id: record.id,
56
+ task: record.task,
57
+ template: record.template,
58
+ status: record.status,
59
+ startedAt: record.startedAt,
60
+ toolCallCount: record.toolCallCount,
61
+ cohort: record.cohort,
62
+ progress: record.progress,
63
+ ...agentTopology(record),
64
+ };
65
+ }
66
+ function batchTaskToSpawnInput(input, taskDef) {
67
+ return {
68
+ mode: 'spawn',
69
+ task: taskDef.task,
70
+ template: taskDef.template ?? input.template ?? 'general',
71
+ model: taskDef.model ?? input.model,
72
+ provider: taskDef.provider ?? input.provider,
73
+ fallbackModels: taskDef.fallbackModels ?? input.fallbackModels,
74
+ routing: taskDef.routing ?? input.routing,
75
+ reasoningEffort: taskDef.reasoningEffort ?? input.reasoningEffort,
76
+ tools: taskDef.tools ?? input.tools,
77
+ restrictTools: taskDef.restrictTools ?? input.restrictTools,
78
+ context: taskDef.context ?? input.context,
79
+ successCriteria: taskDef.successCriteria ?? input.successCriteria,
80
+ requiredEvidence: taskDef.requiredEvidence ?? input.requiredEvidence,
81
+ writeScope: taskDef.writeScope ?? input.writeScope,
82
+ executionProtocol: taskDef.executionProtocol ?? input.executionProtocol,
83
+ reviewMode: taskDef.reviewMode ?? input.reviewMode,
84
+ communicationLane: taskDef.communicationLane ?? input.communicationLane,
85
+ parentAgentId: taskDef.parentAgentId ?? input.parentAgentId,
86
+ orchestrationGraphId: taskDef.orchestrationGraphId ?? input.orchestrationGraphId,
87
+ orchestrationNodeId: taskDef.orchestrationNodeId,
88
+ parentNodeId: taskDef.parentNodeId ?? input.parentNodeId,
89
+ dangerously_disable_wrfc: taskDef.dangerously_disable_wrfc ?? input.dangerously_disable_wrfc,
90
+ cohort: input.cohort,
91
+ };
92
+ }
26
93
  export function createAgentTool(config) {
27
94
  const archetypeLoader = config.archetypeLoader ?? new ArchetypeLoader();
28
95
  return {
@@ -78,17 +145,8 @@ export function createAgentTool(config) {
78
145
  status: 'spawned',
79
146
  template: record.template,
80
147
  task: record.task,
81
- executionIntent: record.executionIntent ?? null,
82
- tools: record.tools,
83
- capabilityCeilingTools: record.capabilityCeilingTools ?? record.tools,
84
- successCriteria: record.successCriteria ?? [],
85
- requiredEvidence: record.requiredEvidence ?? [],
86
- writeScope: record.writeScope ?? [],
87
- executionProtocol: record.executionProtocol,
88
- reviewMode: record.reviewMode,
89
- communicationLane: record.communicationLane,
90
- knowledgeInjections: record.knowledgeInjections ?? [],
91
- parentAgentId: record.parentAgentId ?? null,
148
+ ...agentExecutionContract(record),
149
+ ...agentTopology(record),
92
150
  }),
93
151
  };
94
152
  }
@@ -114,6 +172,7 @@ export function createAgentTool(config) {
114
172
  toolCallCount: record.toolCallCount,
115
173
  progress: record.progress,
116
174
  error: record.error,
175
+ ...agentTopology(record),
117
176
  }),
118
177
  };
119
178
  }
@@ -142,15 +201,7 @@ export function createAgentTool(config) {
142
201
  return {
143
202
  success: true,
144
203
  output: JSON.stringify({
145
- agents: records.map((r) => ({
146
- id: r.id,
147
- task: r.task,
148
- template: r.template,
149
- status: r.status,
150
- startedAt: r.startedAt,
151
- toolCallCount: r.toolCallCount,
152
- cohort: r.cohort,
153
- })),
204
+ agents: records.map(agentSummary),
154
205
  count: records.length,
155
206
  ...(input.cohort ? { cohort: input.cohort } : {}),
156
207
  }),
@@ -196,9 +247,7 @@ export function createAgentTool(config) {
196
247
  executionProtocol: record.executionProtocol,
197
248
  reviewMode: record.reviewMode,
198
249
  communicationLane: record.communicationLane,
199
- parentAgentId: record.parentAgentId ?? null,
200
- orchestrationGraphId: record.orchestrationGraphId ?? null,
201
- orchestrationNodeId: record.orchestrationNodeId ?? null,
250
+ ...agentTopology(record),
202
251
  };
203
252
  const contract = {
204
253
  tools: record.tools,
@@ -374,6 +423,67 @@ export function createAgentTool(config) {
374
423
  if (input.tasks.length > 20) {
375
424
  return { success: false, error: 'batch-spawn limited to 20 tasks per batch.' };
376
425
  }
426
+ if (input.tasks.length === 1) {
427
+ const taskDef = input.tasks[0];
428
+ if (!taskDef.task || typeof taskDef.task !== 'string' || taskDef.task.trim() === '') {
429
+ return { success: false, error: 'Each task in batch-spawn must have a non-empty task string.' };
430
+ }
431
+ if (taskDef.template && !AGENT_TEMPLATES[taskDef.template]) {
432
+ const customArchetype = archetypeLoader.loadArchetype(taskDef.template);
433
+ if (!customArchetype || customArchetype.isCustom === false) {
434
+ return {
435
+ success: false,
436
+ error: `Unknown template: '${taskDef.template}'. Available: ${Object.keys(AGENT_TEMPLATES).join(', ')}`,
437
+ };
438
+ }
439
+ }
440
+ let record;
441
+ try {
442
+ record = manager.spawn(batchTaskToSpawnInput(input, taskDef));
443
+ }
444
+ catch (error) {
445
+ return {
446
+ success: false,
447
+ error: summarizeError(error),
448
+ };
449
+ }
450
+ return {
451
+ success: true,
452
+ output: JSON.stringify({
453
+ agents: [{ ...agentSummary(record), task: record.task.slice(0, 80) }],
454
+ count: 1,
455
+ cohort: input.cohort,
456
+ skipped: 0,
457
+ normalizedToSpawn: true,
458
+ }),
459
+ };
460
+ }
461
+ const batchPolicy = evaluateWrfcBatchPolicy(input);
462
+ if (batchPolicy.kind === 'collapse-to-wrfc') {
463
+ let record;
464
+ try {
465
+ record = manager.spawn(batchPolicy.ownerInput);
466
+ }
467
+ catch (error) {
468
+ return {
469
+ success: false,
470
+ error: `Failed to collapse role-decomposition batch into a WRFC owner chain: ${summarizeError(error)}`,
471
+ };
472
+ }
473
+ return {
474
+ success: true,
475
+ output: JSON.stringify({
476
+ agents: [{ ...agentSummary(record), task: record.task.slice(0, 80) }],
477
+ count: 1,
478
+ cohort: input.cohort,
479
+ skipped: 0,
480
+ collapsedToWrfc: true,
481
+ collapsedTaskCount: input.tasks.length,
482
+ reason: batchPolicy.reason,
483
+ roleTaskIndexes: batchPolicy.roleTaskIndexes ?? [],
484
+ }),
485
+ };
486
+ }
377
487
  const currentCount = manager.list().filter(a => a.status === 'pending' || a.status === 'running').length;
378
488
  const spawnDecision = evaluateOrchestrationSpawn({
379
489
  configManager: config.configManager,
@@ -404,31 +514,7 @@ export function createAgentTool(config) {
404
514
  };
405
515
  }
406
516
  }
407
- const spawnInput = {
408
- mode: 'spawn',
409
- task: taskDef.task,
410
- template: taskDef.template ?? input.template ?? 'general',
411
- model: taskDef.model ?? input.model,
412
- provider: taskDef.provider ?? input.provider,
413
- fallbackModels: taskDef.fallbackModels ?? input.fallbackModels,
414
- routing: taskDef.routing ?? input.routing,
415
- reasoningEffort: taskDef.reasoningEffort ?? input.reasoningEffort,
416
- tools: taskDef.tools ?? input.tools,
417
- restrictTools: taskDef.restrictTools ?? input.restrictTools,
418
- context: taskDef.context ?? input.context,
419
- successCriteria: taskDef.successCriteria ?? input.successCriteria,
420
- requiredEvidence: taskDef.requiredEvidence ?? input.requiredEvidence,
421
- writeScope: taskDef.writeScope ?? input.writeScope,
422
- executionProtocol: taskDef.executionProtocol ?? input.executionProtocol,
423
- reviewMode: taskDef.reviewMode ?? input.reviewMode,
424
- communicationLane: taskDef.communicationLane ?? input.communicationLane,
425
- parentAgentId: taskDef.parentAgentId ?? input.parentAgentId,
426
- orchestrationGraphId: taskDef.orchestrationGraphId ?? input.orchestrationGraphId,
427
- orchestrationNodeId: taskDef.orchestrationNodeId,
428
- parentNodeId: taskDef.parentNodeId ?? input.parentNodeId,
429
- dangerously_disable_wrfc: taskDef.dangerously_disable_wrfc ?? input.dangerously_disable_wrfc,
430
- cohort: input.cohort,
431
- };
517
+ const spawnInput = batchTaskToSpawnInput(input, taskDef);
432
518
  let record;
433
519
  try {
434
520
  record = manager.spawn(spawnInput);
@@ -439,7 +525,7 @@ export function createAgentTool(config) {
439
525
  error: summarizeError(error),
440
526
  };
441
527
  }
442
- results.push({ id: record.id, task: taskDef.task.slice(0, 80), template: record.template, cohort: record.cohort });
528
+ results.push({ ...agentSummary(record), task: taskDef.task.slice(0, 80) });
443
529
  }
444
530
  return {
445
531
  success: true,
@@ -52,6 +52,7 @@ export interface AgentRecord {
52
52
  streamingContent?: string | undefined;
53
53
  wrfcId?: string | undefined;
54
54
  wrfcRole?: WrfcAgentRole | undefined;
55
+ wrfcPhaseOrder?: number | undefined;
55
56
  wrfcRouteReason?: string | undefined;
56
57
  dangerously_disable_wrfc?: boolean | undefined;
57
58
  cohort?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/agent/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/agent/manager.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import { evaluateOrchestrationSpawn } from '../../runtime/orchestration/spawn-po
7
7
  import { logger } from '../../utils/logger.js';
8
8
  import { summarizeError } from '../../utils/error-display.js';
9
9
  import { splitModelRegistryKey } from '../../providers/registry-helpers.js';
10
+ import { isRootReviewRoleTask } from './wrfc-batch-policy.js';
10
11
  export const AGENT_TEMPLATES = {
11
12
  engineer: {
12
13
  description: 'Full-stack implementation agent',
@@ -90,14 +91,32 @@ export class AgentManager {
90
91
  };
91
92
  }
92
93
  spawn(input) {
93
- const task = input.task;
94
+ let task = input.task;
94
95
  if (!task || typeof task !== 'string' || task.trim() === '') {
95
96
  throw new Error('spawn() requires a non-empty task string');
96
97
  }
97
98
  if (!this.configManager) {
98
99
  throw new Error('AgentManager requires configManager');
99
100
  }
100
- const template = input.template ?? 'general';
101
+ let template = input.template ?? 'general';
102
+ if (!input.parentAgentId && isRootReviewRoleTask({ task, template })) {
103
+ input = {
104
+ ...input,
105
+ template: 'engineer',
106
+ reviewMode: 'wrfc',
107
+ dangerously_disable_wrfc: false,
108
+ context: [
109
+ input.context?.trim(),
110
+ 'SDK WRFC topology enforcement normalized this root review/test/verification task into a single owner chain. Review, test, verification, and fix work are lifecycle phases owned by the WRFC controller, not independent root agents.',
111
+ ].filter((part) => Boolean(part)).join('\n\n'),
112
+ successCriteria: [
113
+ ...(input.successCriteria ?? []),
114
+ 'Keep the work as one WRFC owner chain; review, test, verification, and fix phases must remain lifecycle children.',
115
+ ],
116
+ };
117
+ task = input.task ?? task;
118
+ template = input.template ?? 'engineer';
119
+ }
101
120
  const archetype = this.archetypeLoader.loadArchetype(template);
102
121
  const templateDef = AGENT_TEMPLATES[template] ?? AGENT_TEMPLATES.general;
103
122
  const defaultTools = archetype ? archetype.tools : templateDef.defaultTools;
@@ -303,7 +322,7 @@ export class AgentManager {
303
322
  this.wrfcController?.createChain(record);
304
323
  if (record.wrfcRole === 'owner') {
305
324
  record.status = 'running';
306
- record.progress = 'WRFC owner supervising child agents';
325
+ record.progress ??= 'WRFC owner supervising child agents';
307
326
  if (this.runtimeBus) {
308
327
  const ctx = {
309
328
  sessionId: 'agent-manager',
@@ -311,8 +330,19 @@ export class AgentManager {
311
330
  source: 'agent-manager',
312
331
  agentId: id,
313
332
  };
314
- emitAgentRunning(this.runtimeBus, ctx, { agentId: id });
315
- emitAgentProgress(this.runtimeBus, ctx, { agentId: id, progress: record.progress });
333
+ emitAgentRunning(this.runtimeBus, ctx, {
334
+ agentId: id,
335
+ wrfcId: record.wrfcId,
336
+ wrfcRole: record.wrfcRole,
337
+ wrfcPhaseOrder: record.wrfcPhaseOrder,
338
+ });
339
+ emitAgentProgress(this.runtimeBus, ctx, {
340
+ agentId: id,
341
+ progress: record.progress,
342
+ wrfcId: record.wrfcId,
343
+ wrfcRole: record.wrfcRole,
344
+ wrfcPhaseOrder: record.wrfcPhaseOrder,
345
+ });
316
346
  }
317
347
  return record;
318
348
  }
@@ -5,7 +5,7 @@
5
5
  export const AGENT_TOOL_SCHEMA = {
6
6
  name: 'agent',
7
7
  description: 'Manages in-process subagents. Modes: spawn (create a new agent task), ' +
8
- 'batch-spawn (spawn multiple agents at once from a tasks array), ' +
8
+ 'batch-spawn (spawn multiple genuinely independent sidecar agents at once from a tasks array; review/test/verification role decomposition is WRFC and is collapsed to one owner chain), ' +
9
9
  'status (check agent progress by ID), cancel (stop a running agent), ' +
10
10
  'list (show all agents and their status), ' +
11
11
  'templates (list available agent templates with default tool sets), ' +
@@ -151,7 +151,7 @@ export const AGENT_TOOL_SCHEMA = {
151
151
  },
152
152
  dangerously_disable_wrfc: {
153
153
  type: 'boolean',
154
- description: 'If true, skip the WRFC review chain for this agent (mode: spawn). Default: false.',
154
+ description: 'If true, skip the WRFC review chain for ordinary implementation/research agents (mode: spawn). Root reviewer/tester/verifier tasks are still normalized into one WRFC owner chain.',
155
155
  default: false,
156
156
  },
157
157
  // mode: batch-spawn
@@ -191,10 +191,10 @@ export const AGENT_TOOL_SCHEMA = {
191
191
  orchestrationGraphId: { type: 'string', description: 'Graph id to attach the worker to.' },
192
192
  orchestrationNodeId: { type: 'string', description: 'Explicit node id for the worker.' },
193
193
  parentNodeId: { type: 'string', description: 'Parent node id for the worker.' },
194
- dangerously_disable_wrfc: { type: 'boolean', description: 'Skip WRFC review.' },
194
+ dangerously_disable_wrfc: { type: 'boolean', description: 'Skip WRFC review for ordinary implementation/research agents. Root review/test/verify role phases are still normalized into WRFC ownership.' },
195
195
  },
196
196
  },
197
- description: 'Array of tasks to spawn as agents (mode: batch-spawn). Max 20.',
197
+ description: 'Array of genuinely independent tasks to spawn as agents (mode: batch-spawn). Max 20. One-task batches are normalized through spawn. Do not place tester/reviewer/verifier role phases here for one deliverable; those are WRFC lifecycle children owned by one owner chain.',
198
198
  },
199
199
  // mode: spawn, batch-spawn, list, cohort-status, cohort-report
200
200
  cohort: {
@@ -0,0 +1,13 @@
1
+ import type { AgentInput } from './schema.js';
2
+ type BatchTask = NonNullable<AgentInput['tasks']>[number];
3
+ export interface WrfcBatchPolicyDecision {
4
+ readonly kind: 'independent' | 'collapse-to-wrfc';
5
+ readonly reason?: string | undefined;
6
+ readonly ownerInput?: AgentInput | undefined;
7
+ readonly roleTaskIndexes?: readonly number[] | undefined;
8
+ }
9
+ export declare function isRootReviewRoleTemplate(template: string | undefined): boolean;
10
+ export declare function isRootReviewRoleTask(task: Pick<BatchTask, 'task' | 'template'>): boolean;
11
+ export declare function evaluateWrfcBatchPolicy(input: AgentInput): WrfcBatchPolicyDecision;
12
+ export {};
13
+ //# sourceMappingURL=wrfc-batch-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrfc-batch-policy.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/agent/wrfc-batch-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAsB1D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC1D;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,OAAO,CAIxF;AA8BD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,uBAAuB,CAoElF"}
@@ -0,0 +1,108 @@
1
+ const ROOT_REVIEW_ROLE_TEMPLATES = new Set([
2
+ 'reviewer',
3
+ 'tester',
4
+ 'verifier',
5
+ 'review',
6
+ 'test',
7
+ 'qa',
8
+ ]);
9
+ const IMPLEMENTATION_TEMPLATES = new Set(['engineer', 'general']);
10
+ const ROLE_PREFIX_RE = /^\s*(?:\[?\s*)?(?:reviewer|tester|verifier|qa|quality\s+assurance|test|review|verify|validator)\b[\]\s:;-]*/i;
11
+ const ROLE_ACTION_RE = /\b(?:test|tests|testing|review|reviews|reviewing|verify|verifies|verifying|verification|validate|validates|validating|validation|qa)\s+(?:the|this|that|implementation|solution|feature|deliverable|code|changes|work|output|result|patch|diff)\b/i;
12
+ const IMPLEMENTATION_ACTION_RE = /\b(?:build|implement|create|add|write|fix|repair|update|refactor|change|modify|deliver|make)\b/i;
13
+ export function isRootReviewRoleTemplate(template) {
14
+ return ROOT_REVIEW_ROLE_TEMPLATES.has((template ?? '').trim().toLowerCase());
15
+ }
16
+ export function isRootReviewRoleTask(task) {
17
+ if (isRootReviewRoleTemplate(task.template))
18
+ return true;
19
+ const text = task.task.trim();
20
+ return ROLE_PREFIX_RE.test(text) || ROLE_ACTION_RE.test(text);
21
+ }
22
+ function isImplementationLikeTask(task) {
23
+ const template = (task.template ?? '').trim().toLowerCase();
24
+ return IMPLEMENTATION_TEMPLATES.has(template) || IMPLEMENTATION_ACTION_RE.test(task.task);
25
+ }
26
+ function uniqueStrings(values) {
27
+ const unique = [...new Set(values.flatMap((value) => value ?? []).filter((value) => value.trim().length > 0))];
28
+ return unique.length > 0 ? unique : undefined;
29
+ }
30
+ function formatTask(task, index) {
31
+ const template = task.template ?? 'general';
32
+ return `${index + 1}. [${template}] ${task.task}`;
33
+ }
34
+ function buildCollapsedContext(input, tasks, roleTaskIndexes) {
35
+ const roleIndexText = roleTaskIndexes.map((index) => index + 1).join(', ');
36
+ const existing = input.context?.trim();
37
+ return [
38
+ existing ? `Caller context:\n${existing}` : null,
39
+ 'SDK WRFC topology enforcement collapsed this batch because root review/test/verification tasks are lifecycle phases, not independent root agents.',
40
+ `Collapsed role-task indexes: ${roleIndexText}.`,
41
+ 'The WRFC owner must keep one root chain for the original deliverable. The controller owns engineer, reviewer, tester/verifier, and fixer child lifecycle agents after owner output exists.',
42
+ 'Original batch:',
43
+ ...tasks.map(formatTask),
44
+ ].filter((line) => Boolean(line)).join('\n');
45
+ }
46
+ export function evaluateWrfcBatchPolicy(input) {
47
+ const tasks = input.tasks ?? [];
48
+ if (input.mode !== 'batch-spawn' || tasks.length <= 1) {
49
+ return { kind: 'independent' };
50
+ }
51
+ const roleTaskIndexes = tasks
52
+ .map((task, index) => isRootReviewRoleTask(task) ? index : -1)
53
+ .filter((index) => index >= 0);
54
+ if (roleTaskIndexes.length === 0) {
55
+ return { kind: 'independent' };
56
+ }
57
+ const primaryIndex = tasks.findIndex((task, index) => !roleTaskIndexes.includes(index) && isImplementationLikeTask(task));
58
+ const ownerTask = tasks[primaryIndex >= 0 ? primaryIndex : 0];
59
+ const ownerTemplate = isRootReviewRoleTemplate(ownerTask.template)
60
+ ? 'engineer'
61
+ : ownerTask.template ?? input.template ?? 'engineer';
62
+ const template = isRootReviewRoleTemplate(ownerTemplate) ? 'engineer' : ownerTemplate;
63
+ const ownerInput = {
64
+ mode: 'spawn',
65
+ task: ownerTask.task,
66
+ template,
67
+ model: ownerTask.model ?? input.model,
68
+ provider: ownerTask.provider ?? input.provider,
69
+ fallbackModels: ownerTask.fallbackModels ?? input.fallbackModels,
70
+ routing: ownerTask.routing ?? input.routing,
71
+ executionIntent: ownerTask.executionIntent ?? input.executionIntent,
72
+ reasoningEffort: ownerTask.reasoningEffort ?? input.reasoningEffort,
73
+ tools: ownerTask.tools ?? input.tools,
74
+ restrictTools: ownerTask.restrictTools ?? input.restrictTools,
75
+ context: buildCollapsedContext(input, tasks, roleTaskIndexes),
76
+ successCriteria: uniqueStrings([
77
+ ownerTask.successCriteria,
78
+ input.successCriteria,
79
+ ...tasks.map((task) => task.successCriteria),
80
+ ['Keep the WRFC work as one owner chain; review, test, verification, and fix work must be WRFC lifecycle children, not sibling root agents.'],
81
+ ]),
82
+ requiredEvidence: uniqueStrings([
83
+ ownerTask.requiredEvidence,
84
+ input.requiredEvidence,
85
+ ...tasks.map((task) => task.requiredEvidence),
86
+ ]),
87
+ writeScope: uniqueStrings([
88
+ ownerTask.writeScope,
89
+ input.writeScope,
90
+ ...tasks.map((task) => task.writeScope),
91
+ ]),
92
+ executionProtocol: ownerTask.executionProtocol ?? input.executionProtocol,
93
+ reviewMode: 'wrfc',
94
+ communicationLane: ownerTask.communicationLane ?? input.communicationLane,
95
+ parentAgentId: ownerTask.parentAgentId ?? input.parentAgentId,
96
+ orchestrationGraphId: ownerTask.orchestrationGraphId ?? input.orchestrationGraphId,
97
+ orchestrationNodeId: ownerTask.orchestrationNodeId ?? input.orchestrationNodeId,
98
+ parentNodeId: ownerTask.parentNodeId ?? input.parentNodeId,
99
+ dangerously_disable_wrfc: false,
100
+ cohort: input.cohort,
101
+ };
102
+ return {
103
+ kind: 'collapse-to-wrfc',
104
+ reason: 'batch-spawn contained root review/test/verification role tasks for the same deliverable',
105
+ ownerInput,
106
+ roleTaskIndexes,
107
+ };
108
+ }
@@ -1,6 +1,6 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- let version = '0.33.19';
3
+ let version = '0.33.21';
4
4
  try {
5
5
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', '..', 'package.json'), 'utf-8'));
6
6
  version = pkg.version ?? version;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-sdk",
3
- "version": "0.33.19",
3
+ "version": "0.33.21",
4
4
  "description": "TypeScript SDK for building GoodVibes operator, peer, web, mobile, and daemon-connected apps with typed contracts, auth, realtime events, and transport layers.",
5
5
  "keywords": [
6
6
  "goodvibes",
@@ -449,14 +449,14 @@
449
449
  "sideEffects": false,
450
450
  "type": "module",
451
451
  "dependencies": {
452
- "@pellux/goodvibes-contracts": "0.33.19",
453
- "@pellux/goodvibes-daemon-sdk": "0.33.19",
454
- "@pellux/goodvibes-errors": "0.33.19",
455
- "@pellux/goodvibes-operator-sdk": "0.33.19",
456
- "@pellux/goodvibes-peer-sdk": "0.33.19",
457
- "@pellux/goodvibes-transport-core": "0.33.19",
458
- "@pellux/goodvibes-transport-http": "0.33.19",
459
- "@pellux/goodvibes-transport-realtime": "0.33.19"
452
+ "@pellux/goodvibes-contracts": "0.33.21",
453
+ "@pellux/goodvibes-daemon-sdk": "0.33.21",
454
+ "@pellux/goodvibes-errors": "0.33.21",
455
+ "@pellux/goodvibes-operator-sdk": "0.33.21",
456
+ "@pellux/goodvibes-peer-sdk": "0.33.21",
457
+ "@pellux/goodvibes-transport-core": "0.33.21",
458
+ "@pellux/goodvibes-transport-http": "0.33.21",
459
+ "@pellux/goodvibes-transport-realtime": "0.33.21"
460
460
  },
461
461
  "optionalDependencies": {
462
462
  "@agentclientprotocol/sdk": "^0.21.0",