agentopia 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/.claude/settings.local.json +28 -0
  2. package/dist/app.d.ts +10 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +121 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/config.d.ts +9 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +19 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/db/database.d.ts +5 -0
  11. package/dist/db/database.d.ts.map +1 -0
  12. package/dist/db/database.js +39 -0
  13. package/dist/db/database.js.map +1 -0
  14. package/dist/db/schema.d.ts +3 -0
  15. package/dist/db/schema.d.ts.map +1 -0
  16. package/dist/db/schema.js +621 -0
  17. package/dist/db/schema.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +49 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/logger.d.ts +4 -0
  23. package/dist/logger.d.ts.map +1 -0
  24. package/dist/logger.js +9 -0
  25. package/dist/logger.js.map +1 -0
  26. package/dist/middleware/auth.d.ts +13 -0
  27. package/dist/middleware/auth.d.ts.map +1 -0
  28. package/dist/middleware/auth.js +733 -0
  29. package/dist/middleware/auth.js.map +1 -0
  30. package/dist/routes/agents.d.ts +3 -0
  31. package/dist/routes/agents.d.ts.map +1 -0
  32. package/dist/routes/agents.js +1058 -0
  33. package/dist/routes/agents.js.map +1 -0
  34. package/dist/routes/issues.d.ts +4 -0
  35. package/dist/routes/issues.d.ts.map +1 -0
  36. package/dist/routes/issues.js +946 -0
  37. package/dist/routes/issues.js.map +1 -0
  38. package/dist/routes/knowledge.d.ts +3 -0
  39. package/dist/routes/knowledge.d.ts.map +1 -0
  40. package/dist/routes/knowledge.js +117 -0
  41. package/dist/routes/knowledge.js.map +1 -0
  42. package/dist/routes/memories.d.ts +3 -0
  43. package/dist/routes/memories.d.ts.map +1 -0
  44. package/dist/routes/memories.js +115 -0
  45. package/dist/routes/memories.js.map +1 -0
  46. package/dist/routes/messages.d.ts +3 -0
  47. package/dist/routes/messages.d.ts.map +1 -0
  48. package/dist/routes/messages.js +130 -0
  49. package/dist/routes/messages.js.map +1 -0
  50. package/dist/routes/projects.d.ts +3 -0
  51. package/dist/routes/projects.d.ts.map +1 -0
  52. package/dist/routes/projects.js +754 -0
  53. package/dist/routes/projects.js.map +1 -0
  54. package/dist/routes/templates.d.ts +3 -0
  55. package/dist/routes/templates.d.ts.map +1 -0
  56. package/dist/routes/templates.js +117 -0
  57. package/dist/routes/templates.js.map +1 -0
  58. package/dist/routes/ui.d.ts +3 -0
  59. package/dist/routes/ui.d.ts.map +1 -0
  60. package/dist/routes/ui.js +38 -0
  61. package/dist/routes/ui.js.map +1 -0
  62. package/dist/services/agent-hierarchy.d.ts +14 -0
  63. package/dist/services/agent-hierarchy.d.ts.map +1 -0
  64. package/dist/services/agent-hierarchy.js +58 -0
  65. package/dist/services/agent-hierarchy.js.map +1 -0
  66. package/dist/services/agent-issue-batch.d.ts +17 -0
  67. package/dist/services/agent-issue-batch.d.ts.map +1 -0
  68. package/dist/services/agent-issue-batch.js +57 -0
  69. package/dist/services/agent-issue-batch.js.map +1 -0
  70. package/dist/services/controller.d.ts +4 -0
  71. package/dist/services/controller.d.ts.map +1 -0
  72. package/dist/services/controller.js +237 -0
  73. package/dist/services/controller.js.map +1 -0
  74. package/dist/services/langgraph-runner.d.ts +33 -0
  75. package/dist/services/langgraph-runner.d.ts.map +1 -0
  76. package/dist/services/langgraph-runner.js +478 -0
  77. package/dist/services/langgraph-runner.js.map +1 -0
  78. package/dist/services/orchestrator.d.ts +9 -0
  79. package/dist/services/orchestrator.d.ts.map +1 -0
  80. package/dist/services/orchestrator.js +116 -0
  81. package/dist/services/orchestrator.js.map +1 -0
  82. package/dist/services/pre-controller.d.ts +7 -0
  83. package/dist/services/pre-controller.d.ts.map +1 -0
  84. package/dist/services/pre-controller.js +101 -0
  85. package/dist/services/pre-controller.js.map +1 -0
  86. package/dist/services/process-manager.d.ts +67 -0
  87. package/dist/services/process-manager.d.ts.map +1 -0
  88. package/dist/services/process-manager.js +938 -0
  89. package/dist/services/process-manager.js.map +1 -0
  90. package/dist/services/project-permissions.d.ts +84 -0
  91. package/dist/services/project-permissions.d.ts.map +1 -0
  92. package/dist/services/project-permissions.js +129 -0
  93. package/dist/services/project-permissions.js.map +1 -0
  94. package/dist/services/scheduler.d.ts +6 -0
  95. package/dist/services/scheduler.d.ts.map +1 -0
  96. package/dist/services/scheduler.js +300 -0
  97. package/dist/services/scheduler.js.map +1 -0
  98. package/dist/services/system-prompt.d.ts +3 -0
  99. package/dist/services/system-prompt.d.ts.map +1 -0
  100. package/dist/services/system-prompt.js +285 -0
  101. package/dist/services/system-prompt.js.map +1 -0
  102. package/dist/services/terminal.d.ts +18 -0
  103. package/dist/services/terminal.d.ts.map +1 -0
  104. package/dist/services/terminal.js +222 -0
  105. package/dist/services/terminal.js.map +1 -0
  106. package/dist/services/websocket.d.ts +15 -0
  107. package/dist/services/websocket.d.ts.map +1 -0
  108. package/dist/services/websocket.js +204 -0
  109. package/dist/services/websocket.js.map +1 -0
  110. package/dist/types.d.ts +108 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +3 -0
  113. package/dist/types.js.map +1 -0
  114. package/env.ini +18 -0
  115. package/package.json +38 -0
  116. package/project_id +0 -0
  117. package/public/admin-users.html +188 -0
  118. package/public/agent.html +199 -0
  119. package/public/css/issues.css +275 -0
  120. package/public/css/style.css +1299 -0
  121. package/public/index.html +166 -0
  122. package/public/issue.html +76 -0
  123. package/public/js/agent.js +19 -0
  124. package/public/js/common.js +735 -0
  125. package/public/js/dashboard.js +772 -0
  126. package/public/js/files-panel.js +703 -0
  127. package/public/js/interactive-terminal.js +201 -0
  128. package/public/js/issue-renderer.js +559 -0
  129. package/public/js/issue.js +57 -0
  130. package/public/js/project.js +2425 -0
  131. package/public/js/terminal.js +564 -0
  132. package/public/project.html +430 -0
  133. package/public/terminal.html +67 -0
  134. package/public/vendor/marked.js +74 -0
  135. package/public/vendor/xterm-addon-fit.js +2 -0
  136. package/public/vendor/xterm.css +209 -0
  137. package/public/vendor/xterm.js +2 -0
  138. package/send_message_and_update_issue.js +65 -0
  139. package/tsconfig.json +19 -0
  140. package/update_round2_and_create_round3.js +284 -0
