studiograph 1.3.48-next.8 → 1.3.48-next.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/server/agents/agent-runtime.d.ts +72 -0
- package/dist/server/agents/agent-runtime.js +275 -0
- package/dist/server/agents/agent-runtime.js.map +1 -0
- package/dist/server/agents/base-agent.d.ts +30 -0
- package/dist/server/agents/base-agent.js +88 -0
- package/dist/server/agents/base-agent.js.map +1 -0
- package/dist/server/agents/executive-digest.d.ts +16 -0
- package/dist/server/agents/executive-digest.js +115 -0
- package/dist/server/agents/executive-digest.js.map +1 -0
- package/dist/server/agents/graph-steward.d.ts +16 -0
- package/dist/server/agents/graph-steward.js +59 -0
- package/dist/server/agents/graph-steward.js.map +1 -0
- package/dist/server/agents/meeting-followup.d.ts +16 -0
- package/dist/server/agents/meeting-followup.js +88 -0
- package/dist/server/agents/meeting-followup.js.map +1 -0
- package/dist/server/agents/pipeline-monitor.d.ts +15 -0
- package/dist/server/agents/pipeline-monitor.js +86 -0
- package/dist/server/agents/pipeline-monitor.js.map +1 -0
- package/dist/server/agents/types.d.ts +66 -0
- package/dist/server/agents/types.js +7 -0
- package/dist/server/agents/types.js.map +1 -0
- package/dist/server/index.js +16 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/agents-api.d.ts +13 -0
- package/dist/server/routes/agents-api.js +52 -0
- package/dist/server/routes/agents-api.js.map +1 -0
- package/dist/web/_app/immutable/assets/0.BfIKAx3R.css +1 -0
- package/dist/web/_app/immutable/assets/3.Bz7gQ3tx.css +1 -0
- package/dist/web/_app/immutable/assets/6.DT9Srmk_.css +1 -0
- package/dist/web/_app/immutable/chunks/{DnwCyrLk.js → 2C7B9aHG.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CvIrCICe.js → BDKmgiCP.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BAv2eo78.js → BEYDyhXd.js} +1 -1
- package/dist/web/_app/immutable/chunks/{tl7OBIop.js → BFRfJtjj.js} +1 -1
- package/dist/web/_app/immutable/chunks/BMnGV2z0.js +1 -0
- package/dist/web/_app/immutable/chunks/{DYjiTWHA.js → BOPh8cBV.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BBoedVZO.js → BOp8mO1C.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DD2tihyk.js → BQfjOhBO.js} +1 -1
- package/dist/web/_app/immutable/chunks/BX_tlenx.js +1 -0
- package/dist/web/_app/immutable/chunks/{kWZOPH0u.js → Bm53w62j.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CQkYg8-S.js → BrQhrXeS.js} +1 -1
- package/dist/web/_app/immutable/chunks/Bs5pldtm.js +1 -0
- package/dist/web/_app/immutable/chunks/{D6Nem_cG.js → C-9aniJI.js} +1 -1
- package/dist/web/_app/immutable/chunks/{X6Q7ETGH.js → C3lqmJlO.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DJrsirIc.js → CRf6mpbf.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BDEGO3ce.js → CWfir9x5.js} +1 -1
- package/dist/web/_app/immutable/chunks/CYUuQYQ_.js +2 -0
- package/dist/web/_app/immutable/chunks/{bStkEd6T.js → Ccaue-bZ.js} +1 -1
- package/dist/web/_app/immutable/chunks/CdeYcEuU.js +1 -0
- package/dist/web/_app/immutable/chunks/{CE4jaZ4F.js → Ceb6ewr-.js} +1 -1
- package/dist/web/_app/immutable/chunks/CsjZ0RIE.js +1 -0
- package/dist/web/_app/immutable/chunks/Ct_036Kc.js +1 -0
- package/dist/web/_app/immutable/chunks/CylZLWx8.js +1 -0
- package/dist/web/_app/immutable/chunks/D2pyb7LR.js +1 -0
- package/dist/web/_app/immutable/chunks/D3-MVZHU.js +1 -0
- package/dist/web/_app/immutable/chunks/{B8hOuFij.js → DDK8jNGb.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CkCjn7QP.js → DEhfk0Dr.js} +1 -1
- package/dist/web/_app/immutable/chunks/DFbtB1uB.js +1 -0
- package/dist/web/_app/immutable/chunks/{BhITy8Ob.js → DLyi1U3z.js} +1 -1
- package/dist/web/_app/immutable/chunks/DMLg5WWZ.js +1 -0
- package/dist/web/_app/immutable/chunks/{DXkIVPyE.js → DU1sM-ok.js} +1 -1
- package/dist/web/_app/immutable/chunks/DXCeKyuS.js +1 -0
- package/dist/web/_app/immutable/chunks/{CX29MJnv.js → DaAT6rFO.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DgdEvonR.js → Dc4oo8i2.js} +1 -1
- package/dist/web/_app/immutable/chunks/{XsUqNoEH.js → Dd085kP-.js} +1 -1
- package/dist/web/_app/immutable/chunks/{ViFs0DQu.js → DhFxTzm_.js} +1 -1
- package/dist/web/_app/immutable/chunks/{CVUPZdJX.js → Dqpzjypr.js} +1 -1
- package/dist/web/_app/immutable/chunks/{TD9yh6MS.js → DuTGfqBV.js} +1 -1
- package/dist/web/_app/immutable/chunks/{A_CBh12A.js → L2UcGtZ3.js} +2 -2
- package/dist/web/_app/immutable/chunks/{CI5sVAIC.js → TtP1XfB7.js} +1 -1
- package/dist/web/_app/immutable/chunks/{BV_5EeTy.js → USKOZId9.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DfMgqQCA.js → gBXnjg-p.js} +1 -1
- package/dist/web/_app/immutable/chunks/lioFWQUs.js +1 -0
- package/dist/web/_app/immutable/chunks/{CLqUMZPz.js → tS3kvvAJ.js} +2 -2
- package/dist/web/_app/immutable/entry/app.099jN6Sd.js +2 -0
- package/dist/web/_app/immutable/entry/start.D39HWUiI.js +1 -0
- package/dist/web/_app/immutable/nodes/0.Cm10U_l9.js +2 -0
- package/dist/web/_app/immutable/nodes/1.CmRYFyk1.js +1 -0
- package/dist/web/_app/immutable/nodes/{9.x7pkEaJB.js → 10.BJVMEBrV.js} +1 -1
- package/dist/web/_app/immutable/nodes/{10.Ddsi2sfy.js → 11.Cj_qTr2R.js} +1 -1
- package/dist/web/_app/immutable/nodes/2.CvqkMYPH.js +301 -0
- package/dist/web/_app/immutable/nodes/3.C0MIC3BD.js +2 -0
- package/dist/web/_app/immutable/nodes/{4.D__Fcytd.js → 4.0q17oRCg.js} +7 -7
- package/dist/web/_app/immutable/nodes/{5.2KakKOP0.js → 5.Djyj0Dbk.js} +2 -2
- package/dist/web/_app/immutable/nodes/6.CduZ3N2W.js +1 -0
- package/dist/web/_app/immutable/nodes/7.DCbhXL2J.js +2 -0
- package/dist/web/_app/immutable/nodes/8.DzVZIfMj.js +2 -0
- package/dist/web/_app/immutable/nodes/9.DVKOEKfk.js +1 -0
- package/dist/web/_app/version.json +1 -1
- package/dist/web/index.html +11 -11
- package/package.json +1 -1
- package/dist/web/_app/immutable/assets/0.DdizXOKi.css +0 -1
- package/dist/web/_app/immutable/assets/3.pL3gv83R.css +0 -1
- package/dist/web/_app/immutable/chunks/BME6D1N0.js +0 -1
- package/dist/web/_app/immutable/chunks/Bfo6RqaU.js +0 -2
- package/dist/web/_app/immutable/chunks/Bp2bMCBj.js +0 -1
- package/dist/web/_app/immutable/chunks/BsrRU3u_.js +0 -1
- package/dist/web/_app/immutable/chunks/C0sydYgk.js +0 -1
- package/dist/web/_app/immutable/chunks/C5d7L9_I.js +0 -1
- package/dist/web/_app/immutable/chunks/CM7UYcRJ.js +0 -1
- package/dist/web/_app/immutable/chunks/CphCg7fT.js +0 -1
- package/dist/web/_app/immutable/chunks/I9Builge.js +0 -1
- package/dist/web/_app/immutable/chunks/knL6qj16.js +0 -1
- package/dist/web/_app/immutable/chunks/qmznZ5gu.js +0 -1
- package/dist/web/_app/immutable/entry/app.Du6g7Mr2.js +0 -2
- package/dist/web/_app/immutable/entry/start.TPt2P_nk.js +0 -1
- package/dist/web/_app/immutable/nodes/0.DV8AwAKh.js +0 -2
- package/dist/web/_app/immutable/nodes/1.CN-rwte7.js +0 -1
- package/dist/web/_app/immutable/nodes/2.D8h1KFna.js +0 -301
- package/dist/web/_app/immutable/nodes/3.CsU37T7i.js +0 -2
- package/dist/web/_app/immutable/nodes/6.LOCHateX.js +0 -2
- package/dist/web/_app/immutable/nodes/7.CkBvkHa0.js +0 -2
- package/dist/web/_app/immutable/nodes/8.C_OINojh.js +0 -1
- /package/dist/web/_app/immutable/assets/{9.CT4xL4K3.css → 10.CT4xL4K3.css} +0 -0
- /package/dist/web/_app/immutable/assets/{10.BUrHkYry.css → 11.BUrHkYry.css} +0 -0
- /package/dist/web/_app/immutable/assets/{6.CquhUpOu.css → 7.CquhUpOu.css} +0 -0
- /package/dist/web/_app/immutable/assets/{7.CjbDRbuG.css → 8.CjbDRbuG.css} +0 -0
- /package/dist/web/_app/immutable/assets/{8.S1QdUGNM.css → 9.S1QdUGNM.css} +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Runtime — central scheduler for autonomous agents
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of all autonomous agents: scheduling ticks
|
|
5
|
+
* via setInterval, persisting state, broadcasting findings via WsHub,
|
|
6
|
+
* executing approved actions, and handling graceful shutdown.
|
|
7
|
+
*
|
|
8
|
+
* Follows the same setInterval pattern as SessionManager.
|
|
9
|
+
*/
|
|
10
|
+
import type { WorkspaceManager } from '../../core/workspace-manager.js';
|
|
11
|
+
import type { WsHub } from '../ws-hub.js';
|
|
12
|
+
import type { MemoryService } from '../../services/memory-service.js';
|
|
13
|
+
import type { AutonomousAgent } from './base-agent.js';
|
|
14
|
+
import type { AgentStatus } from './types.js';
|
|
15
|
+
export declare class AgentRuntime {
|
|
16
|
+
private agents;
|
|
17
|
+
private timers;
|
|
18
|
+
private config;
|
|
19
|
+
private ctx;
|
|
20
|
+
private configPath;
|
|
21
|
+
private stateBaseDir;
|
|
22
|
+
constructor(workspaceManager: WorkspaceManager, wsHub?: WsHub, memoryService?: MemoryService);
|
|
23
|
+
/**
|
|
24
|
+
* Register an agent with the runtime.
|
|
25
|
+
*/
|
|
26
|
+
register(agent: AutonomousAgent): void;
|
|
27
|
+
/**
|
|
28
|
+
* Start all enabled agents on their configured intervals.
|
|
29
|
+
*/
|
|
30
|
+
start(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Run a single tick for an agent.
|
|
33
|
+
*/
|
|
34
|
+
private runTick;
|
|
35
|
+
/**
|
|
36
|
+
* Get status of all agents.
|
|
37
|
+
*/
|
|
38
|
+
getAllStatus(): AgentStatus[];
|
|
39
|
+
/**
|
|
40
|
+
* Get a specific agent's full state.
|
|
41
|
+
*/
|
|
42
|
+
getAgentDetail(agentId: string): {
|
|
43
|
+
status: AgentStatus;
|
|
44
|
+
pendingActions: any[];
|
|
45
|
+
completedActions: any[];
|
|
46
|
+
} | null;
|
|
47
|
+
/**
|
|
48
|
+
* Manually trigger a tick for an agent.
|
|
49
|
+
*/
|
|
50
|
+
triggerAgent(agentId: string): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Approve a pending action.
|
|
53
|
+
*/
|
|
54
|
+
approveAction(agentId: string, actionId: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Reject a pending action.
|
|
57
|
+
*/
|
|
58
|
+
rejectAction(agentId: string, actionId: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Update agent config (enable/disable, interval).
|
|
61
|
+
*/
|
|
62
|
+
updateAgentConfig(agentId: string, updates: {
|
|
63
|
+
enabled?: boolean;
|
|
64
|
+
intervalMs?: number;
|
|
65
|
+
}): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Stop all agents and save state. Called on server shutdown.
|
|
68
|
+
*/
|
|
69
|
+
stop(): void;
|
|
70
|
+
private loadConfig;
|
|
71
|
+
private saveConfig;
|
|
72
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Runtime — central scheduler for autonomous agents
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of all autonomous agents: scheduling ticks
|
|
5
|
+
* via setInterval, persisting state, broadcasting findings via WsHub,
|
|
6
|
+
* executing approved actions, and handling graceful shutdown.
|
|
7
|
+
*
|
|
8
|
+
* Follows the same setInterval pattern as SessionManager.
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
11
|
+
import { join } from 'path';
|
|
12
|
+
import { homedir } from 'os';
|
|
13
|
+
const DEFAULT_CONFIG = {
|
|
14
|
+
agents: {},
|
|
15
|
+
autonomy: {
|
|
16
|
+
'generate-digest': 'auto',
|
|
17
|
+
'flag-stale-deal': 'auto',
|
|
18
|
+
'create-followup-task': 'approve',
|
|
19
|
+
'fix-missing-field': 'suggest',
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
export class AgentRuntime {
|
|
23
|
+
agents = new Map();
|
|
24
|
+
timers = new Map();
|
|
25
|
+
config;
|
|
26
|
+
ctx;
|
|
27
|
+
configPath;
|
|
28
|
+
stateBaseDir;
|
|
29
|
+
constructor(workspaceManager, wsHub, memoryService) {
|
|
30
|
+
this.stateBaseDir = join(homedir(), '.studiograph', 'agents');
|
|
31
|
+
this.configPath = join(this.stateBaseDir, 'runtime.json');
|
|
32
|
+
if (!existsSync(this.stateBaseDir)) {
|
|
33
|
+
mkdirSync(this.stateBaseDir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
// Load or create runtime config
|
|
36
|
+
this.config = this.loadConfig();
|
|
37
|
+
this.ctx = {
|
|
38
|
+
workspaceManager,
|
|
39
|
+
wsHub,
|
|
40
|
+
memoryService,
|
|
41
|
+
stateDir: this.stateBaseDir,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Register an agent with the runtime.
|
|
46
|
+
*/
|
|
47
|
+
register(agent) {
|
|
48
|
+
agent.initState(this.stateBaseDir);
|
|
49
|
+
this.agents.set(agent.id, agent);
|
|
50
|
+
// Ensure config has an entry for this agent
|
|
51
|
+
if (!this.config.agents[agent.id]) {
|
|
52
|
+
this.config.agents[agent.id] = {
|
|
53
|
+
enabled: true,
|
|
54
|
+
intervalMs: agent.defaultIntervalMs,
|
|
55
|
+
};
|
|
56
|
+
this.saveConfig();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Start all enabled agents on their configured intervals.
|
|
61
|
+
*/
|
|
62
|
+
start() {
|
|
63
|
+
for (const [id, agent] of this.agents) {
|
|
64
|
+
const agentConfig = this.config.agents[id];
|
|
65
|
+
if (!agentConfig?.enabled)
|
|
66
|
+
continue;
|
|
67
|
+
// Run first tick after a short delay (let server finish startup)
|
|
68
|
+
const initialDelay = setTimeout(() => {
|
|
69
|
+
this.runTick(agent);
|
|
70
|
+
}, 5000 + Math.random() * 5000); // Stagger initial ticks
|
|
71
|
+
// Schedule recurring ticks
|
|
72
|
+
const timer = setInterval(() => {
|
|
73
|
+
this.runTick(agent);
|
|
74
|
+
}, agentConfig.intervalMs);
|
|
75
|
+
this.timers.set(id, timer);
|
|
76
|
+
// Store initial delay so we can clear it on shutdown
|
|
77
|
+
const delayKey = `${id}-init`;
|
|
78
|
+
this.timers.set(delayKey, initialDelay);
|
|
79
|
+
console.log(`[agent-runtime] Scheduled ${agent.name} (${id}) every ${Math.round(agentConfig.intervalMs / 1000)}s`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Run a single tick for an agent.
|
|
84
|
+
*/
|
|
85
|
+
async runTick(agent) {
|
|
86
|
+
if (agent.running)
|
|
87
|
+
return; // Skip if previous tick still running
|
|
88
|
+
agent.running = true;
|
|
89
|
+
const startTime = Date.now();
|
|
90
|
+
try {
|
|
91
|
+
const result = await agent.tick(this.ctx);
|
|
92
|
+
// Update state
|
|
93
|
+
agent.state.lastRunAt = new Date().toISOString();
|
|
94
|
+
agent.state.lastSuccessAt = agent.state.lastRunAt;
|
|
95
|
+
agent.state.lastFindings = result.findings;
|
|
96
|
+
// Process actions
|
|
97
|
+
for (const action of result.actions) {
|
|
98
|
+
const autonomy = this.config.autonomy[action.type] ?? action.autonomy;
|
|
99
|
+
action.autonomy = autonomy;
|
|
100
|
+
if (autonomy === 'auto') {
|
|
101
|
+
// Auto-execute (implementation left to specific action handlers)
|
|
102
|
+
action.status = 'executed';
|
|
103
|
+
agent.state.completedActions.push(action);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// Queue for approval or suggestion
|
|
107
|
+
agent.state.pendingActions.push(action);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
agent.saveState();
|
|
111
|
+
// Broadcast findings via WebSocket
|
|
112
|
+
if (result.findings.length > 0 && this.ctx.wsHub) {
|
|
113
|
+
for (const finding of result.findings) {
|
|
114
|
+
this.ctx.wsHub.broadcast({
|
|
115
|
+
type: 'agent_finding',
|
|
116
|
+
agentId: agent.id,
|
|
117
|
+
agentName: agent.name,
|
|
118
|
+
finding,
|
|
119
|
+
timestamp: new Date().toISOString(),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Broadcast pending actions via WebSocket
|
|
124
|
+
for (const action of result.actions) {
|
|
125
|
+
if (action.autonomy !== 'auto' && this.ctx.wsHub) {
|
|
126
|
+
this.ctx.wsHub.broadcast({
|
|
127
|
+
type: 'agent_action',
|
|
128
|
+
agentId: agent.id,
|
|
129
|
+
agentName: agent.name,
|
|
130
|
+
action,
|
|
131
|
+
timestamp: new Date().toISOString(),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const elapsed = Date.now() - startTime;
|
|
136
|
+
if (result.findings.length > 0) {
|
|
137
|
+
console.log(`[agent-runtime] ${agent.name}: ${result.findings.length} findings, ${result.actions.length} actions (${elapsed}ms)`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
agent.state.lastRunAt = new Date().toISOString();
|
|
142
|
+
agent.saveState();
|
|
143
|
+
console.warn(`[agent-runtime] ${agent.name} tick failed:`, err.message);
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
agent.running = false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// ── Public API ──────────────────────────────────────────────────
|
|
150
|
+
/**
|
|
151
|
+
* Get status of all agents.
|
|
152
|
+
*/
|
|
153
|
+
getAllStatus() {
|
|
154
|
+
return Array.from(this.agents.values()).map(agent => {
|
|
155
|
+
const agentConfig = this.config.agents[agent.id];
|
|
156
|
+
return agent.getStatus(agentConfig?.enabled ?? false, agentConfig?.intervalMs ?? agent.defaultIntervalMs);
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get a specific agent's full state.
|
|
161
|
+
*/
|
|
162
|
+
getAgentDetail(agentId) {
|
|
163
|
+
const agent = this.agents.get(agentId);
|
|
164
|
+
if (!agent)
|
|
165
|
+
return null;
|
|
166
|
+
const agentConfig = this.config.agents[agentId];
|
|
167
|
+
return {
|
|
168
|
+
status: agent.getStatus(agentConfig?.enabled ?? false, agentConfig?.intervalMs ?? agent.defaultIntervalMs),
|
|
169
|
+
pendingActions: agent.state.pendingActions,
|
|
170
|
+
completedActions: agent.state.completedActions.slice(-20),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Manually trigger a tick for an agent.
|
|
175
|
+
*/
|
|
176
|
+
async triggerAgent(agentId) {
|
|
177
|
+
const agent = this.agents.get(agentId);
|
|
178
|
+
if (!agent || agent.running)
|
|
179
|
+
return false;
|
|
180
|
+
await this.runTick(agent);
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Approve a pending action.
|
|
185
|
+
*/
|
|
186
|
+
approveAction(agentId, actionId) {
|
|
187
|
+
const agent = this.agents.get(agentId);
|
|
188
|
+
if (!agent)
|
|
189
|
+
return false;
|
|
190
|
+
const idx = agent.state.pendingActions.findIndex(a => a.id === actionId);
|
|
191
|
+
if (idx === -1)
|
|
192
|
+
return false;
|
|
193
|
+
const action = agent.state.pendingActions.splice(idx, 1)[0];
|
|
194
|
+
action.status = 'approved';
|
|
195
|
+
// TODO: execute the action based on its payload
|
|
196
|
+
action.status = 'executed';
|
|
197
|
+
agent.state.completedActions.push(action);
|
|
198
|
+
agent.saveState();
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Reject a pending action.
|
|
203
|
+
*/
|
|
204
|
+
rejectAction(agentId, actionId) {
|
|
205
|
+
const agent = this.agents.get(agentId);
|
|
206
|
+
if (!agent)
|
|
207
|
+
return false;
|
|
208
|
+
const idx = agent.state.pendingActions.findIndex(a => a.id === actionId);
|
|
209
|
+
if (idx === -1)
|
|
210
|
+
return false;
|
|
211
|
+
const action = agent.state.pendingActions.splice(idx, 1)[0];
|
|
212
|
+
action.status = 'rejected';
|
|
213
|
+
agent.state.completedActions.push(action);
|
|
214
|
+
agent.saveState();
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Update agent config (enable/disable, interval).
|
|
219
|
+
*/
|
|
220
|
+
updateAgentConfig(agentId, updates) {
|
|
221
|
+
if (!this.config.agents[agentId])
|
|
222
|
+
return false;
|
|
223
|
+
if (updates.enabled !== undefined)
|
|
224
|
+
this.config.agents[agentId].enabled = updates.enabled;
|
|
225
|
+
if (updates.intervalMs !== undefined)
|
|
226
|
+
this.config.agents[agentId].intervalMs = updates.intervalMs;
|
|
227
|
+
this.saveConfig();
|
|
228
|
+
// Restart timer if interval changed
|
|
229
|
+
const existingTimer = this.timers.get(agentId);
|
|
230
|
+
if (existingTimer) {
|
|
231
|
+
clearInterval(existingTimer);
|
|
232
|
+
this.timers.delete(agentId);
|
|
233
|
+
}
|
|
234
|
+
if (this.config.agents[agentId].enabled) {
|
|
235
|
+
const agent = this.agents.get(agentId);
|
|
236
|
+
if (agent) {
|
|
237
|
+
const timer = setInterval(() => this.runTick(agent), this.config.agents[agentId].intervalMs);
|
|
238
|
+
this.timers.set(agentId, timer);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
// ── Lifecycle ──────────────────────────────────────────────────
|
|
244
|
+
/**
|
|
245
|
+
* Stop all agents and save state. Called on server shutdown.
|
|
246
|
+
*/
|
|
247
|
+
stop() {
|
|
248
|
+
for (const [id, timer] of this.timers) {
|
|
249
|
+
clearInterval(timer);
|
|
250
|
+
clearTimeout(timer);
|
|
251
|
+
}
|
|
252
|
+
this.timers.clear();
|
|
253
|
+
// Save all agent states
|
|
254
|
+
for (const agent of this.agents.values()) {
|
|
255
|
+
agent.saveState();
|
|
256
|
+
}
|
|
257
|
+
console.log('[agent-runtime] All agents stopped');
|
|
258
|
+
}
|
|
259
|
+
// ── Config persistence ─────────────────────────────────────────
|
|
260
|
+
loadConfig() {
|
|
261
|
+
if (existsSync(this.configPath)) {
|
|
262
|
+
try {
|
|
263
|
+
return JSON.parse(readFileSync(this.configPath, 'utf-8'));
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return { ...DEFAULT_CONFIG };
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return { ...DEFAULT_CONFIG };
|
|
270
|
+
}
|
|
271
|
+
saveConfig() {
|
|
272
|
+
writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=agent-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../../src/server/agents/agent-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Autonomous Agent
|
|
3
|
+
*
|
|
4
|
+
* Abstract class that all autonomous agents extend. Provides:
|
|
5
|
+
* - State loading/saving from filesystem
|
|
6
|
+
* - Finding and action creation helpers
|
|
7
|
+
* - tick() contract for subclasses
|
|
8
|
+
*/
|
|
9
|
+
import type { AgentContext, AgentState, AgentAction, AgentFinding, AgentTickResult } from './types.js';
|
|
10
|
+
export declare abstract class AutonomousAgent {
|
|
11
|
+
abstract readonly id: string;
|
|
12
|
+
abstract readonly name: string;
|
|
13
|
+
abstract readonly description: string;
|
|
14
|
+
abstract readonly defaultIntervalMs: number;
|
|
15
|
+
state: AgentState;
|
|
16
|
+
running: boolean;
|
|
17
|
+
private stateDir;
|
|
18
|
+
private stateFile;
|
|
19
|
+
/**
|
|
20
|
+
* The main agent loop body. Subclasses implement this.
|
|
21
|
+
* Read from graph, analyze, return findings and proposed actions.
|
|
22
|
+
*/
|
|
23
|
+
abstract tick(ctx: AgentContext): Promise<AgentTickResult>;
|
|
24
|
+
initState(baseDir: string): void;
|
|
25
|
+
saveState(): void;
|
|
26
|
+
private emptyState;
|
|
27
|
+
createFinding(headline: string, detail: string, urgency?: AgentFinding['urgency'], entities?: AgentFinding['entities']): AgentFinding;
|
|
28
|
+
createAction(type: string, description: string, payload: Record<string, any>, autonomy?: AgentAction['autonomy']): AgentAction;
|
|
29
|
+
getStatus(enabled: boolean, intervalMs: number): import('./types.js').AgentStatus;
|
|
30
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Autonomous Agent
|
|
3
|
+
*
|
|
4
|
+
* Abstract class that all autonomous agents extend. Provides:
|
|
5
|
+
* - State loading/saving from filesystem
|
|
6
|
+
* - Finding and action creation helpers
|
|
7
|
+
* - tick() contract for subclasses
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
const MAX_COMPLETED_ACTIONS = 50;
|
|
13
|
+
export class AutonomousAgent {
|
|
14
|
+
state;
|
|
15
|
+
running = false;
|
|
16
|
+
stateDir = '';
|
|
17
|
+
stateFile = '';
|
|
18
|
+
// ── State management ────────────────────────────────────────────
|
|
19
|
+
initState(baseDir) {
|
|
20
|
+
this.stateDir = join(baseDir, this.id);
|
|
21
|
+
this.stateFile = join(this.stateDir, 'state.json');
|
|
22
|
+
if (!existsSync(this.stateDir)) {
|
|
23
|
+
mkdirSync(this.stateDir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
if (existsSync(this.stateFile)) {
|
|
26
|
+
try {
|
|
27
|
+
this.state = JSON.parse(readFileSync(this.stateFile, 'utf-8'));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
this.state = this.emptyState();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.state = this.emptyState();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
saveState() {
|
|
38
|
+
if (!this.stateFile)
|
|
39
|
+
return;
|
|
40
|
+
// Trim completed actions to ring buffer size
|
|
41
|
+
if (this.state.completedActions.length > MAX_COMPLETED_ACTIONS) {
|
|
42
|
+
this.state.completedActions = this.state.completedActions.slice(-MAX_COMPLETED_ACTIONS);
|
|
43
|
+
}
|
|
44
|
+
writeFileSync(this.stateFile, JSON.stringify(this.state, null, 2));
|
|
45
|
+
}
|
|
46
|
+
emptyState() {
|
|
47
|
+
return {
|
|
48
|
+
lastRunAt: null,
|
|
49
|
+
lastSuccessAt: null,
|
|
50
|
+
checkpoint: {},
|
|
51
|
+
pendingActions: [],
|
|
52
|
+
completedActions: [],
|
|
53
|
+
lastFindings: [],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// ── Helpers for subclasses ──────────────────────────────────────
|
|
57
|
+
createFinding(headline, detail, urgency = 'medium', entities) {
|
|
58
|
+
return { headline, detail, urgency, entities };
|
|
59
|
+
}
|
|
60
|
+
createAction(type, description, payload, autonomy = 'suggest') {
|
|
61
|
+
return {
|
|
62
|
+
id: randomUUID(),
|
|
63
|
+
agentId: this.id,
|
|
64
|
+
createdAt: new Date().toISOString(),
|
|
65
|
+
type,
|
|
66
|
+
description,
|
|
67
|
+
autonomy,
|
|
68
|
+
status: 'pending',
|
|
69
|
+
payload,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// ── Status for API ─────────────────────────────────────────────
|
|
73
|
+
getStatus(enabled, intervalMs) {
|
|
74
|
+
return {
|
|
75
|
+
id: this.id,
|
|
76
|
+
name: this.name,
|
|
77
|
+
description: this.description,
|
|
78
|
+
enabled,
|
|
79
|
+
running: this.running,
|
|
80
|
+
intervalMs,
|
|
81
|
+
lastRunAt: this.state.lastRunAt,
|
|
82
|
+
lastSuccessAt: this.state.lastSuccessAt,
|
|
83
|
+
pendingActionsCount: this.state.pendingActions.length,
|
|
84
|
+
lastFindings: this.state.lastFindings,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=base-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-agent.js","sourceRoot":"","sources":["../../../src/server/agents/base-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executive Digest Agent — daily synthesis across all agents
|
|
3
|
+
*
|
|
4
|
+
* Runs daily (or on-demand), reads recent findings from all agents
|
|
5
|
+
* and recent entity changes, synthesizes a narrative summary.
|
|
6
|
+
* Writes to MemoryService for persistent record.
|
|
7
|
+
*/
|
|
8
|
+
import { AutonomousAgent } from './base-agent.js';
|
|
9
|
+
import type { AgentContext, AgentTickResult } from './types.js';
|
|
10
|
+
export declare class ExecutiveDigest extends AutonomousAgent {
|
|
11
|
+
readonly id = "executive-digest";
|
|
12
|
+
readonly name = "Executive Digest";
|
|
13
|
+
readonly description = "Daily synthesis of agent findings and workspace activity";
|
|
14
|
+
readonly defaultIntervalMs: number;
|
|
15
|
+
tick(ctx: AgentContext): Promise<AgentTickResult>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executive Digest Agent — daily synthesis across all agents
|
|
3
|
+
*
|
|
4
|
+
* Runs daily (or on-demand), reads recent findings from all agents
|
|
5
|
+
* and recent entity changes, synthesizes a narrative summary.
|
|
6
|
+
* Writes to MemoryService for persistent record.
|
|
7
|
+
*/
|
|
8
|
+
import { AutonomousAgent } from './base-agent.js';
|
|
9
|
+
import { readdirSync, readFileSync, existsSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
const TWENTY_FOUR_HOURS = 24 * 60 * 60 * 1000;
|
|
12
|
+
export class ExecutiveDigest extends AutonomousAgent {
|
|
13
|
+
id = 'executive-digest';
|
|
14
|
+
name = 'Executive Digest';
|
|
15
|
+
description = 'Daily synthesis of agent findings and workspace activity';
|
|
16
|
+
defaultIntervalMs = TWENTY_FOUR_HOURS;
|
|
17
|
+
async tick(ctx) {
|
|
18
|
+
const findings = [];
|
|
19
|
+
// Collect recent findings from all other agents
|
|
20
|
+
const allFindings = [];
|
|
21
|
+
const agentDirs = existsSync(ctx.stateDir) ? readdirSync(ctx.stateDir, { withFileTypes: true }) : [];
|
|
22
|
+
for (const dir of agentDirs) {
|
|
23
|
+
if (!dir.isDirectory() || dir.name === this.id)
|
|
24
|
+
continue;
|
|
25
|
+
const stateFile = join(ctx.stateDir, dir.name, 'state.json');
|
|
26
|
+
if (!existsSync(stateFile))
|
|
27
|
+
continue;
|
|
28
|
+
try {
|
|
29
|
+
const state = JSON.parse(readFileSync(stateFile, 'utf-8'));
|
|
30
|
+
if (state.lastFindings) {
|
|
31
|
+
for (const f of state.lastFindings) {
|
|
32
|
+
allFindings.push({ agent: dir.name, finding: f });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Count entity changes in the last 24h
|
|
41
|
+
let recentChanges = 0;
|
|
42
|
+
let activeRepos = 0;
|
|
43
|
+
const typeChanges = {};
|
|
44
|
+
for (const repo of ctx.workspaceManager.getAllRepoConfigs()) {
|
|
45
|
+
try {
|
|
46
|
+
const graph = ctx.workspaceManager.getGraph(repo.name);
|
|
47
|
+
const entities = graph.search({});
|
|
48
|
+
let repoChanged = false;
|
|
49
|
+
for (const entity of entities) {
|
|
50
|
+
const data = entity.data;
|
|
51
|
+
const updatedAt = data.updated_at;
|
|
52
|
+
if (updatedAt && (Date.now() - new Date(updatedAt).getTime()) < TWENTY_FOUR_HOURS) {
|
|
53
|
+
recentChanges++;
|
|
54
|
+
repoChanged = true;
|
|
55
|
+
const type = data.entity_type ?? 'unknown';
|
|
56
|
+
typeChanges[type] = (typeChanges[type] ?? 0) + 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (repoChanged)
|
|
60
|
+
activeRepos++;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Count findings by urgency
|
|
67
|
+
const highCount = allFindings.filter(f => f.finding.urgency === 'high').length;
|
|
68
|
+
const medCount = allFindings.filter(f => f.finding.urgency === 'medium').length;
|
|
69
|
+
// Build digest
|
|
70
|
+
const parts = [];
|
|
71
|
+
if (highCount > 0) {
|
|
72
|
+
parts.push(`**Attention needed**: ${highCount} high-urgency finding${highCount > 1 ? 's' : ''}`);
|
|
73
|
+
}
|
|
74
|
+
if (medCount > 0) {
|
|
75
|
+
parts.push(`**Review**: ${medCount} medium-urgency finding${medCount > 1 ? 's' : ''}`);
|
|
76
|
+
}
|
|
77
|
+
// Summarize by agent
|
|
78
|
+
const byAgent = new Map();
|
|
79
|
+
for (const { agent, finding } of allFindings) {
|
|
80
|
+
if (!byAgent.has(agent))
|
|
81
|
+
byAgent.set(agent, []);
|
|
82
|
+
byAgent.get(agent).push(finding);
|
|
83
|
+
}
|
|
84
|
+
for (const [agent, agentFindings] of byAgent) {
|
|
85
|
+
parts.push(`**${agent}**: ${agentFindings.map(f => f.headline).join('; ')}`);
|
|
86
|
+
}
|
|
87
|
+
// Activity summary
|
|
88
|
+
if (recentChanges > 0) {
|
|
89
|
+
const topTypes = Object.entries(typeChanges)
|
|
90
|
+
.sort(([, a], [, b]) => b - a)
|
|
91
|
+
.slice(0, 3)
|
|
92
|
+
.map(([type, count]) => `${type} (${count})`)
|
|
93
|
+
.join(', ');
|
|
94
|
+
parts.push(`**Activity**: ${recentChanges} entities updated across ${activeRepos} collections. Most active: ${topTypes}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
parts.push(`**Activity**: No entity changes in the last 24 hours`);
|
|
98
|
+
}
|
|
99
|
+
if (parts.length > 0) {
|
|
100
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
101
|
+
const digestText = parts.join('\n');
|
|
102
|
+
findings.push(this.createFinding(`Daily Digest — ${today}`, digestText, highCount > 0 ? 'high' : medCount > 0 ? 'medium' : 'low'));
|
|
103
|
+
// Write to memory service if available
|
|
104
|
+
if (ctx.memoryService) {
|
|
105
|
+
try {
|
|
106
|
+
ctx.memoryService.writeMemory({ timestamp: new Date(), type: 'note', content: `## Daily Digest — ${today}\n\n${digestText}` });
|
|
107
|
+
}
|
|
108
|
+
catch { /* non-fatal */ }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
this.state.checkpoint.lastDigestDate = new Date().toISOString().slice(0, 10);
|
|
112
|
+
return { findings, actions: [] };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=executive-digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executive-digest.js","sourceRoot":"","sources":["../../../src/server/agents/executive-digest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph Steward — autonomous graph health monitor
|
|
3
|
+
*
|
|
4
|
+
* Periodically runs graph health analysis and reports only NEW or
|
|
5
|
+
* WORSENING issues compared to the last checkpoint. Delta-based
|
|
6
|
+
* reporting avoids alert fatigue — you only hear about changes.
|
|
7
|
+
*/
|
|
8
|
+
import { AutonomousAgent } from './base-agent.js';
|
|
9
|
+
import type { AgentContext, AgentTickResult } from './types.js';
|
|
10
|
+
export declare class GraphSteward extends AutonomousAgent {
|
|
11
|
+
readonly id = "graph-steward";
|
|
12
|
+
readonly name = "Graph Steward";
|
|
13
|
+
readonly description = "Monitors graph health and reports new issues (broken links, stale entities, orphans)";
|
|
14
|
+
readonly defaultIntervalMs: number;
|
|
15
|
+
tick(ctx: AgentContext): Promise<AgentTickResult>;
|
|
16
|
+
}
|