@pellux/goodvibes-sdk 0.33.20 → 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 (55) 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 +110 -64
  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 +33 -7
  53. package/dist/platform/tools/agent/schema.js +3 -3
  54. package/dist/platform/version.js +1 -1
  55. package/package.json +9 -9
@@ -12,6 +12,9 @@ export type AgentEvent =
12
12
  taskId?: string | undefined;
13
13
  task: string;
14
14
  parentAgentId?: string | undefined;
15
+ wrfcId?: string | undefined;
16
+ wrfcRole?: 'owner' | 'engineer' | 'reviewer' | 'fixer' | 'verifier' | undefined;
17
+ wrfcPhaseOrder?: number | undefined;
15
18
  orchestrationGraphId?: string | undefined;
16
19
  parentNodeId?: string | undefined;
17
20
  }
@@ -20,6 +23,10 @@ export type AgentEvent =
20
23
  type: 'AGENT_RUNNING';
21
24
  agentId: string;
22
25
  taskId?: string;
26
+ parentAgentId?: string | undefined;
27
+ wrfcId?: string | undefined;
28
+ wrfcRole?: 'owner' | 'engineer' | 'reviewer' | 'fixer' | 'verifier' | undefined;
29
+ wrfcPhaseOrder?: number | undefined;
23
30
  }
24
31
  /** Agent emitted a textual progress update. */
25
32
  | {
@@ -27,6 +34,10 @@ export type AgentEvent =
27
34
  agentId: string;
28
35
  taskId?: string;
29
36
  progress: string;
37
+ parentAgentId?: string | undefined;
38
+ wrfcId?: string | undefined;
39
+ wrfcRole?: 'owner' | 'engineer' | 'reviewer' | 'fixer' | 'verifier' | undefined;
40
+ wrfcPhaseOrder?: number | undefined;
30
41
  }
31
42
  /** Agent streamed a chunk of output. */
32
43
  | {
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/events/agents.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF;;;;GAIG;AAEH,MAAM,MAAM,UAAU;AACpB,iDAAiD;AAC/C;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AACH,gDAAgD;GAC9C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAC7D,+CAA+C;GAC7C;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAChF,wCAAwC;GACtC;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE;AACxG,qDAAqD;GACnD;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AACtE,oDAAoD;GAClD;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACjG,iDAAiD;GAC/C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAChE,oCAAoC;GAClC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE;AAC5H,kCAAkC;GAChC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAC/F,6CAA6C;GAC3C;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnF,gDAAgD;AAChD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/events/agents.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export type { AgentEvent, AgentEventType } from './agents.js';
16
16
  export type { WorkflowEvent, WorkflowEventType, Constraint, WrfcState } from './workflows.js';
17
17
  export type { OrchestrationEvent, OrchestrationEventType, OrchestrationTaskContract } from './orchestration.js';
18
18
  export type { CommunicationEvent, CommunicationEventType, CommunicationKind, CommunicationScope } from './communication.js';
19
- export type { PlannerEvent, PlannerEventType, PlannerDecision, ExecutionStrategy, StrategyCandidate } from './planner.js';
19
+ export type { ExecutionStrategy, PlannerDecision, PlannerEvent, PlannerEventType, StrategyCandidate, WorkPlanEventBase, WorkPlanSnapshotEventRecord, WorkPlanTaskEventRecord, WorkPlanTaskStatus, } from './planner.js';
20
20
  export type { PermissionEvent, PermissionEventType } from './permissions.js';
21
21
  export type { PluginEvent, PluginEventType } from './plugins.js';
22
22
  export type { McpEvent, McpEventType, McpServerRole, McpTrustMode, QuarantineReason } from './mcp.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"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"}
@@ -22,12 +22,80 @@ export interface PlannerDecision {
22
22
  readonly taskDescription?: string | undefined;
23
23
  };
24
24
  }
