@yuaone/core 0.6.1 → 0.7.1
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.
- package/dist/agent-loop.d.ts +38 -0
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +532 -117
- package/dist/agent-loop.js.map +1 -1
- package/dist/code-indexer.d.ts +50 -0
- package/dist/code-indexer.d.ts.map +1 -0
- package/dist/code-indexer.js +199 -0
- package/dist/code-indexer.js.map +1 -0
- package/dist/failure-recovery.d.ts +15 -2
- package/dist/failure-recovery.d.ts.map +1 -1
- package/dist/failure-recovery.js +53 -2
- package/dist/failure-recovery.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/llm-client.d.ts +20 -2
- package/dist/llm-client.d.ts.map +1 -1
- package/dist/llm-client.js +213 -8
- package/dist/llm-client.js.map +1 -1
- package/dist/llm-orchestrator.d.ts +74 -0
- package/dist/llm-orchestrator.d.ts.map +1 -0
- package/dist/llm-orchestrator.js +144 -0
- package/dist/llm-orchestrator.js.map +1 -0
- package/dist/planner/index.d.ts +9 -0
- package/dist/planner/index.d.ts.map +1 -0
- package/dist/planner/index.js +5 -0
- package/dist/planner/index.js.map +1 -0
- package/dist/planner/milestone-checker.d.ts +48 -0
- package/dist/planner/milestone-checker.d.ts.map +1 -0
- package/dist/planner/milestone-checker.js +113 -0
- package/dist/planner/milestone-checker.js.map +1 -0
- package/dist/planner/plan-evaluator.d.ts +35 -0
- package/dist/planner/plan-evaluator.d.ts.map +1 -0
- package/dist/planner/plan-evaluator.js +92 -0
- package/dist/planner/plan-evaluator.js.map +1 -0
- package/dist/planner/replanning-engine.d.ts +37 -0
- package/dist/planner/replanning-engine.d.ts.map +1 -0
- package/dist/planner/replanning-engine.js +130 -0
- package/dist/planner/replanning-engine.js.map +1 -0
- package/dist/planner/risk-estimator.d.ts +44 -0
- package/dist/planner/risk-estimator.d.ts.map +1 -0
- package/dist/planner/risk-estimator.js +108 -0
- package/dist/planner/risk-estimator.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/world-model/index.d.ts +8 -0
- package/dist/world-model/index.d.ts.map +1 -0
- package/dist/world-model/index.js +5 -0
- package/dist/world-model/index.js.map +1 -0
- package/dist/world-model/simulation-engine.d.ts +58 -0
- package/dist/world-model/simulation-engine.d.ts.map +1 -0
- package/dist/world-model/simulation-engine.js +191 -0
- package/dist/world-model/simulation-engine.js.map +1 -0
- package/dist/world-model/state-store.d.ts +149 -0
- package/dist/world-model/state-store.d.ts.map +1 -0
- package/dist/world-model/state-store.js +379 -0
- package/dist/world-model/state-store.js.map +1 -0
- package/dist/world-model/state-updater.d.ts +35 -0
- package/dist/world-model/state-updater.d.ts.map +1 -0
- package/dist/world-model/state-updater.js +131 -0
- package/dist/world-model/state-updater.js.map +1 -0
- package/dist/world-model/transition-model.d.ts +54 -0
- package/dist/world-model/transition-model.d.ts.map +1 -0
- package/dist/world-model/transition-model.js +240 -0
- package/dist/world-model/transition-model.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/planner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module planner/milestone-checker
|
|
3
|
+
* @description Tracks milestone progress within a HierarchicalPlan execution.
|
|
4
|
+
* Milestones are checkpoints derived from tactical tasks that indicate overall
|
|
5
|
+
* plan health and schedule adherence.
|
|
6
|
+
*/
|
|
7
|
+
import type { HierarchicalPlan } from "../hierarchical-planner.js";
|
|
8
|
+
export interface Milestone {
|
|
9
|
+
id: string;
|
|
10
|
+
description: string;
|
|
11
|
+
targetTaskIds: string[];
|
|
12
|
+
expectedByIteration: number;
|
|
13
|
+
priority: "must" | "should" | "could";
|
|
14
|
+
}
|
|
15
|
+
export interface MilestoneStatus {
|
|
16
|
+
achieved: Milestone[];
|
|
17
|
+
missed: Milestone[];
|
|
18
|
+
pending: Milestone[];
|
|
19
|
+
behindSchedule: boolean;
|
|
20
|
+
consecutiveMisses: number;
|
|
21
|
+
overallProgress: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class MilestoneChecker {
|
|
24
|
+
private milestones;
|
|
25
|
+
private consecutiveMisses;
|
|
26
|
+
private lastStatus;
|
|
27
|
+
/**
|
|
28
|
+
* Extract milestones from a HierarchicalPlan.
|
|
29
|
+
* Groups tactical tasks into milestones:
|
|
30
|
+
* - Independent tasks (no dependsOn) → first "should" milestone
|
|
31
|
+
* - Every 3 tasks → one "should" milestone
|
|
32
|
+
* - Last task → one "must" milestone (completion)
|
|
33
|
+
*/
|
|
34
|
+
extractMilestones(plan: HierarchicalPlan): Milestone[];
|
|
35
|
+
/**
|
|
36
|
+
* Evaluate current milestone status given completed tasks and current iteration.
|
|
37
|
+
*/
|
|
38
|
+
check(milestones: Milestone[], completedTaskIds: string[], currentIteration: number): MilestoneStatus;
|
|
39
|
+
/**
|
|
40
|
+
* Register externally defined milestones.
|
|
41
|
+
*/
|
|
42
|
+
setMilestones(milestones: Milestone[]): void;
|
|
43
|
+
/**
|
|
44
|
+
* Get milestones at risk: pending milestones past their expectedByIteration.
|
|
45
|
+
*/
|
|
46
|
+
getAtRisk(currentIteration: number): Milestone[];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=milestone-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"milestone-checker.d.ts","sourceRoot":"","sources":["../../src/planner/milestone-checker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAInE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,UAAU,CAAgC;IAElD;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAAE;IA8CtD;;OAEG;IACH,KAAK,CACH,UAAU,EAAE,SAAS,EAAE,EACvB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,gBAAgB,EAAE,MAAM,GACvB,eAAe;IAsClB;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IAI5C;;OAEG;IACH,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EAAE;CAOjD"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module planner/milestone-checker
|
|
3
|
+
* @description Tracks milestone progress within a HierarchicalPlan execution.
|
|
4
|
+
* Milestones are checkpoints derived from tactical tasks that indicate overall
|
|
5
|
+
* plan health and schedule adherence.
|
|
6
|
+
*/
|
|
7
|
+
// ─── MilestoneChecker ───
|
|
8
|
+
export class MilestoneChecker {
|
|
9
|
+
milestones = [];
|
|
10
|
+
consecutiveMisses = 0;
|
|
11
|
+
lastStatus = null;
|
|
12
|
+
/**
|
|
13
|
+
* Extract milestones from a HierarchicalPlan.
|
|
14
|
+
* Groups tactical tasks into milestones:
|
|
15
|
+
* - Independent tasks (no dependsOn) → first "should" milestone
|
|
16
|
+
* - Every 3 tasks → one "should" milestone
|
|
17
|
+
* - Last task → one "must" milestone (completion)
|
|
18
|
+
*/
|
|
19
|
+
extractMilestones(plan) {
|
|
20
|
+
const tasks = plan.tactical;
|
|
21
|
+
if (tasks.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
const milestones = [];
|
|
24
|
+
const totalIterations = plan.totalEstimatedIterations;
|
|
25
|
+
// Milestone 1: Initial exploration (first batch of independent tasks)
|
|
26
|
+
const independentFirst = tasks
|
|
27
|
+
.filter((t) => t.dependsOn.length === 0)
|
|
28
|
+
.map((t) => t.id);
|
|
29
|
+
if (independentFirst.length > 0) {
|
|
30
|
+
milestones.push({
|
|
31
|
+
id: "milestone:initial",
|
|
32
|
+
description: "Initial exploration and file reading complete",
|
|
33
|
+
targetTaskIds: independentFirst.slice(0, Math.min(3, independentFirst.length)),
|
|
34
|
+
expectedByIteration: Math.floor(totalIterations * 0.2),
|
|
35
|
+
priority: "should",
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// Middle milestones: every 3 tasks
|
|
39
|
+
for (let i = 0; i < tasks.length - 1; i += 3) {
|
|
40
|
+
const batch = tasks.slice(i, i + 3).map((t) => t.id);
|
|
41
|
+
milestones.push({
|
|
42
|
+
id: `milestone:batch-${Math.floor(i / 3)}`,
|
|
43
|
+
description: `Tasks ${i + 1}–${Math.min(i + 3, tasks.length)} complete`,
|
|
44
|
+
targetTaskIds: batch,
|
|
45
|
+
expectedByIteration: Math.floor(totalIterations * ((i + 3) / tasks.length)),
|
|
46
|
+
priority: "should",
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// Final milestone: all tasks done
|
|
50
|
+
milestones.push({
|
|
51
|
+
id: "milestone:complete",
|
|
52
|
+
description: "All planned tasks completed",
|
|
53
|
+
targetTaskIds: tasks.map((t) => t.id),
|
|
54
|
+
expectedByIteration: totalIterations,
|
|
55
|
+
priority: "must",
|
|
56
|
+
});
|
|
57
|
+
this.milestones = milestones;
|
|
58
|
+
return milestones;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Evaluate current milestone status given completed tasks and current iteration.
|
|
62
|
+
*/
|
|
63
|
+
check(milestones, completedTaskIds, currentIteration) {
|
|
64
|
+
const completedSet = new Set(completedTaskIds);
|
|
65
|
+
const achieved = [];
|
|
66
|
+
const missed = [];
|
|
67
|
+
const pending = [];
|
|
68
|
+
for (const m of milestones) {
|
|
69
|
+
const allDone = m.targetTaskIds.every((id) => completedSet.has(id));
|
|
70
|
+
if (allDone) {
|
|
71
|
+
achieved.push(m);
|
|
72
|
+
}
|
|
73
|
+
else if (currentIteration > m.expectedByIteration) {
|
|
74
|
+
missed.push(m);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
pending.push(m);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Track consecutive misses for "must" milestones
|
|
81
|
+
const mustMissed = missed.filter((m) => m.priority === "must").length;
|
|
82
|
+
if (mustMissed > 0) {
|
|
83
|
+
this.consecutiveMisses++;
|
|
84
|
+
}
|
|
85
|
+
else if (achieved.length > 0) {
|
|
86
|
+
this.consecutiveMisses = 0;
|
|
87
|
+
}
|
|
88
|
+
const status = {
|
|
89
|
+
achieved,
|
|
90
|
+
missed,
|
|
91
|
+
pending,
|
|
92
|
+
behindSchedule: missed.some((m) => m.priority === "must"),
|
|
93
|
+
consecutiveMisses: this.consecutiveMisses,
|
|
94
|
+
overallProgress: milestones.length > 0 ? achieved.length / milestones.length : 1,
|
|
95
|
+
};
|
|
96
|
+
this.lastStatus = status;
|
|
97
|
+
return status;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Register externally defined milestones.
|
|
101
|
+
*/
|
|
102
|
+
setMilestones(milestones) {
|
|
103
|
+
this.milestones = milestones;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get milestones at risk: pending milestones past their expectedByIteration.
|
|
107
|
+
*/
|
|
108
|
+
getAtRisk(currentIteration) {
|
|
109
|
+
return this.milestones.filter((m) => currentIteration > m.expectedByIteration &&
|
|
110
|
+
!this.lastStatus?.achieved.some((a) => a.id === m.id));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=milestone-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"milestone-checker.js","sourceRoot":"","sources":["../../src/planner/milestone-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module planner/plan-evaluator
|
|
3
|
+
* @description Evaluates the health of a running HierarchicalPlan.
|
|
4
|
+
* Detects deviations, predicts token overruns, and recommends corrective actions.
|
|
5
|
+
*/
|
|
6
|
+
import type { HierarchicalPlan } from "../hierarchical-planner.js";
|
|
7
|
+
import type { StateStore } from "../world-model/state-store.js";
|
|
8
|
+
import type { SimulationEngine } from "../world-model/simulation-engine.js";
|
|
9
|
+
import type { ToolResult } from "../types.js";
|
|
10
|
+
export type DeviantType = "unexpected_file" | "scope_creep" | "blocked_dependency" | "token_overrun" | "quality_regression";
|
|
11
|
+
export interface PlanDeviation {
|
|
12
|
+
type: DeviantType;
|
|
13
|
+
description: string;
|
|
14
|
+
severity: "low" | "medium" | "high";
|
|
15
|
+
affectedTaskIds: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface PlanHealth {
|
|
18
|
+
score: number;
|
|
19
|
+
completedTasks: number;
|
|
20
|
+
totalTasks: number;
|
|
21
|
+
progressRatio: number;
|
|
22
|
+
tokensUsed: number;
|
|
23
|
+
tokensRemaining: number;
|
|
24
|
+
deviations: PlanDeviation[];
|
|
25
|
+
recommendation: "continue" | "replan_minor" | "replan_major" | "abort";
|
|
26
|
+
}
|
|
27
|
+
export declare class PlanEvaluator {
|
|
28
|
+
private stateStore;
|
|
29
|
+
private simulationEngine;
|
|
30
|
+
constructor(stateStore: StateStore, simulationEngine: SimulationEngine);
|
|
31
|
+
evaluate(plan: HierarchicalPlan, completedTaskIds: string[], toolResults: ToolResult[], tokensUsed: number, tokenBudget: number): PlanHealth;
|
|
32
|
+
detectUnexpectedChanges(plan: HierarchicalPlan, actualChangedFiles: string[]): PlanDeviation[];
|
|
33
|
+
predictTokenOverrun(plan: HierarchicalPlan, tokensUsed: number, completedRatio: number): boolean;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=plan-evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-evaluator.d.ts","sourceRoot":"","sources":["../../src/planner/plan-evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,MAAM,MAAM,WAAW,GACnB,iBAAiB,GACjB,aAAa,GACb,oBAAoB,GACpB,eAAe,GACf,oBAAoB,CAAC;AAEzB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,cAAc,EAAE,UAAU,GAAG,cAAc,GAAG,cAAc,GAAG,OAAO,CAAC;CACxE;AAID,qBAAa,aAAa;IAEtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,gBAAgB;gBADhB,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,gBAAgB;IAG5C,QAAQ,CACN,IAAI,EAAE,gBAAgB,EACtB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,WAAW,EAAE,UAAU,EAAE,EACzB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,UAAU;IAoEb,uBAAuB,CACrB,IAAI,EAAE,gBAAgB,EACtB,kBAAkB,EAAE,MAAM,EAAE,GAC3B,aAAa,EAAE;IAelB,mBAAmB,CACjB,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO;CAKX"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module planner/plan-evaluator
|
|
3
|
+
* @description Evaluates the health of a running HierarchicalPlan.
|
|
4
|
+
* Detects deviations, predicts token overruns, and recommends corrective actions.
|
|
5
|
+
*/
|
|
6
|
+
// ─── PlanEvaluator ───
|
|
7
|
+
export class PlanEvaluator {
|
|
8
|
+
stateStore;
|
|
9
|
+
simulationEngine;
|
|
10
|
+
constructor(stateStore, simulationEngine) {
|
|
11
|
+
this.stateStore = stateStore;
|
|
12
|
+
this.simulationEngine = simulationEngine;
|
|
13
|
+
}
|
|
14
|
+
evaluate(plan, completedTaskIds, toolResults, tokensUsed, tokenBudget) {
|
|
15
|
+
const completedSet = new Set(completedTaskIds);
|
|
16
|
+
const totalTasks = plan.tactical.length;
|
|
17
|
+
const completedTasks = completedTaskIds.length;
|
|
18
|
+
const progressRatio = totalTasks > 0 ? completedTasks / totalTasks : 0;
|
|
19
|
+
const tokensRemaining = tokenBudget - tokensUsed;
|
|
20
|
+
const deviations = [];
|
|
21
|
+
// 1. Detect unexpected file changes
|
|
22
|
+
// ToolResult has no args field — callers should pass changedFiles separately.
|
|
23
|
+
// We collect tool names that indicate file writes for quality assessment only.
|
|
24
|
+
const writeToolCount = toolResults
|
|
25
|
+
.filter(r => r.success && (r.name === "file_write" || r.name === "file_edit"))
|
|
26
|
+
.length;
|
|
27
|
+
void writeToolCount; // available for future heuristics
|
|
28
|
+
deviations.push(...this.detectUnexpectedChanges(plan, []));
|
|
29
|
+
// 2. Detect token overrun risk
|
|
30
|
+
if (this.predictTokenOverrun(plan, tokensUsed, progressRatio)) {
|
|
31
|
+
deviations.push({
|
|
32
|
+
type: "token_overrun",
|
|
33
|
+
description: `Token usage on pace to exceed budget (used ${Math.round(tokensUsed / 1000)}K / ${Math.round(tokenBudget / 1000)}K at ${Math.round(progressRatio * 100)}% completion)`,
|
|
34
|
+
severity: tokensUsed / tokenBudget > 0.9 ? "high" : "medium",
|
|
35
|
+
affectedTaskIds: plan.tactical.slice(completedTasks).map(t => t.id),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// 3. Check for failed tool results
|
|
39
|
+
const failedCount = toolResults.filter(r => !r.success).length;
|
|
40
|
+
if (failedCount > 2) {
|
|
41
|
+
deviations.push({
|
|
42
|
+
type: "quality_regression",
|
|
43
|
+
description: `${failedCount} tool executions failed`,
|
|
44
|
+
severity: failedCount > 5 ? "high" : "medium",
|
|
45
|
+
affectedTaskIds: [],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// 4. Compute health score (100 = perfect)
|
|
49
|
+
let score = 100;
|
|
50
|
+
for (const d of deviations) {
|
|
51
|
+
score -= d.severity === "high" ? 25 : d.severity === "medium" ? 10 : 5;
|
|
52
|
+
}
|
|
53
|
+
// Penalize low progress ratio relative to tokens used
|
|
54
|
+
const efficiency = progressRatio / Math.max(tokensUsed / tokenBudget, 0.01);
|
|
55
|
+
if (efficiency < 0.5)
|
|
56
|
+
score -= 15;
|
|
57
|
+
score = Math.max(0, Math.min(100, score));
|
|
58
|
+
const recommendation = score < 20 ? "abort" :
|
|
59
|
+
score < 45 ? "replan_major" :
|
|
60
|
+
score < 65 ? "replan_minor" :
|
|
61
|
+
"continue";
|
|
62
|
+
return {
|
|
63
|
+
score,
|
|
64
|
+
completedTasks,
|
|
65
|
+
totalTasks,
|
|
66
|
+
progressRatio,
|
|
67
|
+
tokensUsed,
|
|
68
|
+
tokensRemaining,
|
|
69
|
+
deviations,
|
|
70
|
+
recommendation,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
detectUnexpectedChanges(plan, actualChangedFiles) {
|
|
74
|
+
const plannedFiles = new Set(plan.tactical.flatMap(t => [...t.targetFiles, ...t.readFiles]));
|
|
75
|
+
const unexpected = actualChangedFiles.filter(f => !plannedFiles.has(f));
|
|
76
|
+
if (unexpected.length === 0)
|
|
77
|
+
return [];
|
|
78
|
+
return [{
|
|
79
|
+
type: "unexpected_file",
|
|
80
|
+
description: `${unexpected.length} files modified outside plan: ${unexpected.slice(0, 3).join(", ")}${unexpected.length > 3 ? " ..." : ""}`,
|
|
81
|
+
severity: unexpected.length > 5 ? "high" : unexpected.length > 2 ? "medium" : "low",
|
|
82
|
+
affectedTaskIds: [],
|
|
83
|
+
}];
|
|
84
|
+
}
|
|
85
|
+
predictTokenOverrun(plan, tokensUsed, completedRatio) {
|
|
86
|
+
if (completedRatio < 0.1)
|
|
87
|
+
return false; // too early to predict
|
|
88
|
+
const projectedTotal = tokensUsed / completedRatio;
|
|
89
|
+
return projectedTotal > plan.estimatedTokenBudget * 1.3; // 30% over budget
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=plan-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-evaluator.js","sourceRoot":"","sources":["../../src/planner/plan-evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module planner/replanning-engine
|
|
3
|
+
* @description Proactive replanning engine — evaluates plan health mid-execution
|
|
4
|
+
* and triggers partial or full replanning when deviations are detected.
|
|
5
|
+
*/
|
|
6
|
+
import type { HierarchicalPlan, HierarchicalPlanner, TacticalTask } from "../hierarchical-planner.js";
|
|
7
|
+
import type { BYOKClient } from "../llm-client.js";
|
|
8
|
+
import type { WorldState } from "../world-model/state-store.js";
|
|
9
|
+
import type { ToolResult } from "../types.js";
|
|
10
|
+
import type { PlanEvaluator } from "./plan-evaluator.js";
|
|
11
|
+
import type { RiskEstimator } from "./risk-estimator.js";
|
|
12
|
+
import type { MilestoneChecker, Milestone } from "./milestone-checker.js";
|
|
13
|
+
export interface ReplanDecision {
|
|
14
|
+
shouldReplan: boolean;
|
|
15
|
+
scope: "none" | "operational" | "tactical" | "strategic";
|
|
16
|
+
trigger: string;
|
|
17
|
+
urgency: "low" | "medium" | "high" | "critical";
|
|
18
|
+
reasoning: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ProactiveReplanResult {
|
|
21
|
+
triggered: boolean;
|
|
22
|
+
decision: ReplanDecision;
|
|
23
|
+
newPlan?: HierarchicalPlan;
|
|
24
|
+
modifiedTasks?: TacticalTask[];
|
|
25
|
+
message: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class ReplanningEngine {
|
|
28
|
+
private planner;
|
|
29
|
+
private planEvaluator;
|
|
30
|
+
private riskEstimator;
|
|
31
|
+
private milestoneChecker;
|
|
32
|
+
constructor(planner: HierarchicalPlanner, planEvaluator: PlanEvaluator, riskEstimator: RiskEstimator, milestoneChecker: MilestoneChecker);
|
|
33
|
+
evaluate(plan: HierarchicalPlan, currentState: WorldState, completedTaskIds: string[], toolResults: ToolResult[], tokensUsed: number, tokenBudget: number, changedFiles: string[], currentIteration: number, activeMilestones: Milestone[], llmClient: BYOKClient): Promise<ProactiveReplanResult>;
|
|
34
|
+
private shouldTrigger;
|
|
35
|
+
private executeReplan;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=replanning-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replanning-engine.d.ts","sourceRoot":"","sources":["../../src/planner/replanning-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,EAEb,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAmB,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAI3F,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,UAAU,GAAG,WAAW,CAAC;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,gBAAgB;gBAHhB,OAAO,EAAE,mBAAmB,EAC5B,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB;IAGtC,QAAQ,CACZ,IAAI,EAAE,gBAAgB,EACtB,YAAY,EAAE,UAAU,EACxB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,WAAW,EAAE,UAAU,EAAE,EACzB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE,SAAS,EAAE,EAC7B,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,qBAAqB,CAAC;IAmDjC,OAAO,CAAC,aAAa;YAgFP,aAAa;CAwB5B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module planner/replanning-engine
|
|
3
|
+
* @description Proactive replanning engine — evaluates plan health mid-execution
|
|
4
|
+
* and triggers partial or full replanning when deviations are detected.
|
|
5
|
+
*/
|
|
6
|
+
// ─── ReplanningEngine ───
|
|
7
|
+
export class ReplanningEngine {
|
|
8
|
+
planner;
|
|
9
|
+
planEvaluator;
|
|
10
|
+
riskEstimator;
|
|
11
|
+
milestoneChecker;
|
|
12
|
+
constructor(planner, planEvaluator, riskEstimator, milestoneChecker) {
|
|
13
|
+
this.planner = planner;
|
|
14
|
+
this.planEvaluator = planEvaluator;
|
|
15
|
+
this.riskEstimator = riskEstimator;
|
|
16
|
+
this.milestoneChecker = milestoneChecker;
|
|
17
|
+
}
|
|
18
|
+
async evaluate(plan, currentState, completedTaskIds, toolResults, tokensUsed, tokenBudget, changedFiles, currentIteration, activeMilestones, llmClient) {
|
|
19
|
+
const remainingTasks = plan.tactical.filter(t => !completedTaskIds.includes(t.id));
|
|
20
|
+
const completedTasks = plan.tactical.filter(t => completedTaskIds.includes(t.id));
|
|
21
|
+
// 1. Evaluate plan health
|
|
22
|
+
const health = this.planEvaluator.evaluate(plan, completedTaskIds, toolResults, tokensUsed, tokenBudget);
|
|
23
|
+
// 2. Estimate risk
|
|
24
|
+
const risk = await this.riskEstimator.estimate(currentState, remainingTasks, completedTasks, changedFiles, tokensUsed, tokenBudget);
|
|
25
|
+
// 3. Check milestones
|
|
26
|
+
const milestoneStatus = this.milestoneChecker.check(activeMilestones, completedTaskIds, currentIteration);
|
|
27
|
+
// 4. Decide whether to replan
|
|
28
|
+
const decision = this.shouldTrigger(health, risk, milestoneStatus);
|
|
29
|
+
if (!decision.shouldReplan) {
|
|
30
|
+
return { triggered: false, decision, message: "Plan on track" };
|
|
31
|
+
}
|
|
32
|
+
// 5. Execute replan
|
|
33
|
+
try {
|
|
34
|
+
const result = await this.executeReplan(plan, decision, currentState, llmClient);
|
|
35
|
+
const message = `Proactive replan triggered (${decision.scope}): ${decision.trigger}`;
|
|
36
|
+
return { triggered: true, decision, modifiedTasks: result, message };
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
return {
|
|
40
|
+
triggered: false,
|
|
41
|
+
decision,
|
|
42
|
+
message: `Replan attempted but failed: ${String(err)}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
shouldTrigger(health, risk, milestoneStatus) {
|
|
47
|
+
// Critical: abort conditions
|
|
48
|
+
if (health.recommendation === "abort") {
|
|
49
|
+
return {
|
|
50
|
+
shouldReplan: true,
|
|
51
|
+
scope: "strategic",
|
|
52
|
+
trigger: "Plan health critical",
|
|
53
|
+
urgency: "critical",
|
|
54
|
+
reasoning: `Health score ${health.score}/100, recommendation: abort`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// High risk → strategic replan
|
|
58
|
+
if (risk.overall >= 85) {
|
|
59
|
+
return {
|
|
60
|
+
shouldReplan: true,
|
|
61
|
+
scope: "strategic",
|
|
62
|
+
trigger: `Risk score ${risk.overall}/100`,
|
|
63
|
+
urgency: "critical",
|
|
64
|
+
reasoning: risk.factors.join("; "),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Medium-high risk → tactical replan
|
|
68
|
+
if (risk.overall >= 70) {
|
|
69
|
+
return {
|
|
70
|
+
shouldReplan: true,
|
|
71
|
+
scope: "tactical",
|
|
72
|
+
trigger: `Elevated risk: ${risk.overall}/100`,
|
|
73
|
+
urgency: "high",
|
|
74
|
+
reasoning: risk.factors.join("; "),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Major health issues → major replan
|
|
78
|
+
if (health.recommendation === "replan_major") {
|
|
79
|
+
return {
|
|
80
|
+
shouldReplan: true,
|
|
81
|
+
scope: "tactical",
|
|
82
|
+
trigger: "Plan health deteriorated",
|
|
83
|
+
urgency: "high",
|
|
84
|
+
reasoning: health.deviations.map(d => d.description).join("; "),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Milestone misses
|
|
88
|
+
if (milestoneStatus.consecutiveMisses >= 2) {
|
|
89
|
+
return {
|
|
90
|
+
shouldReplan: true,
|
|
91
|
+
scope: "tactical",
|
|
92
|
+
trigger: `${milestoneStatus.consecutiveMisses} consecutive milestone misses`,
|
|
93
|
+
urgency: "high",
|
|
94
|
+
reasoning: "Falling behind schedule",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Minor issues → minor replan
|
|
98
|
+
if (health.recommendation === "replan_minor") {
|
|
99
|
+
return {
|
|
100
|
+
shouldReplan: true,
|
|
101
|
+
scope: "operational",
|
|
102
|
+
trigger: "Minor plan deviations",
|
|
103
|
+
urgency: "medium",
|
|
104
|
+
reasoning: health.deviations.map(d => d.description).join("; "),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
shouldReplan: false,
|
|
109
|
+
scope: "none",
|
|
110
|
+
trigger: "",
|
|
111
|
+
urgency: "low",
|
|
112
|
+
reasoning: "Plan healthy",
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async executeReplan(plan, decision, _currentState, llmClient) {
|
|
116
|
+
const triggerType = decision.scope === "strategic" ? "strategic" : "error";
|
|
117
|
+
const severity = decision.urgency === "critical" ? "critical" :
|
|
118
|
+
decision.urgency === "high" ? "major" :
|
|
119
|
+
"minor";
|
|
120
|
+
const trigger = {
|
|
121
|
+
type: triggerType,
|
|
122
|
+
description: `[Proactive] ${decision.trigger}: ${decision.reasoning}`,
|
|
123
|
+
affectedTaskIds: [],
|
|
124
|
+
severity,
|
|
125
|
+
};
|
|
126
|
+
const result = await this.planner.replan(plan, trigger, llmClient);
|
|
127
|
+
return result.modifiedTasks;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=replanning-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replanning-engine.js","sourceRoot":"","sources":["../../src/planner/replanning-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module planner/risk-estimator
|
|
3
|
+
* @description Estimates execution risk across multiple dimensions:
|
|
4
|
+
* build, test, scope, dependency, and token budget.
|
|
5
|
+
* Used by the autonomous planner to decide when to pause, re-plan, or alert.
|
|
6
|
+
*/
|
|
7
|
+
import type { ImpactAnalyzer } from "../impact-analyzer.js";
|
|
8
|
+
import type { TransitionModel } from "../world-model/transition-model.js";
|
|
9
|
+
import type { WorldState } from "../world-model/state-store.js";
|
|
10
|
+
import type { TacticalTask } from "../hierarchical-planner.js";
|
|
11
|
+
export interface RiskComponents {
|
|
12
|
+
buildRisk: number;
|
|
13
|
+
testRisk: number;
|
|
14
|
+
scopeRisk: number;
|
|
15
|
+
dependencyRisk: number;
|
|
16
|
+
tokenRisk: number;
|
|
17
|
+
}
|
|
18
|
+
export interface RiskScore {
|
|
19
|
+
overall: number;
|
|
20
|
+
components: RiskComponents;
|
|
21
|
+
factors: string[];
|
|
22
|
+
mitigations: string[];
|
|
23
|
+
level: "low" | "medium" | "high" | "critical";
|
|
24
|
+
}
|
|
25
|
+
export declare class RiskEstimator {
|
|
26
|
+
private transitionModel;
|
|
27
|
+
private impactAnalyzer;
|
|
28
|
+
constructor(transitionModel: TransitionModel, impactAnalyzer: ImpactAnalyzer);
|
|
29
|
+
/**
|
|
30
|
+
* Estimate overall risk given current world state, remaining tasks, and resource usage.
|
|
31
|
+
*/
|
|
32
|
+
estimate(currentState: WorldState, remainingTasks: TacticalTask[], completedTasks: TacticalTask[], changedFiles: string[], tokensUsed: number, tokenBudget: number): Promise<RiskScore>;
|
|
33
|
+
/**
|
|
34
|
+
* Estimate risk for a single task given the current world state.
|
|
35
|
+
* Returns a 0-100 score.
|
|
36
|
+
*/
|
|
37
|
+
estimateTaskRisk(task: TacticalTask, state: WorldState): Promise<number>;
|
|
38
|
+
/**
|
|
39
|
+
* Returns true if the risk score's overall value meets or exceeds the threshold.
|
|
40
|
+
* Default threshold is 70 ("high").
|
|
41
|
+
*/
|
|
42
|
+
isHighRisk(score: RiskScore, threshold?: number): boolean;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=risk-estimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk-estimator.d.ts","sourceRoot":"","sources":["../../src/planner/risk-estimator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI/D,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CAC/C;AAID,qBAAa,aAAa;IAEtB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,cAAc;gBADd,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,cAAc;IAGxC;;OAEG;IACG,QAAQ,CACZ,YAAY,EAAE,UAAU,EACxB,cAAc,EAAE,YAAY,EAAE,EAC9B,cAAc,EAAE,YAAY,EAAE,EAC9B,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,CAAC;IA6ErB;;;OAGG;IACG,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB9E;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,SAAK,GAAG,OAAO;CAGtD"}
|