orka-cli 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.
- package/CHANGELOG.md +25 -0
- package/CONTRIBUTING.md +59 -0
- package/README.md +208 -0
- package/dist/agents/base-agent.d.ts +48 -0
- package/dist/agents/base-agent.d.ts.map +1 -0
- package/dist/agents/base-agent.js +59 -0
- package/dist/agents/base-agent.js.map +1 -0
- package/dist/agents/builder.d.ts +53 -0
- package/dist/agents/builder.d.ts.map +1 -0
- package/dist/agents/builder.js +147 -0
- package/dist/agents/builder.js.map +1 -0
- package/dist/agents/coordinator.d.ts +45 -0
- package/dist/agents/coordinator.d.ts.map +1 -0
- package/dist/agents/coordinator.js +201 -0
- package/dist/agents/coordinator.js.map +1 -0
- package/dist/agents/index.d.ts +8 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +7 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/reviewer.d.ts +39 -0
- package/dist/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/reviewer.js +119 -0
- package/dist/agents/reviewer.js.map +1 -0
- package/dist/agents/scout.d.ts +35 -0
- package/dist/agents/scout.d.ts.map +1 -0
- package/dist/agents/scout.js +76 -0
- package/dist/agents/scout.js.map +1 -0
- package/dist/agents/tester.d.ts +25 -0
- package/dist/agents/tester.d.ts.map +1 -0
- package/dist/agents/tester.js +76 -0
- package/dist/agents/tester.js.map +1 -0
- package/dist/cli/board.d.ts +28 -0
- package/dist/cli/board.d.ts.map +1 -0
- package/dist/cli/board.js +178 -0
- package/dist/cli/board.js.map +1 -0
- package/dist/cli/cost.d.ts +31 -0
- package/dist/cli/cost.d.ts.map +1 -0
- package/dist/cli/cost.js +85 -0
- package/dist/cli/cost.js.map +1 -0
- package/dist/cli/credentials.d.ts +23 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +77 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/dry-run.d.ts +3 -0
- package/dist/cli/dry-run.d.ts.map +1 -0
- package/dist/cli/dry-run.js +21 -0
- package/dist/cli/dry-run.js.map +1 -0
- package/dist/cli/extras.d.ts +21 -0
- package/dist/cli/extras.d.ts.map +1 -0
- package/dist/cli/extras.js +39 -0
- package/dist/cli/extras.js.map +1 -0
- package/dist/cli/fix.d.ts +11 -0
- package/dist/cli/fix.d.ts.map +1 -0
- package/dist/cli/fix.js +72 -0
- package/dist/cli/fix.js.map +1 -0
- package/dist/cli/git-session.d.ts +21 -0
- package/dist/cli/git-session.d.ts.map +1 -0
- package/dist/cli/git-session.js +62 -0
- package/dist/cli/git-session.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +546 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +16 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +75 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/login.d.ts +9 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +114 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/logs.d.ts +16 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +37 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/memory-learner.d.ts +7 -0
- package/dist/cli/memory-learner.d.ts.map +1 -0
- package/dist/cli/memory-learner.js +36 -0
- package/dist/cli/memory-learner.js.map +1 -0
- package/dist/cli/memory.d.ts +13 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +52 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/plugin.d.ts +5 -0
- package/dist/cli/plugin.d.ts.map +1 -0
- package/dist/cli/plugin.js +42 -0
- package/dist/cli/plugin.js.map +1 -0
- package/dist/cli/resume.d.ts +18 -0
- package/dist/cli/resume.d.ts.map +1 -0
- package/dist/cli/resume.js +84 -0
- package/dist/cli/resume.js.map +1 -0
- package/dist/cli/rollback.d.ts +11 -0
- package/dist/cli/rollback.d.ts.map +1 -0
- package/dist/cli/rollback.js +12 -0
- package/dist/cli/rollback.js.map +1 -0
- package/dist/cli/rules.d.ts +7 -0
- package/dist/cli/rules.d.ts.map +1 -0
- package/dist/cli/rules.js +20 -0
- package/dist/cli/rules.js.map +1 -0
- package/dist/cli/run.d.ts +35 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +294 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/session.d.ts +5 -0
- package/dist/cli/session.d.ts.map +1 -0
- package/dist/cli/session.js +46 -0
- package/dist/cli/session.js.map +1 -0
- package/dist/cli/ui/Board.d.ts +22 -0
- package/dist/cli/ui/Board.d.ts.map +1 -0
- package/dist/cli/ui/Board.js +40 -0
- package/dist/cli/ui/Board.js.map +1 -0
- package/dist/cli/ui/StatusBar.d.ts +10 -0
- package/dist/cli/ui/StatusBar.d.ts.map +1 -0
- package/dist/cli/ui/StatusBar.js +6 -0
- package/dist/cli/ui/StatusBar.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/core/bus.d.ts +19 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +25 -0
- package/dist/core/bus.js.map +1 -0
- package/dist/core/context.d.ts +10 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +42 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/dispatcher.d.ts +25 -0
- package/dist/core/dispatcher.d.ts.map +1 -0
- package/dist/core/dispatcher.js +76 -0
- package/dist/core/dispatcher.js.map +1 -0
- package/dist/core/errors.d.ts +8 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +13 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/file-ownership.d.ts +25 -0
- package/dist/core/file-ownership.d.ts.map +1 -0
- package/dist/core/file-ownership.js +81 -0
- package/dist/core/file-ownership.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/mcp-client-pool.d.ts +9 -0
- package/dist/core/mcp-client-pool.d.ts.map +1 -0
- package/dist/core/mcp-client-pool.js +26 -0
- package/dist/core/mcp-client-pool.js.map +1 -0
- package/dist/core/mcp-client.d.ts +27 -0
- package/dist/core/mcp-client.d.ts.map +1 -0
- package/dist/core/mcp-client.js +63 -0
- package/dist/core/mcp-client.js.map +1 -0
- package/dist/core/plugin-loader.d.ts +41 -0
- package/dist/core/plugin-loader.d.ts.map +1 -0
- package/dist/core/plugin-loader.js +62 -0
- package/dist/core/plugin-loader.js.map +1 -0
- package/dist/core/plugin-sdk.d.ts +5 -0
- package/dist/core/plugin-sdk.d.ts.map +1 -0
- package/dist/core/plugin-sdk.js +2 -0
- package/dist/core/plugin-sdk.js.map +1 -0
- package/dist/core/state.d.ts +77 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +357 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/task.d.ts +13 -0
- package/dist/core/task.d.ts.map +1 -0
- package/dist/core/task.js +87 -0
- package/dist/core/task.js.map +1 -0
- package/dist/git/__tests__/helpers.d.ts +3 -0
- package/dist/git/__tests__/helpers.d.ts.map +1 -0
- package/dist/git/__tests__/helpers.js +18 -0
- package/dist/git/__tests__/helpers.js.map +1 -0
- package/dist/git/branch.d.ts +7 -0
- package/dist/git/branch.d.ts.map +1 -0
- package/dist/git/branch.js +62 -0
- package/dist/git/branch.js.map +1 -0
- package/dist/git/commit.d.ts +3 -0
- package/dist/git/commit.d.ts.map +1 -0
- package/dist/git/commit.js +21 -0
- package/dist/git/commit.js.map +1 -0
- package/dist/git/conflict.d.ts +19 -0
- package/dist/git/conflict.d.ts.map +1 -0
- package/dist/git/conflict.js +86 -0
- package/dist/git/conflict.js.map +1 -0
- package/dist/git/index.d.ts +7 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +7 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/merge.d.ts +16 -0
- package/dist/git/merge.d.ts.map +1 -0
- package/dist/git/merge.js +101 -0
- package/dist/git/merge.js.map +1 -0
- package/dist/git/safety.d.ts +16 -0
- package/dist/git/safety.d.ts.map +1 -0
- package/dist/git/safety.js +64 -0
- package/dist/git/safety.js.map +1 -0
- package/dist/git/utils.d.ts +8 -0
- package/dist/git/utils.d.ts.map +1 -0
- package/dist/git/utils.js +39 -0
- package/dist/git/utils.js.map +1 -0
- package/dist/mcp-server/index.d.ts +2 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +39 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/mcp-server/tools.d.ts +70 -0
- package/dist/mcp-server/tools.d.ts.map +1 -0
- package/dist/mcp-server/tools.js +112 -0
- package/dist/mcp-server/tools.js.map +1 -0
- package/dist/models/item.d.ts +6 -0
- package/dist/models/item.d.ts.map +1 -0
- package/dist/models/item.js +2 -0
- package/dist/models/item.js.map +1 -0
- package/dist/orchestration/glue.d.ts +31 -0
- package/dist/orchestration/glue.d.ts.map +1 -0
- package/dist/orchestration/glue.js +204 -0
- package/dist/orchestration/glue.js.map +1 -0
- package/dist/orchestration/index.d.ts +3 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +3 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/runtime.d.ts +35 -0
- package/dist/orchestration/runtime.d.ts.map +1 -0
- package/dist/orchestration/runtime.js +165 -0
- package/dist/orchestration/runtime.js.map +1 -0
- package/dist/providers/base-provider.d.ts +28 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +2 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/claude.d.ts +10 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +93 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/gemini.d.ts +16 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +101 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +21 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +68 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mcp-provider.d.ts +11 -0
- package/dist/providers/mcp-provider.d.ts.map +1 -0
- package/dist/providers/mcp-provider.js +42 -0
- package/dist/providers/mcp-provider.js.map +1 -0
- package/dist/providers/mock.d.ts +10 -0
- package/dist/providers/mock.d.ts.map +1 -0
- package/dist/providers/mock.js +66 -0
- package/dist/providers/mock.js.map +1 -0
- package/dist/providers/model-registry.d.ts +9 -0
- package/dist/providers/model-registry.d.ts.map +1 -0
- package/dist/providers/model-registry.js +153 -0
- package/dist/providers/model-registry.js.map +1 -0
- package/dist/providers/ollama.d.ts +11 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +141 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +17 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +109 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/zai.d.ts +6 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +17 -0
- package/dist/providers/zai.js.map +1 -0
- package/dist/server/api.d.ts +5 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +153 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/index.d.ts +14 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +98 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware.d.ts +6 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +35 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/tunnel.d.ts +7 -0
- package/dist/server/tunnel.d.ts.map +1 -0
- package/dist/server/tunnel.js +44 -0
- package/dist/server/tunnel.js.map +1 -0
- package/dist/server/websocket.d.ts +11 -0
- package/dist/server/websocket.d.ts.map +1 -0
- package/dist/server/websocket.js +48 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/types.d.ts +90 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/agents/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7D,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,KAAK,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,GAAG;IACnD,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EACpD,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KACpE,IAAI,CAAA;CACV,CAAA;AAED,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAgB;IACxC,OAAO,CAAC,aAAa,CAAsB;gBAE/B,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM;IAIrG,SAAS,CAAC,aAAa;;2BAIE,UAAU;;IA8BnC,SAAS,CAAC,YAAY,IAAI,MAAM;IAwB1B,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAS/C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAyDxD,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE;IAqB5D,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAkB3D,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;IAiBvE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IASnD,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IASjC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAGtC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent.js';
|
|
2
|
+
export class CoordinatorAgent extends BaseAgent {
|
|
3
|
+
role = 'coordinator';
|
|
4
|
+
codebaseBrief = null;
|
|
5
|
+
constructor(id, bus, provider, store, sessionId) {
|
|
6
|
+
super(id, bus, provider, store, sessionId);
|
|
7
|
+
}
|
|
8
|
+
subscriptions() {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
type: 'task:approved',
|
|
12
|
+
handler: (message) => {
|
|
13
|
+
this.bus.publish({
|
|
14
|
+
type: 'file:released',
|
|
15
|
+
agentId: this.id,
|
|
16
|
+
taskId: message.taskId,
|
|
17
|
+
payload: {},
|
|
18
|
+
timestamp: Date.now(),
|
|
19
|
+
});
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
type: 'task:rejected',
|
|
24
|
+
handler: (_message) => {
|
|
25
|
+
// Re-dispatch handled by higher-level orchestration.
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: 'agent:blocked',
|
|
30
|
+
handler: (message) => {
|
|
31
|
+
this.bus.publish({
|
|
32
|
+
type: 'agent:status',
|
|
33
|
+
agentId: this.id,
|
|
34
|
+
payload: { escalation: message.payload.reason, taskId: message.taskId },
|
|
35
|
+
timestamp: Date.now(),
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
systemPrompt() {
|
|
42
|
+
let prompt = `You are a Coordinator agent — a staff engineer / tech lead.
|
|
43
|
+
Your job is to decompose a high-level goal into concrete, implementable subtasks.
|
|
44
|
+
|
|
45
|
+
For each subtask, specify:
|
|
46
|
+
- id: unique identifier (e.g., "task-1")
|
|
47
|
+
- goal: clear description of what to implement
|
|
48
|
+
- dependencies: array of task IDs that must complete first
|
|
49
|
+
- files: array of file paths this task will create or modify
|
|
50
|
+
|
|
51
|
+
Respond ONLY with JSON: { "tasks": [{ "id": "...", "goal": "...", "dependencies": [...], "files": [...] }] }
|
|
52
|
+
|
|
53
|
+
Important:
|
|
54
|
+
- Order tasks by dependency (independent tasks first)
|
|
55
|
+
- If two tasks need the same file, make one depend on the other
|
|
56
|
+
- Keep tasks small and focused (1-3 files each)`;
|
|
57
|
+
if (this.codebaseBrief) {
|
|
58
|
+
prompt += `\n\nCodebase Brief:\n${this.codebaseBrief}`;
|
|
59
|
+
}
|
|
60
|
+
return prompt;
|
|
61
|
+
}
|
|
62
|
+
async execute(task) {
|
|
63
|
+
try {
|
|
64
|
+
const tasks = await this.decompose(task.goal);
|
|
65
|
+
return { success: tasks.length > 0, output: JSON.stringify({ tasks }) };
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return { success: false, output: error instanceof Error ? error.message : 'Unknown decomposition error' };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async decompose(goal) {
|
|
72
|
+
let userContent = `Decompose this goal into subtasks:\n\n${goal}`;
|
|
73
|
+
if (this.codebaseBrief) {
|
|
74
|
+
userContent += `\n\nCodebase context:\n${this.codebaseBrief}`;
|
|
75
|
+
}
|
|
76
|
+
const response = await this.chat([
|
|
77
|
+
{ role: 'system', content: this.systemPrompt() },
|
|
78
|
+
{ role: 'user', content: userContent },
|
|
79
|
+
], { maxTokens: 4096 });
|
|
80
|
+
const content = response.content;
|
|
81
|
+
// Coba berbagai candidate: langsung, dari code fence, atau object JSON pertama
|
|
82
|
+
const candidates = [
|
|
83
|
+
content.trim(),
|
|
84
|
+
(content.match(/```(?:json)?\s*([\s\S]*?)```/i) ?? [])[1]?.trim(),
|
|
85
|
+
(content.match(/(\{[\s\S]*\})/)?.[1]),
|
|
86
|
+
];
|
|
87
|
+
for (const candidate of candidates) {
|
|
88
|
+
if (!candidate)
|
|
89
|
+
continue;
|
|
90
|
+
try {
|
|
91
|
+
const parsed = JSON.parse(candidate);
|
|
92
|
+
if (Array.isArray(parsed.tasks))
|
|
93
|
+
return parsed.tasks;
|
|
94
|
+
}
|
|
95
|
+
catch { /* lanjut */ }
|
|
96
|
+
}
|
|
97
|
+
// JSON terpotong — ekstrak task objects complete via bracket matching
|
|
98
|
+
const tasks = [];
|
|
99
|
+
let i = 0;
|
|
100
|
+
while (i < content.length) {
|
|
101
|
+
const start = content.indexOf('"id"', i);
|
|
102
|
+
if (start === -1)
|
|
103
|
+
break;
|
|
104
|
+
const objStart = content.lastIndexOf('{', start);
|
|
105
|
+
if (objStart === -1) {
|
|
106
|
+
i = start + 1;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
let depth = 0, j = objStart;
|
|
110
|
+
while (j < content.length) {
|
|
111
|
+
if (content[j] === '{')
|
|
112
|
+
depth++;
|
|
113
|
+
else if (content[j] === '}') {
|
|
114
|
+
depth--;
|
|
115
|
+
if (depth === 0)
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
j++;
|
|
119
|
+
}
|
|
120
|
+
if (depth === 0) {
|
|
121
|
+
try {
|
|
122
|
+
const obj = JSON.parse(content.slice(objStart, j + 1));
|
|
123
|
+
if (obj.id && obj.goal && Array.isArray(obj.dependencies) && Array.isArray(obj.files)) {
|
|
124
|
+
tasks.push(obj);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch { /* skip incomplete */ }
|
|
128
|
+
}
|
|
129
|
+
i = start + 1;
|
|
130
|
+
}
|
|
131
|
+
if (tasks.length > 0)
|
|
132
|
+
return tasks;
|
|
133
|
+
throw new Error(`Gagal parse hasil dekomposisi dari LLM. Response: ${content.substring(0, 200)}`);
|
|
134
|
+
}
|
|
135
|
+
detectFileConflicts(tasks) {
|
|
136
|
+
const fileMap = new Map();
|
|
137
|
+
for (const task of tasks) {
|
|
138
|
+
for (const file of task.files) {
|
|
139
|
+
const existing = fileMap.get(file) ?? [];
|
|
140
|
+
existing.push(task.id);
|
|
141
|
+
fileMap.set(file, existing);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const conflicts = [];
|
|
145
|
+
for (const [file, taskIds] of fileMap) {
|
|
146
|
+
if (taskIds.length > 1) {
|
|
147
|
+
conflicts.push({ file, tasks: taskIds });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return conflicts;
|
|
151
|
+
}
|
|
152
|
+
resolveConflicts(tasks) {
|
|
153
|
+
const conflicts = this.detectFileConflicts(tasks);
|
|
154
|
+
const result = tasks.map((task) => ({ ...task, dependencies: [...task.dependencies] }));
|
|
155
|
+
for (const conflict of conflicts) {
|
|
156
|
+
for (let index = 1; index < conflict.tasks.length; index += 1) {
|
|
157
|
+
const laterTask = result.find((task) => task.id === conflict.tasks[index]);
|
|
158
|
+
const earlierTaskId = conflict.tasks[index - 1];
|
|
159
|
+
if (laterTask && !laterTask.dependencies.includes(earlierTaskId)) {
|
|
160
|
+
laterTask.dependencies.push(earlierTaskId);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
toTaskRecords(tasks, sessionId) {
|
|
167
|
+
const now = Date.now();
|
|
168
|
+
return tasks.map((task) => ({
|
|
169
|
+
id: `${sessionId}:${task.id}`,
|
|
170
|
+
goal: task.goal,
|
|
171
|
+
parentId: null,
|
|
172
|
+
assignedTo: null,
|
|
173
|
+
status: 'pending',
|
|
174
|
+
dependencies: task.dependencies.map((dependency) => `${sessionId}:${dependency}`),
|
|
175
|
+
filesOwned: task.files,
|
|
176
|
+
reviewAttempts: 0,
|
|
177
|
+
createdAt: now,
|
|
178
|
+
completedAt: null,
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
startSession(sessionId, goal) {
|
|
182
|
+
this.bus.publish({
|
|
183
|
+
type: 'session:started',
|
|
184
|
+
agentId: this.id,
|
|
185
|
+
payload: { sessionId, goal },
|
|
186
|
+
timestamp: Date.now(),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
report(result) {
|
|
190
|
+
this.bus.publish({
|
|
191
|
+
type: 'agent:status',
|
|
192
|
+
agentId: this.id,
|
|
193
|
+
payload: { decomposition: result.output },
|
|
194
|
+
timestamp: Date.now(),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
setCodebaseBrief(brief) {
|
|
198
|
+
this.codebaseBrief = brief;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/agents/coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { BaseAgent, type AgentResult } from './base-agent.js';
|
|
2
|
+
export { ScoutAgent, type FileSystem } from './scout.js';
|
|
3
|
+
export { BuilderAgent, type BuilderFileOps } from './builder.js';
|
|
4
|
+
export { ReviewerAgent, type ReviewDecision } from './reviewer.js';
|
|
5
|
+
export { CoordinatorAgent } from './coordinator.js';
|
|
6
|
+
export { TesterAgent } from './tester.js';
|
|
7
|
+
export type { TesterConfig, TestResult } from './tester.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { BaseAgent } from './base-agent.js';
|
|
2
|
+
export { ScoutAgent } from './scout.js';
|
|
3
|
+
export { BuilderAgent } from './builder.js';
|
|
4
|
+
export { ReviewerAgent } from './reviewer.js';
|
|
5
|
+
export { CoordinatorAgent } from './coordinator.js';
|
|
6
|
+
export { TesterAgent } from './tester.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,YAAY,EAAuB,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,aAAa,EAAuB,MAAM,eAAe,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { MessageBus } from '../core/bus.js';
|
|
2
|
+
import type { StateStore } from '../core/state.js';
|
|
3
|
+
import type { LLMProvider } from '../providers/base-provider.js';
|
|
4
|
+
import type { AgentRole, TaskRecord } from '../types.js';
|
|
5
|
+
import { BaseAgent, type AgentResult } from './base-agent.js';
|
|
6
|
+
export interface ReviewDecision {
|
|
7
|
+
approved: boolean;
|
|
8
|
+
feedback: string;
|
|
9
|
+
}
|
|
10
|
+
interface ReviewerConfig {
|
|
11
|
+
maxRetries: number;
|
|
12
|
+
}
|
|
13
|
+
type CostStore = Pick<StateStore, 'registerAgent'> & {
|
|
14
|
+
recordCost?: (agentId: string, usage: {
|
|
15
|
+
inputTokens: number;
|
|
16
|
+
outputTokens: number;
|
|
17
|
+
}, meta?: {
|
|
18
|
+
provider?: string;
|
|
19
|
+
model?: string;
|
|
20
|
+
sessionId?: string | null;
|
|
21
|
+
}) => void;
|
|
22
|
+
};
|
|
23
|
+
export declare class ReviewerAgent extends BaseAgent {
|
|
24
|
+
private readonly config;
|
|
25
|
+
readonly role: AgentRole;
|
|
26
|
+
private codebaseBrief;
|
|
27
|
+
constructor(id: string, bus: MessageBus, provider: LLMProvider, config: ReviewerConfig, store?: CostStore, sessionId?: string);
|
|
28
|
+
protected subscriptions(): never[];
|
|
29
|
+
protected systemPrompt(): string;
|
|
30
|
+
execute(task: TaskRecord): Promise<AgentResult>;
|
|
31
|
+
review(task: TaskRecord, diff: string): Promise<ReviewDecision>;
|
|
32
|
+
publishDecision(task: TaskRecord, decision: ReviewDecision): void;
|
|
33
|
+
report(result: AgentResult): void;
|
|
34
|
+
shouldEscalate(task: TaskRecord): boolean;
|
|
35
|
+
escalate(task: TaskRecord): void;
|
|
36
|
+
setCodebaseBrief(brief: string): void;
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=reviewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/agents/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAgBD,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,KAAK,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,GAAG;IACnD,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EACpD,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KACpE,IAAI,CAAA;CACV,CAAA;AAED,qBAAa,aAAc,SAAQ,SAAS;IAQxC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAa;IACrC,OAAO,CAAC,aAAa,CAAsB;gBAGzC,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,WAAW,EACJ,MAAM,EAAE,cAAc,EACvC,KAAK,CAAC,EAAE,SAAS,EACjB,SAAS,CAAC,EAAE,MAAM;IAKpB,SAAS,CAAC,aAAa;IAMvB,SAAS,CAAC,YAAY,IAAI,MAAM;IAe1B,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAI/C,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuBrE,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAwBjE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IASjC,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAIzC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAahC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAGtC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent.js';
|
|
2
|
+
function tryParseReviewDecision(content) {
|
|
3
|
+
// Strip markdown fences (single or multi-line)
|
|
4
|
+
const stripped = content.replace(/```(?:json)?\s*([\s\S]*?)```/gi, '$1').trim();
|
|
5
|
+
// Try direct parse
|
|
6
|
+
try {
|
|
7
|
+
return JSON.parse(stripped);
|
|
8
|
+
}
|
|
9
|
+
catch { /* continue */ }
|
|
10
|
+
// Extract from first { to last } (greedy — handles embedded text before/after JSON)
|
|
11
|
+
const start = stripped.indexOf('{');
|
|
12
|
+
const end = stripped.lastIndexOf('}');
|
|
13
|
+
if (start !== -1 && end > start) {
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(stripped.slice(start, end + 1));
|
|
16
|
+
}
|
|
17
|
+
catch { /* continue */ }
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
export class ReviewerAgent extends BaseAgent {
|
|
22
|
+
config;
|
|
23
|
+
role = 'reviewer';
|
|
24
|
+
codebaseBrief = null;
|
|
25
|
+
constructor(id, bus, provider, config, store, sessionId) {
|
|
26
|
+
super(id, bus, provider, store, sessionId);
|
|
27
|
+
this.config = config;
|
|
28
|
+
}
|
|
29
|
+
subscriptions() {
|
|
30
|
+
// processReviews() di runtime sudah poll tasks berstatus 'review'
|
|
31
|
+
// subscription task:completed dihapus — menyebabkan race condition dengan TesterAgent
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
systemPrompt() {
|
|
35
|
+
let prompt = `You are a Reviewer agent — a principal engineer and quality gate.
|
|
36
|
+
Your job is to review code diffs for correctness, security, and consistency.
|
|
37
|
+
|
|
38
|
+
Respond ONLY with JSON: { "approved": true/false, "feedback": "..." }
|
|
39
|
+
If rejecting, provide specific, actionable feedback.
|
|
40
|
+
If approving, feedback can be empty or contain minor notes.`;
|
|
41
|
+
if (this.codebaseBrief) {
|
|
42
|
+
prompt += `\n\nCodebase Brief:\n${this.codebaseBrief}`;
|
|
43
|
+
}
|
|
44
|
+
return prompt;
|
|
45
|
+
}
|
|
46
|
+
async execute(task) {
|
|
47
|
+
return { success: true, output: `Review pending for task ${task.id}` };
|
|
48
|
+
}
|
|
49
|
+
async review(task, diff) {
|
|
50
|
+
const response = await this.chat([
|
|
51
|
+
{ role: 'system', content: this.systemPrompt() },
|
|
52
|
+
{
|
|
53
|
+
role: 'user',
|
|
54
|
+
content: `Review this code change.
|
|
55
|
+
|
|
56
|
+
Task: ${task.goal}
|
|
57
|
+
Files: ${task.filesOwned.join(', ')}
|
|
58
|
+
Review attempt: ${task.reviewAttempts + 1}
|
|
59
|
+
|
|
60
|
+
Diff:
|
|
61
|
+
${diff}`,
|
|
62
|
+
},
|
|
63
|
+
]);
|
|
64
|
+
const parsed = tryParseReviewDecision(response.content);
|
|
65
|
+
if (parsed) {
|
|
66
|
+
return { approved: Boolean(parsed.approved), feedback: parsed.feedback ?? '' };
|
|
67
|
+
}
|
|
68
|
+
return { approved: false, feedback: 'Gagal parse response reviewer — output tidak valid.' };
|
|
69
|
+
}
|
|
70
|
+
publishDecision(task, decision) {
|
|
71
|
+
if (decision.approved) {
|
|
72
|
+
this.bus.publish({
|
|
73
|
+
type: 'task:approved',
|
|
74
|
+
agentId: this.id,
|
|
75
|
+
taskId: task.id,
|
|
76
|
+
payload: { feedback: decision.feedback },
|
|
77
|
+
timestamp: Date.now(),
|
|
78
|
+
});
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.bus.publish({
|
|
82
|
+
type: 'task:rejected',
|
|
83
|
+
agentId: this.id,
|
|
84
|
+
taskId: task.id,
|
|
85
|
+
payload: {
|
|
86
|
+
feedback: decision.feedback,
|
|
87
|
+
builder: task.assignedTo,
|
|
88
|
+
},
|
|
89
|
+
timestamp: Date.now(),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
report(result) {
|
|
93
|
+
this.bus.publish({
|
|
94
|
+
type: 'agent:status',
|
|
95
|
+
agentId: this.id,
|
|
96
|
+
payload: { status: 'idle', lastResult: result.output },
|
|
97
|
+
timestamp: Date.now(),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
shouldEscalate(task) {
|
|
101
|
+
return task.reviewAttempts >= this.config.maxRetries;
|
|
102
|
+
}
|
|
103
|
+
escalate(task) {
|
|
104
|
+
this.bus.publish({
|
|
105
|
+
type: 'agent:blocked',
|
|
106
|
+
agentId: this.id,
|
|
107
|
+
taskId: task.id,
|
|
108
|
+
payload: {
|
|
109
|
+
reason: `Task "${task.goal}" gagal review setelah ${task.reviewAttempts} percobaan. Intervensi manual diperlukan.`,
|
|
110
|
+
builder: task.assignedTo,
|
|
111
|
+
},
|
|
112
|
+
timestamp: Date.now(),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
setCodebaseBrief(brief) {
|
|
116
|
+
this.codebaseBrief = brief;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/agents/reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { BusMessage, MessageBus } from '../core/bus.js';
|
|
2
|
+
import type { StateStore } from '../core/state.js';
|
|
3
|
+
import type { LLMProvider } from '../providers/base-provider.js';
|
|
4
|
+
import type { AgentRole, TaskRecord } from '../types.js';
|
|
5
|
+
import { BaseAgent, type AgentResult } from './base-agent.js';
|
|
6
|
+
export interface FileSystem {
|
|
7
|
+
readDir(path: string): Promise<string[]>;
|
|
8
|
+
readFile(path: string): Promise<string>;
|
|
9
|
+
}
|
|
10
|
+
type CostStore = Pick<StateStore, 'registerAgent'> & {
|
|
11
|
+
recordCost?: (agentId: string, usage: {
|
|
12
|
+
inputTokens: number;
|
|
13
|
+
outputTokens: number;
|
|
14
|
+
}, meta?: {
|
|
15
|
+
provider?: string;
|
|
16
|
+
model?: string;
|
|
17
|
+
sessionId?: string | null;
|
|
18
|
+
}) => void;
|
|
19
|
+
};
|
|
20
|
+
export declare class ScoutAgent extends BaseAgent {
|
|
21
|
+
private readonly fs;
|
|
22
|
+
readonly role: AgentRole;
|
|
23
|
+
private brief;
|
|
24
|
+
constructor(id: string, bus: MessageBus, provider: LLMProvider, fs: FileSystem, store?: CostStore, sessionId?: string);
|
|
25
|
+
protected subscriptions(): {
|
|
26
|
+
type: string;
|
|
27
|
+
handler: (message: BusMessage) => void;
|
|
28
|
+
}[];
|
|
29
|
+
protected systemPrompt(): string;
|
|
30
|
+
execute(task: TaskRecord): Promise<AgentResult>;
|
|
31
|
+
report(result: AgentResult): void;
|
|
32
|
+
getBrief(): string | null;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=scout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout.d.ts","sourceRoot":"","sources":["../../src/agents/scout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7D,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACxC;AAED,KAAK,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,GAAG;IACnD,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EACpD,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KACpE,IAAI,CAAA;CACV,CAAA;AAED,qBAAa,UAAW,SAAQ,SAAS;IAQrC,OAAO,CAAC,QAAQ,CAAC,EAAE;IAPrB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAU;IAClC,OAAO,CAAC,KAAK,CAAsB;gBAGjC,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,WAAW,EACJ,EAAE,EAAE,UAAU,EAC/B,KAAK,CAAC,EAAE,SAAS,EACjB,SAAS,CAAC,EAAE,MAAM;IAKpB,SAAS,CAAC,aAAa;;2BAIE,UAAU;;IAcnC,SAAS,CAAC,YAAY,IAAI,MAAM;IAa1B,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA4BrD,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IASjC,QAAQ,IAAI,MAAM,GAAG,IAAI;CAG1B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { BaseAgent } from './base-agent.js';
|
|
2
|
+
export class ScoutAgent extends BaseAgent {
|
|
3
|
+
fs;
|
|
4
|
+
role = 'scout';
|
|
5
|
+
brief = null;
|
|
6
|
+
constructor(id, bus, provider, fs, store, sessionId) {
|
|
7
|
+
super(id, bus, provider, store, sessionId);
|
|
8
|
+
this.fs = fs;
|
|
9
|
+
}
|
|
10
|
+
subscriptions() {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
type: 'task:assigned',
|
|
14
|
+
handler: (message) => {
|
|
15
|
+
if (message.payload.target === this.id) {
|
|
16
|
+
this.bus.publish({
|
|
17
|
+
type: 'agent:status',
|
|
18
|
+
agentId: this.id,
|
|
19
|
+
payload: { status: 'scanning' },
|
|
20
|
+
timestamp: Date.now(),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
}
|
|
27
|
+
systemPrompt() {
|
|
28
|
+
return `You are a Scout agent — a codebase intelligence specialist.
|
|
29
|
+
Your job is to analyze a project's structure, identify patterns, frameworks, and conventions.
|
|
30
|
+
Generate a concise "codebase brief" that other agents will use as context.
|
|
31
|
+
|
|
32
|
+
Output format:
|
|
33
|
+
- Framework & language
|
|
34
|
+
- Project structure (key directories and their purposes)
|
|
35
|
+
- Key patterns & conventions found
|
|
36
|
+
- Dependencies and their roles
|
|
37
|
+
- Important files to be aware of`;
|
|
38
|
+
}
|
|
39
|
+
async execute(task) {
|
|
40
|
+
const fileTree = await this.fs.readDir('.');
|
|
41
|
+
const packageJson = await this.fs.readFile('package.json').catch(() => '{}');
|
|
42
|
+
const tsconfigJson = await this.fs.readFile('tsconfig.json').catch(() => '{}');
|
|
43
|
+
const response = await this.chat([
|
|
44
|
+
{ role: 'system', content: this.systemPrompt() },
|
|
45
|
+
{
|
|
46
|
+
role: 'user',
|
|
47
|
+
content: `Analyze this project and generate a codebase brief.
|
|
48
|
+
|
|
49
|
+
Goal: ${task.goal}
|
|
50
|
+
|
|
51
|
+
File tree:
|
|
52
|
+
${fileTree.join('\n')}
|
|
53
|
+
|
|
54
|
+
package.json:
|
|
55
|
+
${packageJson}
|
|
56
|
+
|
|
57
|
+
tsconfig.json:
|
|
58
|
+
${tsconfigJson}`,
|
|
59
|
+
},
|
|
60
|
+
]);
|
|
61
|
+
this.brief = response.content;
|
|
62
|
+
return { success: true, output: response.content };
|
|
63
|
+
}
|
|
64
|
+
report(result) {
|
|
65
|
+
this.bus.publish({
|
|
66
|
+
type: 'task:completed',
|
|
67
|
+
agentId: this.id,
|
|
68
|
+
payload: { output: result.output },
|
|
69
|
+
timestamp: Date.now(),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
getBrief() {
|
|
73
|
+
return this.brief;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=scout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout.js","sourceRoot":"","sources":["../../src/agents/scout.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAe7D,MAAM,OAAO,UAAW,SAAQ,SAAS;IAQpB;IAPV,IAAI,GAAc,OAAO,CAAA;IAC1B,KAAK,GAAkB,IAAI,CAAA;IAEnC,YACE,EAAU,EACV,GAAe,EACf,QAAqB,EACJ,EAAc,EAC/B,KAAiB,EACjB,SAAkB;QAElB,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;QAJzB,OAAE,GAAF,EAAE,CAAY;IAKjC,CAAC;IAES,aAAa;QACrB,OAAO;YACL;gBACE,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,CAAC,OAAmB,EAAE,EAAE;oBAC/B,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;wBACvC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;4BACf,IAAI,EAAE,cAAc;4BACpB,OAAO,EAAE,IAAI,CAAC,EAAE;4BAChB,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;4BAC/B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;yBACtB,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;aACF;SACF,CAAA;IACH,CAAC;IAES,YAAY;QACpB,OAAO;;;;;;;;;iCASsB,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAgB;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC5E,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAE9E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE;YAChD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;;QAET,IAAI,CAAC,IAAI;;;EAGf,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGnB,WAAW;;;EAGX,YAAY,EAAE;aACT;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAA;IACpD,CAAC;IAED,MAAM,CAAC,MAAmB;QACxB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YACf,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,IAAI,CAAC,EAAE;YAChB,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YAClC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { MessageBus } from '../core/bus.js';
|
|
2
|
+
import type { AgentRole, TaskRecord } from '../types.js';
|
|
3
|
+
import { BaseAgent, type AgentResult } from './base-agent.js';
|
|
4
|
+
export interface TesterConfig {
|
|
5
|
+
command: string;
|
|
6
|
+
timeout: number;
|
|
7
|
+
maxRetries: number;
|
|
8
|
+
}
|
|
9
|
+
export interface TestResult {
|
|
10
|
+
passed: boolean;
|
|
11
|
+
output: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class TesterAgent extends BaseAgent {
|
|
14
|
+
private readonly config;
|
|
15
|
+
readonly role: AgentRole;
|
|
16
|
+
constructor(id: string, bus: MessageBus, config: TesterConfig);
|
|
17
|
+
protected subscriptions(): never[];
|
|
18
|
+
protected systemPrompt(): string;
|
|
19
|
+
execute(_task: TaskRecord): Promise<AgentResult>;
|
|
20
|
+
runTest(task: TaskRecord, projectDir: string): Promise<TestResult>;
|
|
21
|
+
publishResult(task: TaskRecord, result: TestResult): void;
|
|
22
|
+
shouldEscalate(task: TaskRecord): boolean;
|
|
23
|
+
report(result: AgentResult): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=tester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tester.d.ts","sourceRoot":"","sources":["../../src/agents/tester.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAI7D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,WAAY,SAAQ,SAAS;IAMtC,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAW;gBAGjC,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,UAAU,EACE,MAAM,EAAE,YAAY;IAUvC,SAAS,CAAC,aAAa;IAIvB,SAAS,CAAC,YAAY,IAAI,MAAM;IAI1B,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAIhD,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAexE,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAyBzD,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAIzC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;CAQlC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { exec } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { BaseAgent } from './base-agent.js';
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
export class TesterAgent extends BaseAgent {
|
|
6
|
+
config;
|
|
7
|
+
role = 'tester';
|
|
8
|
+
constructor(id, bus, config) {
|
|
9
|
+
// TesterAgent tidak butuh LLM — pass dummy provider
|
|
10
|
+
super(id, bus, {
|
|
11
|
+
name: 'none',
|
|
12
|
+
chat: async () => ({ content: '', usage: { inputTokens: 0, outputTokens: 0 } }),
|
|
13
|
+
stream: async function* () { },
|
|
14
|
+
});
|
|
15
|
+
this.config = config;
|
|
16
|
+
}
|
|
17
|
+
subscriptions() {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
systemPrompt() {
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
async execute(_task) {
|
|
24
|
+
return { success: true, output: 'tester: use runTest() directly' };
|
|
25
|
+
}
|
|
26
|
+
async runTest(task, projectDir) {
|
|
27
|
+
try {
|
|
28
|
+
const { stdout, stderr } = await execAsync(this.config.command, {
|
|
29
|
+
cwd: projectDir,
|
|
30
|
+
timeout: this.config.timeout,
|
|
31
|
+
});
|
|
32
|
+
const output = [stdout, stderr].filter(Boolean).join('\n').trim();
|
|
33
|
+
return { passed: true, output };
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
const e = err;
|
|
37
|
+
const output = [e.stdout, e.stderr, e.message].filter(Boolean).join('\n').trim();
|
|
38
|
+
return { passed: false, output: output || 'Test command gagal tanpa output.' };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
publishResult(task, result) {
|
|
42
|
+
if (result.passed) {
|
|
43
|
+
this.bus.publish({
|
|
44
|
+
type: 'task:test_passed',
|
|
45
|
+
agentId: this.id,
|
|
46
|
+
taskId: task.id,
|
|
47
|
+
payload: { output: result.output },
|
|
48
|
+
timestamp: Date.now(),
|
|
49
|
+
});
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.bus.publish({
|
|
53
|
+
type: 'task:test_failed',
|
|
54
|
+
agentId: this.id,
|
|
55
|
+
taskId: task.id,
|
|
56
|
+
payload: {
|
|
57
|
+
output: result.output,
|
|
58
|
+
builder: task.assignedTo,
|
|
59
|
+
attempt: task.reviewAttempts + 1,
|
|
60
|
+
},
|
|
61
|
+
timestamp: Date.now(),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
shouldEscalate(task) {
|
|
65
|
+
return task.reviewAttempts >= this.config.maxRetries;
|
|
66
|
+
}
|
|
67
|
+
report(result) {
|
|
68
|
+
this.bus.publish({
|
|
69
|
+
type: 'agent:status',
|
|
70
|
+
agentId: this.id,
|
|
71
|
+
payload: { status: 'idle', lastResult: result.output },
|
|
72
|
+
timestamp: Date.now(),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tester.js","sourceRoot":"","sources":["../../src/agents/tester.ts"],"names":[],"mappings":"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"}
|