@@ -0,0 +1,478 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runControllerWithLangGraph = runControllerWithLangGraph;
7
+ const langgraph_1 = require("@langchain/langgraph");
8
+ const uuid_1 = require("uuid");
9
+ const config_1 = require("../config");
10
+ const database_1 = require("../db/database");
11
+ const logger_1 = __importDefault(require("../logger"));
12
+ const process_manager_1 = require("./process-manager");
13
+ const agent_issue_batch_1 = require("./agent-issue-batch");
14
+ const system_prompt_1 = require("./system-prompt");
15
+ const ControllerGraphState = langgraph_1.Annotation.Root({
16
+ project: (0, langgraph_1.Annotation)(),
17
+ controller: (0, langgraph_1.Annotation)(),
18
+ taskPrompt: (0, langgraph_1.Annotation)(),
19
+ issues: (0, langgraph_1.Annotation)({
20
+ reducer: (_left, right) => right,
21
+ default: () => [],
22
+ }),
23
+ agents: (0, langgraph_1.Annotation)({
24
+ reducer: (_left, right) => right,
25
+ default: () => [],
26
+ }),
27
+ workerOutcomeHints: (0, langgraph_1.Annotation)({
28
+ reducer: (_left, right) => right,
29
+ default: () => [],
30
+ }),
31
+ actions: (0, langgraph_1.Annotation)({
32
+ reducer: (_left, right) => right,
33
+ default: () => [],
34
+ }),
35
+ dispatchResults: (0, langgraph_1.Annotation)({
36
+ reducer: (_left, right) => right,
37
+ default: () => [],
38
+ }),
39
+ dispatchSummary: (0, langgraph_1.Annotation)({
40
+ reducer: (_left, right) => right,
41
+ default: () => '',
42
+ }),
43
+ controllerReasons: (0, langgraph_1.Annotation)({
44
+ reducer: (_left, right) => right,
45
+ default: () => [],
46
+ }),
47
+ controllerDecision: (0, langgraph_1.Annotation)({
48
+ reducer: (_left, right) => right,
49
+ default: () => 'finish',
50
+ }),
51
+ triggerIssueNumber: (0, langgraph_1.Annotation)(),
52
+ commandTemplate: (0, langgraph_1.Annotation)(),
53
+ systemPrompt: (0, langgraph_1.Annotation)(),
54
+ runId: (0, langgraph_1.Annotation)(),
55
+ pid: (0, langgraph_1.Annotation)(),
56
+ });
57
+ function buildWorkerPrompt(project, agent, assignedIssues) {
58
+ const issueBatch = (0, agent_issue_batch_1.getAgentIssueBatch)(assignedIssues);
59
+ const parts = [];
60
+ if (agent.role)
61
+ parts.push('Role: ' + agent.role);
62
+ if (project.task_description)
63
+ parts.push('Project task: ' + project.task_description);
64
+ parts.push('You were auto-dispatched because you have ' + issueBatch.activeIssues.length + ' active assigned issue(s). Prioritize high-priority items first.');
65
+ parts.push((0, agent_issue_batch_1.buildAssignedIssuesPrompt)(issueBatch, {
66
+ bodyCharLimit: 1000,
67
+ stopInstruction: 'Update issue status/comments while you work. Only work on the current batch in this run; when the current batch is complete, stop.',
68
+ }));
69
+ return parts.join('\n\n');
70
+ }
71
+ const WAITING_USER_PATTERNS = [
72
+ /等待用户|用户确认|需用户|需要用户|待用户|请用户确认|等用户决定/i,
73
+ /\b(wait(?:ing)? for user|need(?:s)? user|await(?:ing)? user|user decision|user confirmation|pending user|approval needed)\b/i,
74
+ ];
75
+ const DONE_PATTERNS = [
76
+ /已完成|已经完成|完成了|修复完成|处理完成|结束了|已解决|解决完成|验证通过/i,
77
+ /\b(done|completed|fixed|resolved|all tasks finished|work complete)\b/i,
78
+ ];
79
+ const CONTINUE_PATTERNS = [
80
+ /继续执行|继续处理|下一步|继续推进|继续做|马上继续/i,
81
+ /\b(continue|next step|proceed|keep working|follow-up)\b/i,
82
+ ];
83
+ function parseDbTimestamp(raw) {
84
+ if (!raw)
85
+ return null;
86
+ const normalized = raw.includes('T')
87
+ ? (raw.endsWith('Z') ? raw : raw + 'Z')
88
+ : raw.replace(' ', 'T') + 'Z';
89
+ const ms = Date.parse(normalized);
90
+ return Number.isNaN(ms) ? null : ms;
91
+ }
92
+ function analyzeWorkerExcerpt(excerpt) {
93
+ if (!excerpt) {
94
+ return { signal: 'unknown', summary: 'no recent output captured' };
95
+ }
96
+ if (WAITING_USER_PATTERNS.some((re) => re.test(excerpt))) {
97
+ return { signal: 'needs_user', summary: 'latest output indicates user decision/confirmation is needed' };
98
+ }
99
+ if (DONE_PATTERNS.some((re) => re.test(excerpt))) {
100
+ return { signal: 'done', summary: 'latest output indicates task completion' };
101
+ }
102
+ if (CONTINUE_PATTERNS.some((re) => re.test(excerpt))) {
103
+ return { signal: 'continue', summary: 'latest output indicates worker can continue execution' };
104
+ }
105
+ return { signal: 'unknown', summary: 'latest output does not clearly indicate next state' };
106
+ }
107
+ function loadLatestRunExcerpt(db, agentId) {
108
+ const latestRun = db.prepare("SELECT run_id FROM conversation_logs WHERE agent_id = ? AND stream IN ('stdout', 'stderr') ORDER BY id DESC LIMIT 1").get(agentId);
109
+ if (!latestRun?.run_id)
110
+ return '';
111
+ const rows = db.prepare("SELECT content FROM conversation_logs WHERE agent_id = ? AND run_id = ? AND stream IN ('stdout', 'stderr') ORDER BY id DESC LIMIT 30").all(agentId, latestRun.run_id);
112
+ if (rows.length === 0)
113
+ return '';
114
+ const merged = rows
115
+ .reverse()
116
+ .map((r) => (r.content || '').trim())
117
+ .filter(Boolean)
118
+ .join('\n');
119
+ if (!merged)
120
+ return '';
121
+ const compact = merged.replace(/\s+/g, ' ').trim();
122
+ return compact.length > 1800 ? compact.slice(compact.length - 1800) : compact;
123
+ }
124
+ function collectWorkerOutcomeHints(state) {
125
+ const db = (0, database_1.getDatabase)();
126
+ const now = Date.now();
127
+ const activeByAgent = new Map();
128
+ for (const issue of state.issues) {
129
+ if (!issue.assigned_to || issue.assigned_to === 'user' || issue.assigned_to === 'all')
130
+ continue;
131
+ const current = activeByAgent.get(issue.assigned_to) || [];
132
+ current.push(issue);
133
+ activeByAgent.set(issue.assigned_to, current);
134
+ }
135
+ const hints = [];
136
+ for (const worker of state.agents) {
137
+ if (worker.is_controller)
138
+ continue;
139
+ if (worker.status !== 'idle')
140
+ continue;
141
+ const assignedIssues = activeByAgent.get(worker.id) || [];
142
+ if (assignedIssues.length === 0)
143
+ continue;
144
+ const finishedAt = parseDbTimestamp(worker.finished_at);
145
+ if (!finishedAt)
146
+ continue;
147
+ const ageMs = now - finishedAt;
148
+ if (ageMs < 0 || ageMs > 60 * 60 * 1000)
149
+ continue;
150
+ const excerpt = loadLatestRunExcerpt(db, worker.id);
151
+ if (!excerpt)
152
+ continue;
153
+ const analysis = analyzeWorkerExcerpt(excerpt);
154
+ hints.push({
155
+ agentId: worker.id,
156
+ signal: analysis.signal,
157
+ summary: analysis.summary,
158
+ excerpt: excerpt.length > 260 ? excerpt.slice(excerpt.length - 260) : excerpt,
159
+ issueCount: assignedIssues.length,
160
+ issueIds: assignedIssues.map((i) => i.id),
161
+ issueNumbers: assignedIssues.map((i) => i.number),
162
+ });
163
+ }
164
+ return hints;
165
+ }
166
+ function reconcileNeedsUserOutcomes(project, hints, agents) {
167
+ const db = (0, database_1.getDatabase)();
168
+ const reasons = [];
169
+ let movedCount = 0;
170
+ const agentNameById = new Map(agents.map((a) => [a.id, a.name]));
171
+ const eventStmt = db.prepare('INSERT INTO issue_comments (id, issue_id, author_id, body, event_type, meta) VALUES (?, ?, ?, ?, ?, ?)');
172
+ for (const hint of hints) {
173
+ if (hint.signal !== 'needs_user')
174
+ continue;
175
+ const agentName = agentNameById.get(hint.agentId) || hint.agentId;
176
+ for (let i = 0; i < hint.issueIds.length; i++) {
177
+ const issueId = hint.issueIds[i];
178
+ const issueNumber = hint.issueNumbers[i] || 0;
179
+ const issueRow = db.prepare("SELECT assigned_to FROM issues WHERE id = ? AND project_id = ? AND status IN ('open', 'in_progress')").get(issueId, project.id);
180
+ if (!issueRow || issueRow.assigned_to === 'user')
181
+ continue;
182
+ db.prepare("UPDATE issues SET assigned_to = 'user', updated_at = datetime('now') WHERE id = ?").run(issueId);
183
+ const metaBase = {
184
+ source: 'langgraph_worker_outcome',
185
+ signal: hint.signal,
186
+ agent_id: hint.agentId,
187
+ issue_number: issueNumber,
188
+ };
189
+ eventStmt.run((0, uuid_1.v4)(), issueId, 'system', 'assigned to user (auto-handoff from ' + agentName + ')', 'assignment', JSON.stringify({ ...metaBase, from: hint.agentId, to: 'user' }));
190
+ const commentBody = 'Auto-handoff by orchestrator: worker ' + agentName + ' ended with signal "' + hint.signal + '".\n' +
191
+ 'Summary: ' + hint.summary + '\n' +
192
+ (hint.excerpt ? 'Worker excerpt: ' + hint.excerpt : '');
193
+ eventStmt.run((0, uuid_1.v4)(), issueId, 'system', commentBody, 'comment', JSON.stringify({ ...metaBase, excerpt: hint.excerpt }));
194
+ movedCount += 1;
195
+ reasons.push('auto-assigned issue #' + (issueNumber || '?') + ' to user after ' + agentName + ' signaled needs_user');
196
+ }
197
+ }
198
+ return { movedCount, reasons };
199
+ }
200
+ const controllerGraph = new langgraph_1.StateGraph(ControllerGraphState)
201
+ .addNode('collect_context', (state) => {
202
+ const db = (0, database_1.getDatabase)();
203
+ const project = db.prepare('SELECT * FROM projects WHERE id = ?').get(state.project.id);
204
+ const agents = db.prepare('SELECT * FROM agents WHERE project_id = ? ORDER BY created_at').all(state.project.id);
205
+ // Exclude pending issues — they are waiting for child issues and don't need dispatch
206
+ const issues = state.triggerIssueNumber
207
+ ? db.prepare("SELECT * FROM issues WHERE project_id = ? AND number = ?").all(state.project.id, state.triggerIssueNumber)
208
+ : db.prepare("SELECT * FROM issues WHERE project_id = ? AND status IN ('open', 'in_progress') ORDER BY priority DESC, created_at").all(state.project.id);
209
+ if (!project) {
210
+ return {
211
+ agents,
212
+ issues,
213
+ controllerDecision: 'finish',
214
+ controllerReasons: ['Project not found during orchestration run'],
215
+ };
216
+ }
217
+ return { project, agents, issues };
218
+ })
219
+ .addNode('inspect_worker_outcomes', (state) => {
220
+ const hints = collectWorkerOutcomeHints(state);
221
+ const reconciled = reconcileNeedsUserOutcomes(state.project, hints, state.agents);
222
+ const db = (0, database_1.getDatabase)();
223
+ // Re-fetch active issues (exclude pending — handled by system-level parent-child logic)
224
+ const refreshedIssues = db.prepare("SELECT * FROM issues WHERE project_id = ? AND status IN ('open', 'in_progress') ORDER BY priority DESC, created_at").all(state.project.id);
225
+ if (hints.length > 0 || reconciled.movedCount > 0) {
226
+ logger_1.default.info('LangGraph worker outcome hints detected (project=' + state.project.id + ', hints=' + hints.length + ', moved_to_user=' + reconciled.movedCount + ')');
227
+ }
228
+ return {
229
+ workerOutcomeHints: hints,
230
+ issues: refreshedIssues,
231
+ controllerReasons: reconciled.reasons,
232
+ };
233
+ })
234
+ .addNode('plan', (state) => {
235
+ const workers = state.agents.filter((a) => !a.is_controller);
236
+ const activeByAgent = new Map();
237
+ const hintsByAgent = new Map(state.workerOutcomeHints.map((h) => [h.agentId, h]));
238
+ const controllerReasons = [...state.controllerReasons];
239
+ for (const issue of state.issues) {
240
+ if (!issue.assigned_to || issue.assigned_to === 'user' || issue.assigned_to === 'all')
241
+ continue;
242
+ const current = activeByAgent.get(issue.assigned_to) || [];
243
+ current.push(issue);
244
+ activeByAgent.set(issue.assigned_to, current);
245
+ }
246
+ const actions = [];
247
+ for (const worker of workers) {
248
+ if (worker.paused || worker.status === 'running')
249
+ continue;
250
+ const assignedIssues = activeByAgent.get(worker.id) || [];
251
+ if (assignedIssues.length === 0)
252
+ continue;
253
+ const hint = hintsByAgent.get(worker.id);
254
+ if (hint?.signal === 'needs_user') {
255
+ controllerReasons.push('worker ' + worker.name + ' needs user decision but issue assignment was not updated');
256
+ continue;
257
+ }
258
+ if (hint?.signal === 'done') {
259
+ controllerReasons.push('worker ' + worker.name + ' appears done but still has ' + assignedIssues.length + ' active assigned issue(s)');
260
+ continue;
261
+ }
262
+ if (hint?.signal === 'unknown') {
263
+ controllerReasons.push('worker ' + worker.name + ' finished without clear issue-state update');
264
+ continue;
265
+ }
266
+ const actionReason = hint?.signal === 'continue'
267
+ ? 'worker has ' + assignedIssues.length + ' active assigned issues; latest output suggests continue'
268
+ : 'worker has ' + assignedIssues.length + ' active assigned issues';
269
+ actions.push({
270
+ agentId: worker.id,
271
+ issueIds: assignedIssues.map((i) => i.id),
272
+ issueNumbers: assignedIssues.map((i) => i.number),
273
+ reason: actionReason,
274
+ });
275
+ }
276
+ const unassignedOrBroadcast = state.issues.filter((i) => !i.assigned_to || i.assigned_to === 'all').length;
277
+ const userAssigned = state.issues.filter((i) => i.assigned_to === 'user').length;
278
+ const erroredWorkers = workers.filter((w) => w.status === 'error').length;
279
+ const missingAssignee = state.issues.filter((i) => i.assigned_to && i.assigned_to !== 'user' && i.assigned_to !== 'all' && !state.agents.find((a) => a.id === i.assigned_to)).length;
280
+ if (unassignedOrBroadcast > 0) {
281
+ controllerReasons.push(unassignedOrBroadcast + ' issue(s) are unassigned or broadcast');
282
+ }
283
+ if (userAssigned > 0) {
284
+ controllerReasons.push(userAssigned + ' issue(s) are waiting on user');
285
+ }
286
+ if (erroredWorkers > 0) {
287
+ controllerReasons.push(erroredWorkers + ' worker(s) are in error state');
288
+ }
289
+ if (missingAssignee > 0) {
290
+ controllerReasons.push(missingAssignee + ' issue(s) reference missing assignees');
291
+ }
292
+ const shouldExecuteController = controllerReasons.length > 0 || actions.length === 0;
293
+ return {
294
+ actions,
295
+ controllerReasons,
296
+ controllerDecision: shouldExecuteController ? 'execute_controller' : 'finish',
297
+ };
298
+ })
299
+ .addNode('policy_gate', (state) => {
300
+ if (state.project.status !== 'active') {
301
+ return {
302
+ actions: [],
303
+ controllerDecision: 'finish',
304
+ controllerReasons: ['project status is ' + state.project.status],
305
+ };
306
+ }
307
+ const issuesById = new Map(state.issues.map((issue) => [issue.id, issue]));
308
+ const agentsById = new Map(state.agents.map((agent) => [agent.id, agent]));
309
+ const seen = new Set();
310
+ const allowedActions = [];
311
+ const reasons = [...state.controllerReasons];
312
+ for (const action of state.actions) {
313
+ if (seen.has(action.agentId))
314
+ continue;
315
+ seen.add(action.agentId);
316
+ const agent = agentsById.get(action.agentId);
317
+ if (!agent) {
318
+ reasons.push('agent ' + action.agentId + ' disappeared before dispatch');
319
+ continue;
320
+ }
321
+ if (agent.is_controller)
322
+ continue;
323
+ if (agent.paused)
324
+ continue;
325
+ if (agent.status === 'running')
326
+ continue;
327
+ const validIssues = action.issueIds
328
+ .map((id) => issuesById.get(id))
329
+ .filter((issue) => !!issue);
330
+ if (validIssues.length === 0)
331
+ continue;
332
+ allowedActions.push({
333
+ agentId: action.agentId,
334
+ issueIds: validIssues.map((i) => i.id),
335
+ issueNumbers: validIssues.map((i) => i.number),
336
+ reason: action.reason,
337
+ });
338
+ }
339
+ if (allowedActions.length === 0 && state.issues.length > 0 && reasons.length === 0) {
340
+ reasons.push('No dispatchable worker actions were allowed by policy');
341
+ }
342
+ const shouldExecuteController = reasons.length > 0 || allowedActions.length === 0;
343
+ return {
344
+ actions: allowedActions,
345
+ controllerReasons: reasons,
346
+ controllerDecision: shouldExecuteController ? 'execute_controller' : 'finish',
347
+ };
348
+ })
349
+ .addNode('dispatch_actions', (state) => {
350
+ const db = (0, database_1.getDatabase)();
351
+ const results = [];
352
+ let forceController = false;
353
+ for (const action of state.actions) {
354
+ const agent = db.prepare('SELECT * FROM agents WHERE id = ?').get(action.agentId);
355
+ if (!agent) {
356
+ forceController = true;
357
+ results.push({ agentId: action.agentId, started: false, message: 'agent not found at dispatch time' });
358
+ continue;
359
+ }
360
+ if (agent.is_controller || agent.paused || agent.status === 'running') {
361
+ forceController = true;
362
+ results.push({ agentId: action.agentId, started: false, message: 'agent unavailable (status=' + agent.status + ', paused=' + agent.paused + ')' });
363
+ continue;
364
+ }
365
+ const assignedIssues = db.prepare("SELECT * FROM issues WHERE project_id = ? AND assigned_to = ? AND status IN ('open', 'in_progress') ORDER BY priority DESC, created_at").all(state.project.id, agent.id);
366
+ if (assignedIssues.length === 0) {
367
+ results.push({ agentId: action.agentId, started: false, message: 'no active assigned issues at dispatch time' });
368
+ continue;
369
+ }
370
+ const prompt = buildWorkerPrompt(state.project, agent, assignedIssues);
371
+ const commandTemplate = agent.command_template || state.project.command_template || config_1.config.defaultCommandTemplate;
372
+ const isRawShell = /^\s*(bash|sh|zsh)\s+-c\b/.test(commandTemplate);
373
+ const systemPrompt = isRawShell ? undefined : (0, system_prompt_1.buildSystemPrompt)(agent, state.project);
374
+ try {
375
+ const process = (0, process_manager_1.startAgentProcess)(agent, prompt, commandTemplate, systemPrompt);
376
+ const issueBatch = (0, agent_issue_batch_1.getAgentIssueBatch)(assignedIssues);
377
+ (0, agent_issue_batch_1.markCurrentBatchInProgress)(db, issueBatch);
378
+ logger_1.default.info('LangGraph dispatched worker agent (project=' + state.project.id + ', agent=' + agent.id + ', issues=' + issueBatch.currentBatch.length + '/' + issueBatch.activeIssues.length + ', runId=' + process.runId + ')');
379
+ results.push({
380
+ agentId: action.agentId,
381
+ started: true,
382
+ message: 'started for ' + issueBatch.currentBatch.length + '/' + issueBatch.activeIssues.length + ' assigned issue(s) in current batch',
383
+ runId: process.runId,
384
+ pid: process.pid,
385
+ });
386
+ }
387
+ catch (err) {
388
+ forceController = true;
389
+ results.push({
390
+ agentId: action.agentId,
391
+ started: false,
392
+ message: 'failed to start: ' + (err?.message || String(err)),
393
+ });
394
+ }
395
+ }
396
+ const started = results.filter((r) => r.started).length;
397
+ const skippedOrFailed = results.length - started;
398
+ const summary = 'worker dispatch summary: ' + started + ' started, ' + skippedOrFailed + ' skipped/failed';
399
+ const reasons = [...state.controllerReasons];
400
+ if (forceController)
401
+ reasons.push('worker dispatch had failures and needs controller recovery');
402
+ return {
403
+ dispatchResults: results,
404
+ dispatchSummary: summary,
405
+ controllerReasons: reasons,
406
+ controllerDecision: forceController && state.controllerDecision === 'finish'
407
+ ? 'execute_controller'
408
+ : state.controllerDecision,
409
+ };
410
+ })
411
+ .addNode('execute_controller', (state) => {
412
+ const commandTemplate = state.controller.command_template || state.project.command_template || config_1.config.defaultCommandTemplate;
413
+ const isRawShell = /^\s*(bash|sh|zsh)\s+-c\b/.test(commandTemplate);
414
+ const systemPrompt = isRawShell ? undefined : (0, system_prompt_1.buildSystemPrompt)(state.controller, state.project);
415
+ const agentNameById = new Map(state.agents.map((a) => [a.id, a.name]));
416
+ const findings = [];
417
+ for (const hint of state.workerOutcomeHints.slice(0, 8)) {
418
+ const name = agentNameById.get(hint.agentId) || hint.agentId;
419
+ findings.push('- ' + name + ' (' + hint.signal + '): ' + hint.summary + '. excerpt="' + hint.excerpt + '"');
420
+ }
421
+ if (state.controllerReasons.length > 0) {
422
+ findings.push(...state.controllerReasons.slice(0, 10).map((r) => '- decision reason: ' + r));
423
+ }
424
+ const controllerPrompt = findings.length > 0
425
+ ? state.taskPrompt + '\n\n## Orchestration Findings\n' + findings.join('\n') + '\n\nPlease decide whether to re-dispatch workers, assign issue to user, close issue, or create follow-up issues.'
426
+ : state.taskPrompt;
427
+ const result = (0, process_manager_1.startAgentProcess)(state.controller, controllerPrompt, commandTemplate, systemPrompt);
428
+ return {
429
+ commandTemplate,
430
+ systemPrompt,
431
+ runId: result.runId,
432
+ pid: result.pid,
433
+ };
434
+ })
435
+ .addNode('finish', (state) => {
436
+ const reasonText = state.controllerReasons.length > 0 ? state.controllerReasons.join('; ') : 'no controller work needed';
437
+ const summary = state.dispatchSummary || 'no worker dispatch';
438
+ logger_1.default.info('LangGraph orchestration finished without controller run (project=' + state.project.id + '): ' + summary + '; reasons=' + reasonText);
439
+ return {};
440
+ })
441
+ .addEdge(langgraph_1.START, 'collect_context')
442
+ .addEdge('collect_context', 'inspect_worker_outcomes')
443
+ .addEdge('inspect_worker_outcomes', 'plan')
444
+ .addEdge('plan', 'policy_gate')
445
+ .addEdge('policy_gate', 'dispatch_actions')
446
+ .addConditionalEdges('dispatch_actions', (state) => state.controllerDecision, {
447
+ execute_controller: 'execute_controller',
448
+ finish: 'finish',
449
+ })
450
+ .addEdge('execute_controller', langgraph_1.END)
451
+ .addEdge('finish', langgraph_1.END)
452
+ .compile();
453
+ async function runControllerWithLangGraph(input) {
454
+ const result = await controllerGraph.invoke({
455
+ project: input.project,
456
+ controller: input.controller,
457
+ taskPrompt: input.taskPrompt,
458
+ triggerIssueNumber: input.triggerIssueNumber,
459
+ });
460
+ const decision = (result.controllerDecision || 'finish');
461
+ const controllerStarted = !!result.runId && result.pid !== undefined;
462
+ const dispatchResults = result.dispatchResults || [];
463
+ if (decision === 'execute_controller' && !controllerStarted) {
464
+ throw new Error('LangGraph decided to execute controller but did not return run metadata');
465
+ }
466
+ return {
467
+ controllerStarted,
468
+ runId: result.runId,
469
+ pid: result.pid,
470
+ decision,
471
+ dispatchSummary: result.dispatchSummary || '',
472
+ dispatchCount: dispatchResults.filter((r) => r.started).length,
473
+ controllerReasons: result.controllerReasons || [],
474
+ actions: result.actions || [],
475
+ dispatchResults,
476
+ };
477
+ }
478
+ //# sourceMappingURL=langgraph-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langgraph-runner.js","sourceRoot":"","sources":["../../src/services/langgraph-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Agent, Project } from '../types';
2
+ export interface ControllerOrchestrationInput {
3
+ project: Project;
4
+ controller: Agent;
5
+ taskPrompt: string;
6
+ triggerIssueNumber?: number;
7
+ }
8
+ export declare function startControllerOrchestration(input: ControllerOrchestrationInput): void;
9
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/services/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAsB,OAAO,EAAE,MAAM,UAAU,CAAC;AAQ9D,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,KAAK,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAsID,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,4BAA4B,GAAG,IAAI,CAYtF"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.startControllerOrchestration = startControllerOrchestration;
7
+ const config_1 = require("../config");
8
+ const database_1 = require("../db/database");
9
+ const logger_1 = __importDefault(require("../logger"));
10
+ const process_manager_1 = require("./process-manager");
11
+ const system_prompt_1 = require("./system-prompt");
12
+ const langgraph_runner_1 = require("./langgraph-runner");
13
+ function normalizeEngine(value) {
14
+ return String(value || '').toLowerCase() === 'native' ? 'native' : 'langgraph';
15
+ }
16
+ function safeJson(value) {
17
+ try {
18
+ return JSON.stringify(value || []);
19
+ }
20
+ catch {
21
+ return '[]';
22
+ }
23
+ }
24
+ function recordOrchestrationRun(projectId, input) {
25
+ try {
26
+ const db = (0, database_1.getDatabase)();
27
+ db.prepare(`INSERT INTO orchestration_runs (
28
+ project_id,
29
+ engine,
30
+ decision,
31
+ controller_agent_id,
32
+ controller_started,
33
+ controller_run_id,
34
+ controller_pid,
35
+ dispatch_count,
36
+ dispatch_summary,
37
+ reasons,
38
+ actions,
39
+ dispatch_results
40
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(projectId, input.engine, input.decision, input.controllerAgentId || null, input.controllerStarted ? 1 : 0, input.controllerRunId || null, input.controllerPid ?? null, input.dispatchCount, input.dispatchSummary || '', safeJson(input.reasons), safeJson(input.actions), safeJson(input.dispatchResults));
41
+ }
42
+ catch (err) {
43
+ logger_1.default.warn(err, `Failed to record orchestration run for project ${projectId}`);
44
+ }
45
+ }
46
+ function startNativeController(input) {
47
+ const { project, controller, taskPrompt } = input;
48
+ const commandTemplate = controller.command_template || project.command_template || config_1.config.defaultCommandTemplate;
49
+ const isRawShell = /^\s*(bash|sh|zsh)\s+-c\b/.test(commandTemplate);
50
+ const systemPrompt = isRawShell ? undefined : (0, system_prompt_1.buildSystemPrompt)(controller, project);
51
+ const run = (0, process_manager_1.startAgentProcess)(controller, taskPrompt, commandTemplate, systemPrompt);
52
+ recordOrchestrationRun(project.id, {
53
+ engine: 'native',
54
+ decision: 'execute_controller',
55
+ controllerAgentId: controller.id,
56
+ controllerStarted: true,
57
+ controllerRunId: run.runId,
58
+ controllerPid: run.pid,
59
+ dispatchCount: 0,
60
+ dispatchSummary: 'native controller launch',
61
+ reasons: ['Native engine directly starts controller'],
62
+ actions: [],
63
+ dispatchResults: [],
64
+ });
65
+ }
66
+ function startLangGraphController(input) {
67
+ logger_1.default.info(`Triggering controller via langgraph for project "${input.project.name}"`);
68
+ void (0, langgraph_runner_1.runControllerWithLangGraph)(input)
69
+ .then((result) => {
70
+ recordOrchestrationRun(input.project.id, {
71
+ engine: 'langgraph',
72
+ decision: result.decision,
73
+ controllerAgentId: input.controller.id,
74
+ controllerStarted: result.controllerStarted,
75
+ controllerRunId: result.runId,
76
+ controllerPid: result.pid,
77
+ dispatchCount: result.dispatchCount,
78
+ dispatchSummary: result.dispatchSummary,
79
+ reasons: result.controllerReasons,
80
+ actions: result.actions,
81
+ dispatchResults: result.dispatchResults,
82
+ });
83
+ if (result.controllerStarted) {
84
+ logger_1.default.info(`LangGraph controller run created (project=${input.project.id}, agent=${input.controller.id}, runId=${result.runId}, pid=${result.pid}, decision=${result.decision}, dispatched=${result.dispatchCount})`);
85
+ return;
86
+ }
87
+ const reasons = result.controllerReasons.length > 0 ? result.controllerReasons.join('; ') : 'none';
88
+ logger_1.default.info(`LangGraph orchestration finished without controller start (project=${input.project.id}, decision=${result.decision}, dispatched=${result.dispatchCount}, reasons=${reasons})`);
89
+ })
90
+ .catch((err) => {
91
+ recordOrchestrationRun(input.project.id, {
92
+ engine: 'langgraph',
93
+ decision: 'error',
94
+ controllerAgentId: input.controller.id,
95
+ controllerStarted: false,
96
+ dispatchCount: 0,
97
+ dispatchSummary: 'langgraph execution failed',
98
+ reasons: [err?.message || String(err)],
99
+ actions: [],
100
+ dispatchResults: [],
101
+ });
102
+ logger_1.default.error(err, `LangGraph controller run failed for project ${input.project.id}`);
103
+ });
104
+ }
105
+ function startControllerOrchestration(input) {
106
+ const projectEngineRaw = input.project.orchestrator_engine;
107
+ const engine = (projectEngineRaw === undefined || projectEngineRaw === null || projectEngineRaw === '')
108
+ ? normalizeEngine(config_1.config.defaultOrchestratorEngine)
109
+ : normalizeEngine(projectEngineRaw);
110
+ if (engine === 'langgraph') {
111
+ startLangGraphController(input);
112
+ return;
113
+ }
114
+ startNativeController(input);
115
+ }
116
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/services/orchestrator.ts"],"names":[],"mappings":"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"}