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.
Files changed (288) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/CONTRIBUTING.md +59 -0
  3. package/README.md +208 -0
  4. package/dist/agents/base-agent.d.ts +48 -0
  5. package/dist/agents/base-agent.d.ts.map +1 -0
  6. package/dist/agents/base-agent.js +59 -0
  7. package/dist/agents/base-agent.js.map +1 -0
  8. package/dist/agents/builder.d.ts +53 -0
  9. package/dist/agents/builder.d.ts.map +1 -0
  10. package/dist/agents/builder.js +147 -0
  11. package/dist/agents/builder.js.map +1 -0
  12. package/dist/agents/coordinator.d.ts +45 -0
  13. package/dist/agents/coordinator.d.ts.map +1 -0
  14. package/dist/agents/coordinator.js +201 -0
  15. package/dist/agents/coordinator.js.map +1 -0
  16. package/dist/agents/index.d.ts +8 -0
  17. package/dist/agents/index.d.ts.map +1 -0
  18. package/dist/agents/index.js +7 -0
  19. package/dist/agents/index.js.map +1 -0
  20. package/dist/agents/reviewer.d.ts +39 -0
  21. package/dist/agents/reviewer.d.ts.map +1 -0
  22. package/dist/agents/reviewer.js +119 -0
  23. package/dist/agents/reviewer.js.map +1 -0
  24. package/dist/agents/scout.d.ts +35 -0
  25. package/dist/agents/scout.d.ts.map +1 -0
  26. package/dist/agents/scout.js +76 -0
  27. package/dist/agents/scout.js.map +1 -0
  28. package/dist/agents/tester.d.ts +25 -0
  29. package/dist/agents/tester.d.ts.map +1 -0
  30. package/dist/agents/tester.js +76 -0
  31. package/dist/agents/tester.js.map +1 -0
  32. package/dist/cli/board.d.ts +28 -0
  33. package/dist/cli/board.d.ts.map +1 -0
  34. package/dist/cli/board.js +178 -0
  35. package/dist/cli/board.js.map +1 -0
  36. package/dist/cli/cost.d.ts +31 -0
  37. package/dist/cli/cost.d.ts.map +1 -0
  38. package/dist/cli/cost.js +85 -0
  39. package/dist/cli/cost.js.map +1 -0
  40. package/dist/cli/credentials.d.ts +23 -0
  41. package/dist/cli/credentials.d.ts.map +1 -0
  42. package/dist/cli/credentials.js +77 -0
  43. package/dist/cli/credentials.js.map +1 -0
  44. package/dist/cli/dry-run.d.ts +3 -0
  45. package/dist/cli/dry-run.d.ts.map +1 -0
  46. package/dist/cli/dry-run.js +21 -0
  47. package/dist/cli/dry-run.js.map +1 -0
  48. package/dist/cli/extras.d.ts +21 -0
  49. package/dist/cli/extras.d.ts.map +1 -0
  50. package/dist/cli/extras.js +39 -0
  51. package/dist/cli/extras.js.map +1 -0
  52. package/dist/cli/fix.d.ts +11 -0
  53. package/dist/cli/fix.d.ts.map +1 -0
  54. package/dist/cli/fix.js +72 -0
  55. package/dist/cli/fix.js.map +1 -0
  56. package/dist/cli/git-session.d.ts +21 -0
  57. package/dist/cli/git-session.d.ts.map +1 -0
  58. package/dist/cli/git-session.js +62 -0
  59. package/dist/cli/git-session.js.map +1 -0
  60. package/dist/cli/index.d.ts +4 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +546 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/init.d.ts +16 -0
  65. package/dist/cli/init.d.ts.map +1 -0
  66. package/dist/cli/init.js +75 -0
  67. package/dist/cli/init.js.map +1 -0
  68. package/dist/cli/login.d.ts +9 -0
  69. package/dist/cli/login.d.ts.map +1 -0
  70. package/dist/cli/login.js +114 -0
  71. package/dist/cli/login.js.map +1 -0
  72. package/dist/cli/logs.d.ts +16 -0
  73. package/dist/cli/logs.d.ts.map +1 -0
  74. package/dist/cli/logs.js +37 -0
  75. package/dist/cli/logs.js.map +1 -0
  76. package/dist/cli/memory-learner.d.ts +7 -0
  77. package/dist/cli/memory-learner.d.ts.map +1 -0
  78. package/dist/cli/memory-learner.js +36 -0
  79. package/dist/cli/memory-learner.js.map +1 -0
  80. package/dist/cli/memory.d.ts +13 -0
  81. package/dist/cli/memory.d.ts.map +1 -0
  82. package/dist/cli/memory.js +52 -0
  83. package/dist/cli/memory.js.map +1 -0
  84. package/dist/cli/plugin.d.ts +5 -0
  85. package/dist/cli/plugin.d.ts.map +1 -0
  86. package/dist/cli/plugin.js +42 -0
  87. package/dist/cli/plugin.js.map +1 -0
  88. package/dist/cli/resume.d.ts +18 -0
  89. package/dist/cli/resume.d.ts.map +1 -0
  90. package/dist/cli/resume.js +84 -0
  91. package/dist/cli/resume.js.map +1 -0
  92. package/dist/cli/rollback.d.ts +11 -0
  93. package/dist/cli/rollback.d.ts.map +1 -0
  94. package/dist/cli/rollback.js +12 -0
  95. package/dist/cli/rollback.js.map +1 -0
  96. package/dist/cli/rules.d.ts +7 -0
  97. package/dist/cli/rules.d.ts.map +1 -0
  98. package/dist/cli/rules.js +20 -0
  99. package/dist/cli/rules.js.map +1 -0
  100. package/dist/cli/run.d.ts +35 -0
  101. package/dist/cli/run.d.ts.map +1 -0
  102. package/dist/cli/run.js +294 -0
  103. package/dist/cli/run.js.map +1 -0
  104. package/dist/cli/session.d.ts +5 -0
  105. package/dist/cli/session.d.ts.map +1 -0
  106. package/dist/cli/session.js +46 -0
  107. package/dist/cli/session.js.map +1 -0
  108. package/dist/cli/ui/Board.d.ts +22 -0
  109. package/dist/cli/ui/Board.d.ts.map +1 -0
  110. package/dist/cli/ui/Board.js +40 -0
  111. package/dist/cli/ui/Board.js.map +1 -0
  112. package/dist/cli/ui/StatusBar.d.ts +10 -0
  113. package/dist/cli/ui/StatusBar.d.ts.map +1 -0
  114. package/dist/cli/ui/StatusBar.js +6 -0
  115. package/dist/cli/ui/StatusBar.js.map +1 -0
  116. package/dist/config.d.ts +4 -0
  117. package/dist/config.d.ts.map +1 -0
  118. package/dist/config.js +79 -0
  119. package/dist/config.js.map +1 -0
  120. package/dist/core/bus.d.ts +19 -0
  121. package/dist/core/bus.d.ts.map +1 -0
  122. package/dist/core/bus.js +25 -0
  123. package/dist/core/bus.js.map +1 -0
  124. package/dist/core/context.d.ts +10 -0
  125. package/dist/core/context.d.ts.map +1 -0
  126. package/dist/core/context.js +42 -0
  127. package/dist/core/context.js.map +1 -0
  128. package/dist/core/dispatcher.d.ts +25 -0
  129. package/dist/core/dispatcher.d.ts.map +1 -0
  130. package/dist/core/dispatcher.js +76 -0
  131. package/dist/core/dispatcher.js.map +1 -0
  132. package/dist/core/errors.d.ts +8 -0
  133. package/dist/core/errors.d.ts.map +1 -0
  134. package/dist/core/errors.js +13 -0
  135. package/dist/core/errors.js.map +1 -0
  136. package/dist/core/file-ownership.d.ts +25 -0
  137. package/dist/core/file-ownership.d.ts.map +1 -0
  138. package/dist/core/file-ownership.js +81 -0
  139. package/dist/core/file-ownership.js.map +1 -0
  140. package/dist/core/index.d.ts +9 -0
  141. package/dist/core/index.d.ts.map +1 -0
  142. package/dist/core/index.js +6 -0
  143. package/dist/core/index.js.map +1 -0
  144. package/dist/core/mcp-client-pool.d.ts +9 -0
  145. package/dist/core/mcp-client-pool.d.ts.map +1 -0
  146. package/dist/core/mcp-client-pool.js +26 -0
  147. package/dist/core/mcp-client-pool.js.map +1 -0
  148. package/dist/core/mcp-client.d.ts +27 -0
  149. package/dist/core/mcp-client.d.ts.map +1 -0
  150. package/dist/core/mcp-client.js +63 -0
  151. package/dist/core/mcp-client.js.map +1 -0
  152. package/dist/core/plugin-loader.d.ts +41 -0
  153. package/dist/core/plugin-loader.d.ts.map +1 -0
  154. package/dist/core/plugin-loader.js +62 -0
  155. package/dist/core/plugin-loader.js.map +1 -0
  156. package/dist/core/plugin-sdk.d.ts +5 -0
  157. package/dist/core/plugin-sdk.d.ts.map +1 -0
  158. package/dist/core/plugin-sdk.js +2 -0
  159. package/dist/core/plugin-sdk.js.map +1 -0
  160. package/dist/core/state.d.ts +77 -0
  161. package/dist/core/state.d.ts.map +1 -0
  162. package/dist/core/state.js +357 -0
  163. package/dist/core/state.js.map +1 -0
  164. package/dist/core/task.d.ts +13 -0
  165. package/dist/core/task.d.ts.map +1 -0
  166. package/dist/core/task.js +87 -0
  167. package/dist/core/task.js.map +1 -0
  168. package/dist/git/__tests__/helpers.d.ts +3 -0
  169. package/dist/git/__tests__/helpers.d.ts.map +1 -0
  170. package/dist/git/__tests__/helpers.js +18 -0
  171. package/dist/git/__tests__/helpers.js.map +1 -0
  172. package/dist/git/branch.d.ts +7 -0
  173. package/dist/git/branch.d.ts.map +1 -0
  174. package/dist/git/branch.js +62 -0
  175. package/dist/git/branch.js.map +1 -0
  176. package/dist/git/commit.d.ts +3 -0
  177. package/dist/git/commit.d.ts.map +1 -0
  178. package/dist/git/commit.js +21 -0
  179. package/dist/git/commit.js.map +1 -0
  180. package/dist/git/conflict.d.ts +19 -0
  181. package/dist/git/conflict.d.ts.map +1 -0
  182. package/dist/git/conflict.js +86 -0
  183. package/dist/git/conflict.js.map +1 -0
  184. package/dist/git/index.d.ts +7 -0
  185. package/dist/git/index.d.ts.map +1 -0
  186. package/dist/git/index.js +7 -0
  187. package/dist/git/index.js.map +1 -0
  188. package/dist/git/merge.d.ts +16 -0
  189. package/dist/git/merge.d.ts.map +1 -0
  190. package/dist/git/merge.js +101 -0
  191. package/dist/git/merge.js.map +1 -0
  192. package/dist/git/safety.d.ts +16 -0
  193. package/dist/git/safety.d.ts.map +1 -0
  194. package/dist/git/safety.js +64 -0
  195. package/dist/git/safety.js.map +1 -0
  196. package/dist/git/utils.d.ts +8 -0
  197. package/dist/git/utils.d.ts.map +1 -0
  198. package/dist/git/utils.js +39 -0
  199. package/dist/git/utils.js.map +1 -0
  200. package/dist/mcp-server/index.d.ts +2 -0
  201. package/dist/mcp-server/index.d.ts.map +1 -0
  202. package/dist/mcp-server/index.js +39 -0
  203. package/dist/mcp-server/index.js.map +1 -0
  204. package/dist/mcp-server/tools.d.ts +70 -0
  205. package/dist/mcp-server/tools.d.ts.map +1 -0
  206. package/dist/mcp-server/tools.js +112 -0
  207. package/dist/mcp-server/tools.js.map +1 -0
  208. package/dist/models/item.d.ts +6 -0
  209. package/dist/models/item.d.ts.map +1 -0
  210. package/dist/models/item.js +2 -0
  211. package/dist/models/item.js.map +1 -0
  212. package/dist/orchestration/glue.d.ts +31 -0
  213. package/dist/orchestration/glue.d.ts.map +1 -0
  214. package/dist/orchestration/glue.js +204 -0
  215. package/dist/orchestration/glue.js.map +1 -0
  216. package/dist/orchestration/index.d.ts +3 -0
  217. package/dist/orchestration/index.d.ts.map +1 -0
  218. package/dist/orchestration/index.js +3 -0
  219. package/dist/orchestration/index.js.map +1 -0
  220. package/dist/orchestration/runtime.d.ts +35 -0
  221. package/dist/orchestration/runtime.d.ts.map +1 -0
  222. package/dist/orchestration/runtime.js +165 -0
  223. package/dist/orchestration/runtime.js.map +1 -0
  224. package/dist/providers/base-provider.d.ts +28 -0
  225. package/dist/providers/base-provider.d.ts.map +1 -0
  226. package/dist/providers/base-provider.js +2 -0
  227. package/dist/providers/base-provider.js.map +1 -0
  228. package/dist/providers/claude.d.ts +10 -0
  229. package/dist/providers/claude.d.ts.map +1 -0
  230. package/dist/providers/claude.js +93 -0
  231. package/dist/providers/claude.js.map +1 -0
  232. package/dist/providers/gemini.d.ts +16 -0
  233. package/dist/providers/gemini.d.ts.map +1 -0
  234. package/dist/providers/gemini.js +101 -0
  235. package/dist/providers/gemini.js.map +1 -0
  236. package/dist/providers/index.d.ts +21 -0
  237. package/dist/providers/index.d.ts.map +1 -0
  238. package/dist/providers/index.js +68 -0
  239. package/dist/providers/index.js.map +1 -0
  240. package/dist/providers/mcp-provider.d.ts +11 -0
  241. package/dist/providers/mcp-provider.d.ts.map +1 -0
  242. package/dist/providers/mcp-provider.js +42 -0
  243. package/dist/providers/mcp-provider.js.map +1 -0
  244. package/dist/providers/mock.d.ts +10 -0
  245. package/dist/providers/mock.d.ts.map +1 -0
  246. package/dist/providers/mock.js +66 -0
  247. package/dist/providers/mock.js.map +1 -0
  248. package/dist/providers/model-registry.d.ts +9 -0
  249. package/dist/providers/model-registry.d.ts.map +1 -0
  250. package/dist/providers/model-registry.js +153 -0
  251. package/dist/providers/model-registry.js.map +1 -0
  252. package/dist/providers/ollama.d.ts +11 -0
  253. package/dist/providers/ollama.d.ts.map +1 -0
  254. package/dist/providers/ollama.js +141 -0
  255. package/dist/providers/ollama.js.map +1 -0
  256. package/dist/providers/openai.d.ts +17 -0
  257. package/dist/providers/openai.d.ts.map +1 -0
  258. package/dist/providers/openai.js +109 -0
  259. package/dist/providers/openai.js.map +1 -0
  260. package/dist/providers/zai.d.ts +6 -0
  261. package/dist/providers/zai.d.ts.map +1 -0
  262. package/dist/providers/zai.js +17 -0
  263. package/dist/providers/zai.js.map +1 -0
  264. package/dist/server/api.d.ts +5 -0
  265. package/dist/server/api.d.ts.map +1 -0
  266. package/dist/server/api.js +153 -0
  267. package/dist/server/api.js.map +1 -0
  268. package/dist/server/index.d.ts +14 -0
  269. package/dist/server/index.d.ts.map +1 -0
  270. package/dist/server/index.js +98 -0
  271. package/dist/server/index.js.map +1 -0
  272. package/dist/server/middleware.d.ts +6 -0
  273. package/dist/server/middleware.d.ts.map +1 -0
  274. package/dist/server/middleware.js +35 -0
  275. package/dist/server/middleware.js.map +1 -0
  276. package/dist/server/tunnel.d.ts +7 -0
  277. package/dist/server/tunnel.d.ts.map +1 -0
  278. package/dist/server/tunnel.js +44 -0
  279. package/dist/server/tunnel.js.map +1 -0
  280. package/dist/server/websocket.d.ts +11 -0
  281. package/dist/server/websocket.d.ts.map +1 -0
  282. package/dist/server/websocket.js +48 -0
  283. package/dist/server/websocket.js.map +1 -0
  284. package/dist/types.d.ts +90 -0
  285. package/dist/types.d.ts.map +1 -0
  286. package/dist/types.js +2 -0
  287. package/dist/types.js.map +1 -0
  288. 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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"}