25
+ export type WorkPlanTaskStatus = 'pending' | 'in_progress' | 'blocked' | 'done' | 'failed' | 'cancelled';
26
+ export interface WorkPlanTaskEventRecord {
27
+ readonly taskId: string;
28
+ readonly projectId: string;
29
+ readonly knowledgeSpaceId: string;
30
+ readonly title: string;
31
+ readonly notes?: string | undefined;
32
+ readonly owner?: string | undefined;
33
+ readonly status: WorkPlanTaskStatus;
34
+ readonly priority?: number | undefined;
35
+ readonly order: number;
36
+ readonly source?: string | undefined;
37
+ readonly tags: readonly string[];
38
+ readonly parentTaskId?: string | undefined;
39
+ readonly chainId?: string | undefined;
40
+ readonly phaseId?: string | undefined;
41
+ readonly agentId?: string | undefined;
42
+ readonly turnId?: string | undefined;
43
+ readonly decisionId?: string | undefined;
44
+ readonly sourceMessageId?: string | undefined;
45
+ readonly linkedArtifactIds: readonly string[];
46
+ readonly linkedSourceIds: readonly string[];
47
+ readonly linkedNodeIds: readonly string[];
48
+ readonly originSurface?: string | undefined;
49
+ readonly createdAt: number;
50
+ readonly updatedAt: number;
51
+ readonly completedAt?: number | undefined;
52
+ readonly metadata?: Record<string, unknown> | undefined;
53
+ }
54
+ export interface WorkPlanEventBase {
55
+ readonly projectId: string;
56
+ readonly knowledgeSpaceId: string;
57
+ readonly workPlanId: string;
58
+ }
59
+ export interface WorkPlanSnapshotEventRecord extends WorkPlanEventBase {
60
+ readonly tasks: readonly WorkPlanTaskEventRecord[];
61
+ readonly counts: {
62
+ readonly total: number;
63
+ readonly pending: number;
64
+ readonly in_progress: number;
65
+ readonly blocked: number;
66
+ readonly done: number;
67
+ readonly failed: number;
68
+ readonly cancelled: number;
69
+ };
70
+ readonly updatedAt: number;
71
+ }
25
72
  export type PlannerEvent = ({
26
73
  type: 'PLAN_STRATEGY_SELECTED';
27
74
  } & PlannerDecision) | {
28
75
  type: 'PLAN_STRATEGY_OVERRIDDEN';
29
76
  strategy: ExecutionStrategy | null;
30
77
  clearedBy?: string | undefined;
31
- };
78
+ } | ({
79
+ type: 'WORK_PLAN_TASK_CREATED';
80
+ task: WorkPlanTaskEventRecord;
81
+ } & WorkPlanEventBase) | ({
82
+ type: 'WORK_PLAN_TASK_UPDATED';
83
+ task: WorkPlanTaskEventRecord;
84
+ previousTask: WorkPlanTaskEventRecord;
85
+ } & WorkPlanEventBase) | ({
86
+ type: 'WORK_PLAN_TASK_STATUS_CHANGED';
87
+ taskId: string;
88
+ status: WorkPlanTaskStatus;
89
+ previousStatus: WorkPlanTaskStatus;
90
+ task: WorkPlanTaskEventRecord;
91
+ } & WorkPlanEventBase) | ({
92
+ type: 'WORK_PLAN_TASK_DELETED';
93
+ taskId: string;
94
+ task: WorkPlanTaskEventRecord;
95
+ } & WorkPlanEventBase) | ({
96
+ type: 'WORK_PLAN_SNAPSHOT_INVALIDATED';
97
+ reason: string;
98
+ snapshot: WorkPlanSnapshotEventRecord;
99
+ } & WorkPlanEventBase);
32
100
  export type PlannerEventType = PlannerEvent['type'];
33
101
  //# sourceMappingURL=planner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/events/planner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEvF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAClD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;QAClC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;QACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC/C,CAAC;CACH;AAED,MAAM,MAAM,YAAY,GACpB,CAAC;IACD,IAAI,EAAE,wBAAwB,CAAC;CAChC,GAAG,eAAe,CAAC,GAClB;IACA,IAAI,EAAE,0BAA0B,CAAC;IACjC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEJ,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/events/planner.ts"],"names":[],"mappings":"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"}
@@ -6,9 +6,14 @@ import type { ConfigManager } from '../config/manager.js';
6
6
  import type { AgentRecord } from '../tools/agent/index.js';
7
7
  import type { ExecutionPlanManager } from '../core/execution-plan.js';
8
8
  import type { RuntimeEventBus } from '../runtime/events/index.js';
9
+ import type { ProjectWorkPlanTaskCreateInput, ProjectWorkPlanTaskUpdateInput } from '../knowledge/project-planning/index.js';
9
10
  import { type AgentManagerLike } from './wrfc-config.js';
