@yuaone/core 0.9.7 → 0.9.9
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/__tests__/context-manager.test.js +5 -9
- package/dist/__tests__/context-manager.test.js.map +1 -1
- package/dist/agent-coordinator.d.ts +172 -0
- package/dist/agent-coordinator.d.ts.map +1 -0
- package/dist/agent-coordinator.js +390 -0
- package/dist/agent-coordinator.js.map +1 -0
- package/dist/agent-loop.d.ts +83 -29
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +697 -335
- package/dist/agent-loop.js.map +1 -1
- package/dist/agent-reputation.d.ts +72 -0
- package/dist/agent-reputation.d.ts.map +1 -0
- package/dist/agent-reputation.js +222 -0
- package/dist/agent-reputation.js.map +1 -0
- package/dist/arch-summarizer.d.ts +48 -0
- package/dist/arch-summarizer.d.ts.map +1 -0
- package/dist/arch-summarizer.js +239 -0
- package/dist/arch-summarizer.js.map +1 -0
- package/dist/autonomous/explicit-planner.d.ts +45 -0
- package/dist/autonomous/explicit-planner.d.ts.map +1 -0
- package/dist/autonomous/explicit-planner.js +99 -0
- package/dist/autonomous/explicit-planner.js.map +1 -0
- package/dist/autonomous/incident-debugger.d.ts +78 -0
- package/dist/autonomous/incident-debugger.d.ts.map +1 -0
- package/dist/autonomous/incident-debugger.js +324 -0
- package/dist/autonomous/incident-debugger.js.map +1 -0
- package/dist/autonomous/index.d.ts +15 -0
- package/dist/autonomous/index.d.ts.map +1 -0
- package/dist/autonomous/index.js +10 -0
- package/dist/autonomous/index.js.map +1 -0
- package/dist/autonomous/patch-tournament.d.ts +82 -0
- package/dist/autonomous/patch-tournament.d.ts.map +1 -0
- package/dist/autonomous/patch-tournament.js +150 -0
- package/dist/autonomous/patch-tournament.js.map +1 -0
- package/dist/autonomous/research-agent.d.ts +66 -0
- package/dist/autonomous/research-agent.d.ts.map +1 -0
- package/dist/autonomous/research-agent.js +210 -0
- package/dist/autonomous/research-agent.js.map +1 -0
- package/dist/autonomous/task-memory.d.ts +63 -0
- package/dist/autonomous/task-memory.d.ts.map +1 -0
- package/dist/autonomous/task-memory.js +143 -0
- package/dist/autonomous/task-memory.js.map +1 -0
- package/dist/budget-governor-v2.d.ts +93 -0
- package/dist/budget-governor-v2.d.ts.map +1 -0
- package/dist/budget-governor-v2.js +345 -0
- package/dist/budget-governor-v2.js.map +1 -0
- package/dist/capability-graph.d.ts +102 -0
- package/dist/capability-graph.d.ts.map +1 -0
- package/dist/capability-graph.js +397 -0
- package/dist/capability-graph.js.map +1 -0
- package/dist/capability-self-model.d.ts +144 -0
- package/dist/capability-self-model.d.ts.map +1 -0
- package/dist/capability-self-model.js +312 -0
- package/dist/capability-self-model.js.map +1 -0
- package/dist/checkpoint-manager.d.ts +94 -0
- package/dist/checkpoint-manager.d.ts.map +1 -0
- package/dist/checkpoint-manager.js +225 -0
- package/dist/checkpoint-manager.js.map +1 -0
- package/dist/continuation-engine.js +1 -1
- package/dist/continuation-engine.js.map +1 -1
- package/dist/dag-orchestrator.d.ts +0 -3
- package/dist/dag-orchestrator.d.ts.map +1 -1
- package/dist/dag-orchestrator.js +0 -1
- package/dist/dag-orchestrator.js.map +1 -1
- package/dist/evidence-chain.d.ts +99 -0
- package/dist/evidence-chain.d.ts.map +1 -0
- package/dist/evidence-chain.js +200 -0
- package/dist/evidence-chain.js.map +1 -0
- package/dist/execution-engine.d.ts.map +1 -1
- package/dist/execution-engine.js +0 -1
- package/dist/execution-engine.js.map +1 -1
- package/dist/failure-signature-memory.d.ts +61 -0
- package/dist/failure-signature-memory.d.ts.map +1 -0
- package/dist/failure-signature-memory.js +278 -0
- package/dist/failure-signature-memory.js.map +1 -0
- package/dist/index.d.ts +52 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -7
- package/dist/index.js.map +1 -1
- package/dist/language-detector.d.ts.map +1 -1
- package/dist/language-detector.js +122 -43
- package/dist/language-detector.js.map +1 -1
- package/dist/llm-client.d.ts +0 -7
- package/dist/llm-client.d.ts.map +1 -1
- package/dist/llm-client.js +15 -122
- package/dist/llm-client.js.map +1 -1
- package/dist/mcp-client.js +1 -1
- package/dist/mcp-client.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +0 -15
- package/dist/memory.js.map +1 -1
- package/dist/meta-learning-collector.d.ts +64 -0
- package/dist/meta-learning-collector.d.ts.map +1 -0
- package/dist/meta-learning-collector.js +169 -0
- package/dist/meta-learning-collector.js.map +1 -0
- package/dist/meta-learning-engine.d.ts +61 -0
- package/dist/meta-learning-engine.d.ts.map +1 -0
- package/dist/meta-learning-engine.js +250 -0
- package/dist/meta-learning-engine.js.map +1 -0
- package/dist/overhead-governor.d.ts +105 -0
- package/dist/overhead-governor.d.ts.map +1 -0
- package/dist/overhead-governor.js +239 -0
- package/dist/overhead-governor.js.map +1 -0
- package/dist/playbook-library.d.ts +75 -0
- package/dist/playbook-library.d.ts.map +1 -0
- package/dist/playbook-library.js +241 -0
- package/dist/playbook-library.js.map +1 -0
- package/dist/project-executive.d.ts +97 -0
- package/dist/project-executive.d.ts.map +1 -0
- package/dist/project-executive.js +223 -0
- package/dist/project-executive.js.map +1 -0
- package/dist/research-loop.d.ts +79 -0
- package/dist/research-loop.d.ts.map +1 -0
- package/dist/research-loop.js +363 -0
- package/dist/research-loop.js.map +1 -0
- package/dist/resolve-memory-path.d.ts +32 -0
- package/dist/resolve-memory-path.d.ts.map +1 -0
- package/dist/resolve-memory-path.js +97 -0
- package/dist/resolve-memory-path.js.map +1 -0
- package/dist/safe-bounds.d.ts +101 -0
- package/dist/safe-bounds.d.ts.map +1 -0
- package/dist/safe-bounds.js +140 -0
- package/dist/safe-bounds.js.map +1 -0
- package/dist/sandbox-tiers.d.ts +5 -0
- package/dist/sandbox-tiers.d.ts.map +1 -1
- package/dist/sandbox-tiers.js +14 -6
- package/dist/sandbox-tiers.js.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +3 -0
- package/dist/security.js.map +1 -1
- package/dist/self-improvement-loop.d.ts +64 -0
- package/dist/self-improvement-loop.d.ts.map +1 -0
- package/dist/self-improvement-loop.js +156 -0
- package/dist/self-improvement-loop.js.map +1 -0
- package/dist/session-persistence.d.ts +5 -0
- package/dist/session-persistence.d.ts.map +1 -1
- package/dist/session-persistence.js +19 -3
- package/dist/session-persistence.js.map +1 -1
- package/dist/skill-loader.d.ts +16 -9
- package/dist/skill-loader.d.ts.map +1 -1
- package/dist/skill-loader.js +52 -116
- package/dist/skill-loader.js.map +1 -1
- package/dist/skill-registry.d.ts +60 -0
- package/dist/skill-registry.d.ts.map +1 -0
- package/dist/skill-registry.js +162 -0
- package/dist/skill-registry.js.map +1 -0
- package/dist/stall-detector.d.ts +56 -0
- package/dist/stall-detector.d.ts.map +1 -0
- package/dist/stall-detector.js +142 -0
- package/dist/stall-detector.js.map +1 -0
- package/dist/strategy-learner.d.ts +57 -0
- package/dist/strategy-learner.d.ts.map +1 -0
- package/dist/strategy-learner.js +160 -0
- package/dist/strategy-learner.js.map +1 -0
- package/dist/strategy-market.d.ts +73 -0
- package/dist/strategy-market.d.ts.map +1 -0
- package/dist/strategy-market.js +200 -0
- package/dist/strategy-market.js.map +1 -0
- package/dist/sub-agent.d.ts +0 -3
- package/dist/sub-agent.d.ts.map +1 -1
- package/dist/sub-agent.js +0 -10
- package/dist/sub-agent.js.map +1 -1
- package/dist/system-prompt.d.ts +0 -2
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +97 -490
- package/dist/system-prompt.js.map +1 -1
- package/dist/task-classifier.d.ts.map +1 -1
- package/dist/task-classifier.js +2 -54
- package/dist/task-classifier.js.map +1 -1
- package/dist/tool-synthesizer.d.ts +149 -0
- package/dist/tool-synthesizer.d.ts.map +1 -0
- package/dist/tool-synthesizer.js +455 -0
- package/dist/tool-synthesizer.js.map +1 -0
- package/dist/trace-pattern-extractor.d.ts +76 -0
- package/dist/trace-pattern-extractor.d.ts.map +1 -0
- package/dist/trace-pattern-extractor.js +321 -0
- package/dist/trace-pattern-extractor.js.map +1 -0
- package/dist/trace-recorder.d.ts +38 -0
- package/dist/trace-recorder.d.ts.map +1 -0
- package/dist/trace-recorder.js +94 -0
- package/dist/trace-recorder.js.map +1 -0
- package/dist/trust-economics.d.ts +50 -0
- package/dist/trust-economics.d.ts.map +1 -0
- package/dist/trust-economics.js +148 -0
- package/dist/trust-economics.js.map +1 -0
- package/dist/types.d.ts +272 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/yuan-md-loader.d.ts +22 -0
- package/dist/yuan-md-loader.d.ts.map +1 -0
- package/dist/yuan-md-loader.js +75 -0
- package/dist/yuan-md-loader.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module project-executive
|
|
3
|
+
* @description Long-Horizon Project Executive — manages project-level goals, milestones,
|
|
4
|
+
* stalled task detection, and resume points.
|
|
5
|
+
*
|
|
6
|
+
* Storage: ~/.yuan/projects/{projectId}/executive.json
|
|
7
|
+
* projectId = stable 8-char hash of projectPath
|
|
8
|
+
*
|
|
9
|
+
* Design:
|
|
10
|
+
* - Event-driven observer ONLY — does NOT mutate agent-loop state
|
|
11
|
+
* - Reads from TaskMemory but does not write to it
|
|
12
|
+
* - All persistence is atomic (.tmp + renameSync)
|
|
13
|
+
* - Emits structured events for all state transitions
|
|
14
|
+
*/
|
|
15
|
+
import { EventEmitter } from "node:events";
|
|
16
|
+
export type GoalStatus = "active" | "completed" | "abandoned";
|
|
17
|
+
export type GoalStrategy = "bugfix" | "refactor" | "migration" | "feature" | "investigation";
|
|
18
|
+
export interface ProjectGoal {
|
|
19
|
+
id: string;
|
|
20
|
+
description: string;
|
|
21
|
+
strategy: GoalStrategy;
|
|
22
|
+
status: GoalStatus;
|
|
23
|
+
childTaskIds: string[];
|
|
24
|
+
estimatedIterations: number;
|
|
25
|
+
createdAt: string;
|
|
26
|
+
completedAt?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ProjectMilestone {
|
|
29
|
+
id: string;
|
|
30
|
+
description: string;
|
|
31
|
+
goalId: string;
|
|
32
|
+
targetIteration: number;
|
|
33
|
+
status: "pending" | "reached" | "missed";
|
|
34
|
+
reachedAt?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface StalledTask {
|
|
37
|
+
taskId: string;
|
|
38
|
+
stallReason: "iteration_overrun" | "repeated_errors" | "no_progress" | "patch_entropy";
|
|
39
|
+
detectedAt: string;
|
|
40
|
+
iterationsElapsed: number;
|
|
41
|
+
estimatedIterations: number;
|
|
42
|
+
}
|
|
43
|
+
export interface ResumePoint {
|
|
44
|
+
taskId: string;
|
|
45
|
+
sessionId: string;
|
|
46
|
+
checkpointPath: string;
|
|
47
|
+
savedAt: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ProjectExecutiveState {
|
|
50
|
+
projectId: string;
|
|
51
|
+
projectPath: string;
|
|
52
|
+
goals: ProjectGoal[];
|
|
53
|
+
milestones: ProjectMilestone[];
|
|
54
|
+
activeTasks: string[];
|
|
55
|
+
stalledTasks: StalledTask[];
|
|
56
|
+
resumePoints: ResumePoint[];
|
|
57
|
+
updatedAt: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ProjectExecutiveConfig {
|
|
60
|
+
/** defaults to ~/.yuan/projects/ */
|
|
61
|
+
storageDir?: string;
|
|
62
|
+
}
|
|
63
|
+
export declare class ProjectExecutive extends EventEmitter {
|
|
64
|
+
private state;
|
|
65
|
+
private storagePath;
|
|
66
|
+
constructor(projectPath: string, config?: ProjectExecutiveConfig);
|
|
67
|
+
private persist;
|
|
68
|
+
private emitStateUpdate;
|
|
69
|
+
/**
|
|
70
|
+
* Add a new goal. Returns the created goal. Emits agent:project_state_update.
|
|
71
|
+
*/
|
|
72
|
+
addGoal(description: string, strategy: GoalStrategy, estimatedIterations?: number): ProjectGoal;
|
|
73
|
+
/**
|
|
74
|
+
* Mark a goal as completed or abandoned. Emits agent:project_state_update.
|
|
75
|
+
*/
|
|
76
|
+
completeGoal(goalId: string, status: "completed" | "abandoned"): void;
|
|
77
|
+
/** Add a milestone to a goal. */
|
|
78
|
+
addMilestone(goalId: string, description: string, targetIteration: number): ProjectMilestone;
|
|
79
|
+
/**
|
|
80
|
+
* Check and possibly mark a milestone as reached.
|
|
81
|
+
* Emits agent:milestone_reached if reached.
|
|
82
|
+
*/
|
|
83
|
+
checkMilestone(milestoneId: string, currentIteration: number): boolean;
|
|
84
|
+
/** Register a stalled task. Emits agent:task_stalled. */
|
|
85
|
+
recordStall(taskId: string, reason: StalledTask["stallReason"], iterationsElapsed: number, estimatedIterations: number): void;
|
|
86
|
+
/** Clear a stall (task resumed or resolved). */
|
|
87
|
+
clearStall(taskId: string): void;
|
|
88
|
+
/** Save a resume point for a task. */
|
|
89
|
+
addResumePoint(taskId: string, sessionId: string, checkpointPath: string): void;
|
|
90
|
+
/** Mark a task as active. */
|
|
91
|
+
activateTask(taskId: string): void;
|
|
92
|
+
/** Mark a task as no longer active. */
|
|
93
|
+
deactivateTask(taskId: string): void;
|
|
94
|
+
/** Get current state snapshot. */
|
|
95
|
+
getState(): ProjectExecutiveState;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=project-executive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-executive.d.ts","sourceRoot":"","sources":["../src/project-executive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module project-executive
|
|
3
|
+
* @description Long-Horizon Project Executive — manages project-level goals, milestones,
|
|
4
|
+
* stalled task detection, and resume points.
|
|
5
|
+
*
|
|
6
|
+
* Storage: ~/.yuan/projects/{projectId}/executive.json
|
|
7
|
+
* projectId = stable 8-char hash of projectPath
|
|
8
|
+
*
|
|
9
|
+
* Design:
|
|
10
|
+
* - Event-driven observer ONLY — does NOT mutate agent-loop state
|
|
11
|
+
* - Reads from TaskMemory but does not write to it
|
|
12
|
+
* - All persistence is atomic (.tmp + renameSync)
|
|
13
|
+
* - Emits structured events for all state transitions
|
|
14
|
+
*/
|
|
15
|
+
import { EventEmitter } from "node:events";
|
|
16
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
|
+
import { dirname, join } from "node:path";
|
|
19
|
+
// ─── Helpers ───────────────────────────────────────────────────────────────
|
|
20
|
+
function makeProjectId(projectPath) {
|
|
21
|
+
return Buffer.from(projectPath)
|
|
22
|
+
.toString("base64")
|
|
23
|
+
.replace(/[^a-z0-9]/gi, "")
|
|
24
|
+
.slice(0, 8);
|
|
25
|
+
}
|
|
26
|
+
function makeId() {
|
|
27
|
+
return Math.random().toString(36).slice(2, 10) + Date.now().toString(36);
|
|
28
|
+
}
|
|
29
|
+
function atomicWrite(filePath, data) {
|
|
30
|
+
const dir = dirname(filePath);
|
|
31
|
+
if (!existsSync(dir)) {
|
|
32
|
+
mkdirSync(dir, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
const tmp = filePath + ".tmp";
|
|
35
|
+
writeFileSync(tmp, data, "utf8");
|
|
36
|
+
renameSync(tmp, filePath);
|
|
37
|
+
}
|
|
38
|
+
function emptyState(projectId, projectPath) {
|
|
39
|
+
return {
|
|
40
|
+
projectId,
|
|
41
|
+
projectPath,
|
|
42
|
+
goals: [],
|
|
43
|
+
milestones: [],
|
|
44
|
+
activeTasks: [],
|
|
45
|
+
stalledTasks: [],
|
|
46
|
+
resumePoints: [],
|
|
47
|
+
updatedAt: new Date().toISOString(),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// ─── ProjectExecutive ──────────────────────────────────────────────────────
|
|
51
|
+
export class ProjectExecutive extends EventEmitter {
|
|
52
|
+
state;
|
|
53
|
+
storagePath;
|
|
54
|
+
constructor(projectPath, config) {
|
|
55
|
+
super();
|
|
56
|
+
const projectId = makeProjectId(projectPath);
|
|
57
|
+
const storageDir = config?.storageDir ?? join(homedir(), ".yuan", "projects");
|
|
58
|
+
this.storagePath = join(storageDir, projectId, "executive.json");
|
|
59
|
+
// Load existing state or create empty
|
|
60
|
+
if (existsSync(this.storagePath)) {
|
|
61
|
+
try {
|
|
62
|
+
const raw = readFileSync(this.storagePath, "utf8");
|
|
63
|
+
this.state = JSON.parse(raw);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
this.state = emptyState(projectId, projectPath);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.state = emptyState(projectId, projectPath);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ── Persistence ──────────────────────────────────────────────────────────
|
|
74
|
+
persist() {
|
|
75
|
+
this.state.updatedAt = new Date().toISOString();
|
|
76
|
+
atomicWrite(this.storagePath, JSON.stringify(this.state, null, 2));
|
|
77
|
+
}
|
|
78
|
+
emitStateUpdate() {
|
|
79
|
+
this.emit("event", {
|
|
80
|
+
kind: "agent:project_state_update",
|
|
81
|
+
projectId: this.state.projectId,
|
|
82
|
+
goals: this.state.goals.length,
|
|
83
|
+
activeTasks: this.state.activeTasks.length,
|
|
84
|
+
stalledTasks: this.state.stalledTasks.length,
|
|
85
|
+
timestamp: Date.now(),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// ── Goals ─────────────────────────────────────────────────────────────────
|
|
89
|
+
/**
|
|
90
|
+
* Add a new goal. Returns the created goal. Emits agent:project_state_update.
|
|
91
|
+
*/
|
|
92
|
+
addGoal(description, strategy, estimatedIterations = 20) {
|
|
93
|
+
const goal = {
|
|
94
|
+
id: makeId(),
|
|
95
|
+
description,
|
|
96
|
+
strategy,
|
|
97
|
+
status: "active",
|
|
98
|
+
childTaskIds: [],
|
|
99
|
+
estimatedIterations,
|
|
100
|
+
createdAt: new Date().toISOString(),
|
|
101
|
+
};
|
|
102
|
+
this.state.goals.push(goal);
|
|
103
|
+
this.persist();
|
|
104
|
+
this.emitStateUpdate();
|
|
105
|
+
return goal;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Mark a goal as completed or abandoned. Emits agent:project_state_update.
|
|
109
|
+
*/
|
|
110
|
+
completeGoal(goalId, status) {
|
|
111
|
+
const goal = this.state.goals.find((g) => g.id === goalId);
|
|
112
|
+
if (!goal)
|
|
113
|
+
return;
|
|
114
|
+
goal.status = status;
|
|
115
|
+
goal.completedAt = new Date().toISOString();
|
|
116
|
+
this.persist();
|
|
117
|
+
this.emitStateUpdate();
|
|
118
|
+
}
|
|
119
|
+
// ── Milestones ────────────────────────────────────────────────────────────
|
|
120
|
+
/** Add a milestone to a goal. */
|
|
121
|
+
addMilestone(goalId, description, targetIteration) {
|
|
122
|
+
const milestone = {
|
|
123
|
+
id: makeId(),
|
|
124
|
+
description,
|
|
125
|
+
goalId,
|
|
126
|
+
targetIteration,
|
|
127
|
+
status: "pending",
|
|
128
|
+
};
|
|
129
|
+
this.state.milestones.push(milestone);
|
|
130
|
+
this.persist();
|
|
131
|
+
return milestone;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check and possibly mark a milestone as reached.
|
|
135
|
+
* Emits agent:milestone_reached if reached.
|
|
136
|
+
*/
|
|
137
|
+
checkMilestone(milestoneId, currentIteration) {
|
|
138
|
+
const ms = this.state.milestones.find((m) => m.id === milestoneId);
|
|
139
|
+
if (!ms || ms.status !== "pending")
|
|
140
|
+
return false;
|
|
141
|
+
if (currentIteration >= ms.targetIteration) {
|
|
142
|
+
ms.status = "reached";
|
|
143
|
+
ms.reachedAt = new Date().toISOString();
|
|
144
|
+
this.persist();
|
|
145
|
+
this.emit("event", {
|
|
146
|
+
kind: "agent:milestone_reached",
|
|
147
|
+
milestoneId: ms.id,
|
|
148
|
+
goalId: ms.goalId,
|
|
149
|
+
description: ms.description,
|
|
150
|
+
timestamp: Date.now(),
|
|
151
|
+
});
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
// ── Stall Tracking ────────────────────────────────────────────────────────
|
|
157
|
+
/** Register a stalled task. Emits agent:task_stalled. */
|
|
158
|
+
recordStall(taskId, reason, iterationsElapsed, estimatedIterations) {
|
|
159
|
+
// Avoid duplicates
|
|
160
|
+
const existing = this.state.stalledTasks.find((s) => s.taskId === taskId);
|
|
161
|
+
if (existing) {
|
|
162
|
+
existing.stallReason = reason;
|
|
163
|
+
existing.detectedAt = new Date().toISOString();
|
|
164
|
+
existing.iterationsElapsed = iterationsElapsed;
|
|
165
|
+
existing.estimatedIterations = estimatedIterations;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
this.state.stalledTasks.push({
|
|
169
|
+
taskId,
|
|
170
|
+
stallReason: reason,
|
|
171
|
+
detectedAt: new Date().toISOString(),
|
|
172
|
+
iterationsElapsed,
|
|
173
|
+
estimatedIterations,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
this.persist();
|
|
177
|
+
this.emit("event", {
|
|
178
|
+
kind: "agent:task_stalled",
|
|
179
|
+
taskId,
|
|
180
|
+
stallReason: reason,
|
|
181
|
+
iterationsElapsed,
|
|
182
|
+
estimatedIterations,
|
|
183
|
+
timestamp: Date.now(),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/** Clear a stall (task resumed or resolved). */
|
|
187
|
+
clearStall(taskId) {
|
|
188
|
+
this.state.stalledTasks = this.state.stalledTasks.filter((s) => s.taskId !== taskId);
|
|
189
|
+
this.persist();
|
|
190
|
+
}
|
|
191
|
+
// ── Resume Points ─────────────────────────────────────────────────────────
|
|
192
|
+
/** Save a resume point for a task. */
|
|
193
|
+
addResumePoint(taskId, sessionId, checkpointPath) {
|
|
194
|
+
// Replace existing resume point for same taskId
|
|
195
|
+
this.state.resumePoints = this.state.resumePoints.filter((r) => r.taskId !== taskId);
|
|
196
|
+
this.state.resumePoints.push({
|
|
197
|
+
taskId,
|
|
198
|
+
sessionId,
|
|
199
|
+
checkpointPath,
|
|
200
|
+
savedAt: new Date().toISOString(),
|
|
201
|
+
});
|
|
202
|
+
this.persist();
|
|
203
|
+
}
|
|
204
|
+
// ── Active Task Tracking ──────────────────────────────────────────────────
|
|
205
|
+
/** Mark a task as active. */
|
|
206
|
+
activateTask(taskId) {
|
|
207
|
+
if (!this.state.activeTasks.includes(taskId)) {
|
|
208
|
+
this.state.activeTasks.push(taskId);
|
|
209
|
+
this.persist();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** Mark a task as no longer active. */
|
|
213
|
+
deactivateTask(taskId) {
|
|
214
|
+
this.state.activeTasks = this.state.activeTasks.filter((id) => id !== taskId);
|
|
215
|
+
this.persist();
|
|
216
|
+
}
|
|
217
|
+
// ── State Access ──────────────────────────────────────────────────────────
|
|
218
|
+
/** Get current state snapshot. */
|
|
219
|
+
getState() {
|
|
220
|
+
return JSON.parse(JSON.stringify(this.state));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=project-executive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-executive.js","sourceRoot":"","sources":["../src/project-executive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module research-loop
|
|
3
|
+
* @description Hypothesis-driven engineering research loop.
|
|
4
|
+
*
|
|
5
|
+
* Takes a problem statement, generates hypotheses (template-based, no LLM),
|
|
6
|
+
* searches code/docs via a caller-supplied searchFn, evaluates evidence,
|
|
7
|
+
* and produces a strategy recommendation.
|
|
8
|
+
*
|
|
9
|
+
* Loop:
|
|
10
|
+
* problem → hypotheses → search (code/docs) → evaluate evidence → update strategy
|
|
11
|
+
*
|
|
12
|
+
* Constraints:
|
|
13
|
+
* - ESM only (no require())
|
|
14
|
+
* - No LLM calls — purely structural, deterministic
|
|
15
|
+
* - Atomic writes (.tmp → renameSync)
|
|
16
|
+
* - All errors caught — never blocks
|
|
17
|
+
* - Emits agent:research_session_complete on completion
|
|
18
|
+
*/
|
|
19
|
+
import { EventEmitter } from "node:events";
|
|
20
|
+
export interface ResearchHypothesis {
|
|
21
|
+
id: string;
|
|
22
|
+
statement: string;
|
|
23
|
+
confidence: number;
|
|
24
|
+
supportingEvidence: string[];
|
|
25
|
+
contradictingEvidence: string[];
|
|
26
|
+
status: "active" | "confirmed" | "rejected" | "inconclusive";
|
|
27
|
+
}
|
|
28
|
+
export interface ResearchSession {
|
|
29
|
+
id: string;
|
|
30
|
+
problem: string;
|
|
31
|
+
hypotheses: ResearchHypothesis[];
|
|
32
|
+
searchResults: Array<{
|
|
33
|
+
query: string;
|
|
34
|
+
source: "code" | "docs" | "web" | "issues";
|
|
35
|
+
snippets: string[];
|
|
36
|
+
timestamp: string;
|
|
37
|
+
}>;
|
|
38
|
+
conclusion: string;
|
|
39
|
+
recommendedStrategy: string;
|
|
40
|
+
confidence: number;
|
|
41
|
+
iterations: number;
|
|
42
|
+
startedAt: string;
|
|
43
|
+
completedAt?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ResearchLoopConfig {
|
|
46
|
+
/** Max iterations per research session. Default: 5 */
|
|
47
|
+
maxIterations?: number;
|
|
48
|
+
/** Stop early when any hypothesis reaches this confidence. Default: 0.75 */
|
|
49
|
+
minConfidenceToStop?: number;
|
|
50
|
+
/** Directory to store sessions.json. Default: ~/.yuan/research/ */
|
|
51
|
+
storageDir?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare class ResearchLoop extends EventEmitter {
|
|
54
|
+
private readonly maxIterations;
|
|
55
|
+
private readonly minConfidenceToStop;
|
|
56
|
+
private readonly storageDir;
|
|
57
|
+
private sessions;
|
|
58
|
+
constructor(config?: ResearchLoopConfig);
|
|
59
|
+
/**
|
|
60
|
+
* Run a hypothesis-driven research session for the given problem.
|
|
61
|
+
* - Generates 2-3 initial hypotheses (template-based, no LLM)
|
|
62
|
+
* - For each iteration, selects the lowest-confidence hypothesis, generates
|
|
63
|
+
* a search query, calls searchFn for "code" and "docs", evaluates evidence
|
|
64
|
+
* - Stops early when minConfidenceToStop is reached
|
|
65
|
+
* - Returns completed ResearchSession with conclusion + recommendedStrategy
|
|
66
|
+
* - Emits agent:research_session_complete on completion
|
|
67
|
+
*/
|
|
68
|
+
research(problem: string, searchFn: (query: string, source: "code" | "docs") => Promise<string[]>, sessionId?: string): Promise<ResearchSession>;
|
|
69
|
+
/**
|
|
70
|
+
* Return all research sessions loaded from storage (+ any run in this instance).
|
|
71
|
+
*/
|
|
72
|
+
getSessions(): ResearchSession[];
|
|
73
|
+
/**
|
|
74
|
+
* Find the most relevant past session for a given problem using word-overlap
|
|
75
|
+
* similarity. Returns null if no session has similarity ≥ 0.3.
|
|
76
|
+
*/
|
|
77
|
+
findRelevant(problem: string): ResearchSession | null;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=research-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-loop.d.ts","sourceRoot":"","sources":["../src/research-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAc3C,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,cAAc,CAAC;CAC9D;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,aAAa,EAAE,KAAK,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;QAC3C,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8OD,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAoB;gBAExB,MAAM,GAAE,kBAAuB;IAQ3C;;;;;;;;OAQG;IACG,QAAQ,CACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,EACvE,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC;IAgH3B;;OAEG;IACH,WAAW,IAAI,eAAe,EAAE;IAIhC;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAetD"}
|