10
11
  export { extractScoreFromText, extractPassedFromText, extractIssuesFromText } from './wrfc-reporting.js';
11
12
  type WrfcWorktreeOps = Pick<AgentWorktree, 'merge' | 'cleanup'>;
13
+ type WrfcWorkPlanService = {
14
+ createWorkPlanTask(input: ProjectWorkPlanTaskCreateInput): Promise<unknown>;
15
+ updateWorkPlanTask(input: ProjectWorkPlanTaskUpdateInput): Promise<unknown>;
16
+ };
12
17
  export declare class WrfcController {
13
18
  private readonly chains;
14
19
  private chainQueue;
@@ -24,6 +29,8 @@ export declare class WrfcController {
24
29
  private readonly configManager;
25
30
  private readonly createWorktree;
26
31
  private readonly selectChildRoute;
32
+ private workPlanService;
33
+ private readonly workPlanTaskQueues;
27
34
  constructor(runtimeBus: RuntimeEventBus, messageBus: Pick<AgentMessageBus, 'registerAgent'>, deps: {
28
35
  readonly agentManager: AgentManagerLike;
29
36
  readonly configManager: Pick<ConfigManager, 'get' | 'getCategory'>;
@@ -37,12 +44,17 @@ export declare class WrfcController {
37
44
  getWorkmap(): WrfcWorkmap;
38
45
  setPlanManager(planManager: Pick<ExecutionPlanManager, 'getActive' | 'updateItem'>): void;
39
46
  setRuntimeBus(runtimeBus: RuntimeEventBus): void;
47
+ setWorkPlanService(service: WrfcWorkPlanService | null | undefined): void;
40
48
  getChain(chainId: string): WrfcChain | null;
41
49
  listChains(): WrfcChain[];
42
50
  resumeChain(chainId: string): boolean;
43
51
  resumeAllActiveChains(): number;
44
52
  dispose(): void;
45
53
  private transition;
54
+ private applyWrfcAgentMetadata;
55
+ private keepOwnerAgentActive;
56
+ private ownerProgress;
57
+ private wrfcPhaseOrder;
46
58
  private setupListeners;
47
59
  private onAgentComplete;
48
60
  private onAgentFailed;
@@ -74,6 +86,12 @@ export declare class WrfcController {
74
86
  private withRouteReason;
75
87
  private completeChainAsPassed;
76
88
  private completeOwnerAgent;
89
+ private upsertWrfcWorkPlanTask;
90
+ private setWrfcWorkPlanTaskStatus;
91
+ private enqueueWrfcWorkPlanTaskOperation;
92
+ private workPlanRoleForAgent;
93
+ private workPlanTaskIdForAgent;
94
+ private workPlanTaskTitle;
77
95
  private safeDequeueNext;
78
96
  }
79
97
  //# sourceMappingURL=wrfc-controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wrfc-controller.d.ts","sourceRoot":"","sources":["../../../src/platform/agents/wrfc-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wrfc-controller.d.ts","sourceRoot":"","sources":["../../../src/platform/agents/wrfc-controller.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ import { AgentWorktree } from './worktree.js';
8
8
  import { completePlanItemsForAgent } from './wrfc-plan-sync.js';
9
9
  import { logger } from '../utils/logger.js';
10
10
  import { summarizeError } from '../utils/error-display.js';
11
- import { emitAgentCompleted, emitAgentFailed, emitWorkflowChainFailed, emitWorkflowFixAttempted, emitWorkflowReviewCompleted, } from '../runtime/emitters/index.js';
11
+ import { emitAgentCompleted, emitAgentFailed, emitAgentProgress, emitAgentRunning, emitWorkflowChainFailed, emitWorkflowFixAttempted, emitWorkflowReviewCompleted, } from '../runtime/emitters/index.js';
12
12
  import { getWrfcAutoCommit, getWrfcMaxFixAttempts, getWrfcScoreThreshold, } from './wrfc-config.js';
13
13
  import { buildEngineerConstraintAddendum, } from './wrfc-prompt-addenda.js';
14
14
  import { completeWrfcOrchestrationNode, createWrfcWorkflowContext, emitWrfcAutoCommitted, emitWrfcCascadeAbort, emitWrfcChainCreated, emitWrfcChainPassed, emitWrfcConstraintsEnumerated, emitWrfcGraphCreated, emitWrfcStateChanged, failWrfcOrchestrationNode, startWrfcOrchestrationNode, } from './wrfc-runtime-events.js';
@@ -40,6 +40,8 @@ export class WrfcController {
40
40
  configManager;
41
41
  createWorktree;
42
42
  selectChildRoute;
43
+ workPlanService = null;
44
+ workPlanTaskQueues = new Map();
43
45
  constructor(runtimeBus, messageBus, deps) {
44
46
  this.runtimeBus = runtimeBus;
45
47
  this.messageBus = messageBus;
@@ -86,6 +88,9 @@ export class WrfcController {
86
88
  this.runtimeBus = runtimeBus;
87
89
  this.setupListeners();
88
90
  }
91
+ setWorkPlanService(service) {
92
+ this.workPlanService = service ?? null;
93
+ }
89
94
  getChain(chainId) { return this.chains.get(chainId) ?? null; }
90
95
  listChains() { return Array.from(this.chains.values()); }
91
96
  resumeChain(chainId) {
@@ -138,9 +143,86 @@ export class WrfcController {
138
143
  }
139
144
  const from = chain.state;
140
145
  chain.state = to;
146
+ if (to !== 'passed' && to !== 'failed') {
147
+ this.keepOwnerAgentActive(chain);
148
+ }
141
149
  emitWrfcStateChanged(this.runtimeBus, this.sessionId, chain.id, from, to);
142
150
  logger.debug('WrfcController.transition', { chainId: chain.id, from, to });
143
151
  }
152
+ applyWrfcAgentMetadata(chain, record, role) {
153
+ record.wrfcId = chain.id;
154
+ record.wrfcRole = role;
155
+ record.wrfcPhaseOrder = this.wrfcPhaseOrder(role);
156
+ if (role === 'owner') {
157
+ record.progress = this.ownerProgress(chain);
158
+ }
159
+ if (record.status === 'pending' || record.status === 'running') {
160
+ emitAgentProgress(this.runtimeBus, {
161
+ sessionId: this.sessionId,
162
+ traceId: `${this.sessionId}:wrfc-agent-metadata:${record.id}`,
163
+ source: 'wrfc-controller',
164
+ agentId: record.id,
165
+ }, {
166
+ agentId: record.id,
167
+ progress: record.progress ?? `WRFC ${role} phase`,
168
+ ...(record.parentAgentId ? { parentAgentId: record.parentAgentId } : {}),
169
+ wrfcId: chain.id,
170
+ wrfcRole: role,
171
+ wrfcPhaseOrder: record.wrfcPhaseOrder,
172
+ });
173
+ }
174
+ }
175
+ keepOwnerAgentActive(chain, reason) {
176
+ if (chain.ownerTerminalEmitted || chain.state === 'passed' || chain.state === 'failed')
177
+ return;
178
+ const owner = this.agentManager.getStatus(chain.ownerAgentId);
179
+ if (!owner)
180
+ return;
181
+ this.applyWrfcAgentMetadata(chain, owner, 'owner');
182
+ owner.status = 'running';
183
+ delete owner.completedAt;
184
+ owner.progress = reason ? `${this.ownerProgress(chain)} - ${reason}` : this.ownerProgress(chain);
185
+ emitAgentRunning(this.runtimeBus, {
186
+ sessionId: this.sessionId,
187
+ traceId: `${this.sessionId}:wrfc-owner-active:${chain.id}`,
188
+ source: 'wrfc-controller',
189
+ agentId: owner.id,
190
+ }, {
191
+ agentId: owner.id,
192
+ wrfcId: chain.id,
193
+ wrfcRole: 'owner',
194
+ wrfcPhaseOrder: owner.wrfcPhaseOrder,
195
+ });
196
+ emitAgentProgress(this.runtimeBus, {
197
+ sessionId: this.sessionId,
198
+ traceId: `${this.sessionId}:wrfc-owner-progress:${chain.id}`,
199
+ source: 'wrfc-controller',
200
+ agentId: owner.id,
201
+ }, {
202
+ agentId: owner.id,
203
+ progress: owner.progress,
204
+ wrfcId: chain.id,
205
+ wrfcRole: 'owner',
206
+ wrfcPhaseOrder: owner.wrfcPhaseOrder,
207
+ });
208
+ }
209
+ ownerProgress(chain) {
210
+ return `WRFC owner supervising child agents (${chain.state})`;
211
+ }
212
+ wrfcPhaseOrder(role) {
213
+ switch (role) {
214
+ case 'owner':
215
+ return 0;
216
+ case 'engineer':
217
+ return 1;
218
+ case 'reviewer':
219
+ return 2;
220
+ case 'fixer':
221
+ return 3;
222
+ case 'verifier':
223
+ return 4;
224
+ }
225
+ }
144
226
  setupListeners() {
145
227
  const unsubComplete = this.runtimeBus.on('AGENT_COMPLETED', ({ payload }) => {
146
228
  this.onAgentComplete(payload.agentId).catch((error) => {
@@ -165,7 +247,13 @@ export class WrfcController {
165
247
  if (agentId === chain.ownerAgentId) {
166
248
  if (chain.ownerTerminalEmitted)
167
249
  return;
168
- this.failChain(chain, 'WRFC owner agent completed before the chain reached a terminal state');
250
+ this.keepOwnerAgentActive(chain, 'Ignored premature owner completion event; WRFC lifecycle is still active');
251
+ this.appendOwnerDecision(chain, 'owner_completion_ignored', 'Ignored premature owner completion because WRFC owner remains active until the full chain is terminal', { agentId });
252
+ logger.warn('WrfcController: ignored premature owner completion before terminal chain state', {
253
+ chainId: chain.id,
254
+ agentId,
255
+ state: chain.state,
256
+ });
169
257
  return;
170
258
  }
171
259
  const record = this.agentManager.getStatus(agentId);
@@ -186,12 +274,14 @@ export class WrfcController {
186
274
  }
187
275
  if (chain.state === 'engineering' || chain.state === 'fixing') {
188
276
  const report = parseEngineerCompletionReport(rawOutput, record?.template);
277
+ this.setWrfcWorkPlanTaskStatus(chain, agentId, 'done');
189
278
  this.handleEngineerCompletion(chain, agentId, report);
190
279
  }
191
280
  else if (chain.state === 'reviewing') {
192
281
  const review = parseReviewerCompletionReport(chain.id, rawOutput, getWrfcScoreThreshold(this.configManager));
193
282
  chain.reviewerReport = review;
194
283
  chain.reviewCycles += 1;
284
+ this.setWrfcWorkPlanTaskStatus(chain, agentId, 'done');
195
285
  await this.processReview(chain, review);
196
286
  }
197
287
  if (this.planManager) {
@@ -208,6 +298,20 @@ export class WrfcController {
208
298
  return;
209
299
  if (agentId === chain.ownerAgentId && (chain.state === 'passed' || chain.state === 'failed'))
210
300
  return;
301
+ if (agentId === chain.ownerAgentId) {
302
+ this.keepOwnerAgentActive(chain, 'Ignored premature owner failure event; WRFC lifecycle is still active');
303
+ this.appendOwnerDecision(chain, 'owner_failure_ignored', errorMessage
304
+ ? `Ignored premature owner failure before terminal chain state: ${errorMessage}`
305
+ : 'Ignored premature owner failure before terminal chain state', { agentId });
306
+ logger.warn('WrfcController: ignored premature owner failure before terminal chain state', {
307
+ chainId: chain.id,
308
+ agentId,
309
+ state: chain.state,
310
+ error: errorMessage,
311
+ });
312
+ return;
313
+ }
314
+ this.setWrfcWorkPlanTaskStatus(chain, agentId, 'failed', errorMessage ?? `Agent ${agentId} failed`);
211
315
  this.failChain(chain, errorMessage ?? `Agent ${agentId} failed`);
212
316
  }
213
317
  onAgentCancelled(agentId, reason) {
@@ -215,9 +319,11 @@ export class WrfcController {
215
319
  if (!chain || chain.state === 'passed' || chain.state === 'failed')
216
320
  return;
217
321
  if (agentId === chain.ownerAgentId) {
322
+ this.setWrfcWorkPlanTaskStatus(chain, agentId, 'cancelled', reason ?? 'WRFC owner agent cancelled');
218
323
  this.cancelChain(chain, reason ?? 'WRFC owner agent cancelled');
219
324
  return;
220
325
  }
326
+ this.setWrfcWorkPlanTaskStatus(chain, agentId, 'cancelled', reason ?? `Agent ${agentId} cancelled`);
221
327
  this.failChain(chain, reason ?? `Agent ${agentId} cancelled`);
222
328
  }
223
329
  startReview(chain, report) {
@@ -236,9 +342,8 @@ export class WrfcController {
236
342
  }
237
343
  const reviewerRecord = this.spawnWrfcAgent(chain, 'reviewer', 'reviewer', reviewTask, true);
238
344
  chain.reviewerAgentId = reviewerRecord.id;
239
- reviewerRecord.wrfcRole = 'reviewer';
345
+ this.applyWrfcAgentMetadata(chain, reviewerRecord, 'reviewer');
240
346
  chain.allAgentIds.push(reviewerRecord.id);
241
- reviewerRecord.wrfcId = chain.id;
242
347
  this.messageBus.registerAgent({
243
348
  agentId: reviewerRecord.id,
244
349
  role: 'reviewer',
@@ -254,6 +359,7 @@ export class WrfcController {
254
359
  role: 'reviewer',
255
360
  record: reviewerRecord,
256
361
  });
362
+ this.upsertWrfcWorkPlanTask(chain, 'reviewer', reviewerRecord, 'in_progress');
257
363
  }
258
364
  async processReview(chain, review) {
259
365
  const threshold = getWrfcScoreThreshold(this.configManager);
@@ -353,9 +459,8 @@ export class WrfcController {
353
459
  });
354
460
  const fixerRecord = this.spawnWrfcAgent(chain, 'fixer', 'engineer', buildFixTask(chain.id, chain.task, review, getWrfcScoreThreshold(this.configManager), chain.fixAttempts, chain.constraints, review.constraintFindings ?? []), true);
355
461
  chain.fixerAgentId = fixerRecord.id;
356
- fixerRecord.wrfcRole = 'fixer';
462
+ this.applyWrfcAgentMetadata(chain, fixerRecord, 'fixer');
357
463
  chain.allAgentIds.push(fixerRecord.id);
358
- fixerRecord.wrfcId = chain.id;
359
464
  this.messageBus.registerAgent({
360
465
  agentId: fixerRecord.id,
361
466
  role: 'fixer',
@@ -379,6 +484,7 @@ export class WrfcController {
379
484
  role: 'fixer',
380
485
  record: fixerRecord,
381
486
  });
487
+ this.upsertWrfcWorkPlanTask(chain, 'fixer', fixerRecord, 'in_progress');
382
488
  }
383
489
  async runGates(chain) {
384
490
  this.transition(chain, 'gating');
@@ -489,10 +595,9 @@ export class WrfcController {
489
595
  });
490
596
  const gateFixTask = buildGateFailureTask(chain.id, chain.task, failedGates, chain.constraints);
491
597
  const fixerRecord = this.spawnWrfcAgent(chain, 'fixer', 'engineer', gateFixTask, true);
492
- fixerRecord.wrfcRole = 'fixer';
598
+ this.applyWrfcAgentMetadata(chain, fixerRecord, 'fixer');
493
599
  chain.fixerAgentId = fixerRecord.id;
494
600
  chain.allAgentIds.push(fixerRecord.id);
495
- fixerRecord.wrfcId = chain.id;
496
601
  this.messageBus.registerAgent({
497
602
  agentId: fixerRecord.id,
498
603
  role: 'fixer',
@@ -516,6 +621,7 @@ export class WrfcController {
516
621
  role: 'fixer',
517
622
  record: fixerRecord,
518
623
  });
624
+ this.upsertWrfcWorkPlanTask(chain, 'fixer', fixerRecord, 'in_progress');
519
625
  }
520
626
  scheduleChainCleanup(chain) {
521
627
  const timer = setTimeout(() => {
@@ -608,6 +714,7 @@ export class WrfcController {
608
714
  }
609
715
  chain.error = reason;
610
716
  chain.completedAt = Date.now();
717
+ this.setWrfcWorkPlanTaskStatus(chain, chain.ownerAgentId, 'failed', reason);
611
718
  this.cancelRunningChildren(chain);
612
719
  this.appendOwnerDecision(chain, 'chain_failed', reason, {
613
720
  agentId: chain.ownerAgentId,
@@ -655,6 +762,7 @@ export class WrfcController {
655
762
  chain.error = reason;
656
763
  chain.completedAt = Date.now();
657
764
  chain.ownerTerminalEmitted = true;
765
+ this.setWrfcWorkPlanTaskStatus(chain, chain.ownerAgentId, 'cancelled', reason);
658
766
  this.appendOwnerDecision(chain, 'chain_cancelled', reason, {
659
767
  agentId: chain.ownerAgentId,
660
768
  });
@@ -764,9 +872,8 @@ export class WrfcController {
764
872
  };
765
873
  this.chains.set(chain.id, chain);
766
874
  emitWrfcGraphCreated(this.runtimeBus, this.sessionId, chain.id, `WRFC: ${ownerRecord.task}`);
767
- ownerRecord.wrfcId = chain.id;
768
- ownerRecord.wrfcRole = 'owner';
769
- ownerRecord.progress = 'WRFC owner supervising child agents';
875
+ this.applyWrfcAgentMetadata(chain, ownerRecord, 'owner');
876
+ this.keepOwnerAgentActive(chain);
770
877
  this.messageBus.registerAgent({
771
878
  agentId: ownerRecord.id,
772
879
  template: ownerRecord.template,
@@ -775,16 +882,17 @@ export class WrfcController {
775
882
  this.appendOwnerDecision(chain, 'chain_created', 'WRFC owner created for original ask', {
776
883
  agentId: ownerRecord.id,
777
884
  });
885
+ this.upsertWrfcWorkPlanTask(chain, 'owner', ownerRecord, 'pending');
778
886
  return chain;
779
887
  }
780
888
  startEngineeringChain(chain, emitCreated) {
781
889
  this.activeChainCount += 1;
782
890
  this.transition(chain, 'engineering');
891
+ this.setWrfcWorkPlanTaskStatus(chain, chain.ownerAgentId, 'in_progress');
783
892
  const engineerRecord = this.spawnWrfcAgent(chain, 'engineer', 'engineer', chain.task, true);
784
- engineerRecord.wrfcRole = 'engineer';
893
+ this.applyWrfcAgentMetadata(chain, engineerRecord, 'engineer');
785
894
  chain.engineerAgentId = engineerRecord.id;
786
895
  chain.allAgentIds.push(engineerRecord.id);
787
- engineerRecord.wrfcId = chain.id;
788
896
  this.messageBus.registerAgent({
789
897
  agentId: engineerRecord.id,
790
898
  role: 'engineer',
@@ -799,6 +907,7 @@ export class WrfcController {
799
907
  role: 'engineer',
800
908
  record: engineerRecord,
801
909
  });
910
+ this.upsertWrfcWorkPlanTask(chain, 'engineer', engineerRecord, 'in_progress');
802
911
  }
803
912
  handleEngineerCompletion(chain, agentId, report) {
804
913
  this.completeCurrentNode(chain, report.summary);
@@ -885,6 +994,7 @@ export class WrfcController {
885
994
  this.appendOwnerDecision(chain, 'chain_passed', 'WRFC full-scope review and quality gates passed', {
886
995
  agentId: chain.ownerAgentId,
887
996
  });
997
+ this.setWrfcWorkPlanTaskStatus(chain, chain.ownerAgentId, 'done', 'WRFC full-scope review and quality gates passed');
888
998
  this.completeOwnerAgent(chain, 'completed', `WRFC chain ${chain.id} passed`);
889
999
  emitWrfcChainPassed(this.runtimeBus, this.sessionId, chain.id);
890
1000
  this.scheduleChainCleanup(chain);
@@ -896,6 +1006,7 @@ export class WrfcController {
896
1006
  const owner = this.agentManager.getStatus(chain.ownerAgentId);
897
1007
  if (!owner)
898
1008
  return;
1009
+ this.applyWrfcAgentMetadata(chain, owner, 'owner');
899
1010
  owner.status = status;
900
1011
  owner.completedAt = Date.now();
901
1012
  owner.progress = message;
@@ -924,6 +1035,119 @@ export class WrfcController {
924
1035
  });
925
1036
  }
926
1037
  }
1038
+ upsertWrfcWorkPlanTask(chain, role, record, status) {
1039
+ if (!this.workPlanService)
1040
+ return;
1041
+ const taskId = this.workPlanTaskIdForAgent(chain, record.id, role);
1042
+ const task = {
1043
+ taskId,
1044
+ title: this.workPlanTaskTitle(role, chain.task),
1045
+ notes: role === 'owner'
1046
+ ? 'WRFC owner chain supervising lifecycle child agents.'
1047
+ : `WRFC ${role} phase for the owner chain.`,
1048
+ owner: role,
1049
+ status,
1050
+ source: 'wrfc',
1051
+ chainId: chain.id,
1052
+ phaseId: role,
1053
+ agentId: record.id,
1054
+ originSurface: 'daemon',
1055
+ tags: ['wrfc', role],
1056
+ parentTaskId: role === 'owner' ? undefined : this.workPlanTaskIdForAgent(chain, chain.ownerAgentId, 'owner'),
1057
+ metadata: {
1058
+ wrfcState: chain.state,
1059
+ agentTemplate: record.template,
1060
+ },
1061
+ };
1062
+ this.enqueueWrfcWorkPlanTaskOperation(taskId, async () => {
1063
+ try {
1064
+ await this.workPlanService?.createWorkPlanTask({ task });
1065
+ }
1066
+ catch (error) {
1067
+ if (!(error instanceof Error) || !error.message.includes('already exists'))
1068
+ throw error;
1069
+ await this.workPlanService?.updateWorkPlanTask({
1070
+ taskId,
1071
+ patch: {
1072
+ ...task,
1073
+ taskId: undefined,
1074
+ },
1075
+ });
1076
+ }
1077
+ }, {
1078
+ chainId: chain.id,
1079
+ agentId: record.id,
1080
+ role,
1081
+ action: 'upsert',
1082
+ });
1083
+ }
1084
+ setWrfcWorkPlanTaskStatus(chain, agentId, status, reason) {
1085
+ if (!this.workPlanService)
1086
+ return;
1087
+ const role = this.workPlanRoleForAgent(chain, agentId);
1088
+ if (!role)
1089
+ return;
1090
+ const taskId = this.workPlanTaskIdForAgent(chain, agentId, role);
1091
+ this.enqueueWrfcWorkPlanTaskOperation(taskId, async () => {
1092
+ await this.workPlanService?.updateWorkPlanTask({
1093
+ taskId,
1094
+ patch: {
1095
+ status,
1096
+ metadata: {
1097
+ wrfcState: chain.state,
1098
+ ...(reason ? { statusReason: reason } : {}),
1099
+ },
1100
+ },
1101
+ });
1102
+ }, {
1103
+ chainId: chain.id,
1104
+ agentId,
1105
+ role,
1106
+ action: 'status',
1107
+ });
1108
+ }
1109
+ enqueueWrfcWorkPlanTaskOperation(taskId, operation, context) {
1110
+ const previous = this.workPlanTaskQueues.get(taskId) ?? Promise.resolve();
1111
+ let next;
1112
+ next = previous
1113
+ .catch(() => undefined)
1114
+ .then(operation)
1115
+ .catch((error) => {
1116
+ logger.warn('WrfcController: failed to sync work-plan task', {
1117
+ chainId: context.chainId,
1118
+ agentId: context.agentId,
1119
+ role: context.role,
1120
+ action: context.action,
1121
+ error: summarizeError(error),
1122
+ });
1123
+ })
1124
+ .finally(() => {
1125
+ if (this.workPlanTaskQueues.get(taskId) === next) {
1126
+ this.workPlanTaskQueues.delete(taskId);
1127
+ }
1128
+ });
1129
+ this.workPlanTaskQueues.set(taskId, next);
1130
+ }
1131
+ workPlanRoleForAgent(chain, agentId) {
1132
+ if (agentId === chain.ownerAgentId)
1133
+ return 'owner';
1134
+ if (agentId === chain.engineerAgentId)
1135
+ return 'engineer';
1136
+ if (agentId === chain.reviewerAgentId)
1137
+ return 'reviewer';
1138
+ if (agentId === chain.fixerAgentId)
1139
+ return 'fixer';
1140
+ return null;
1141
+ }
1142
+ workPlanTaskIdForAgent(chain, agentId, role) {
1143
+ return `wrfc-${chain.id}-${role}-${agentId}`;
1144
+ }
1145
+ workPlanTaskTitle(role, task) {
1146
+ const label = role === 'owner'
1147
+ ? 'WRFC owner'
1148
+ : role.charAt(0).toUpperCase() + role.slice(1);
1149
+ return `${label}: ${task.slice(0, 120)}`;
1150
+ }
927
1151
  safeDequeueNext() {
928
1152
  this.dequeueNext().catch((error) => {
929
1153
  logger.error('WrfcController.dequeueNext unhandled error', { error: summarizeError(error) });