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
package/dist/config.js ADDED
@@ -0,0 +1,79 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { parse } from 'yaml';
4
+ export const DEFAULT_CONFIG = {
5
+ providers: {},
6
+ swarm: {
7
+ builders: 2,
8
+ review: true,
9
+ maxReviewRetries: 3,
10
+ humanGate: false,
11
+ },
12
+ roles: {
13
+ coordinator: { provider: 'claude', model: 'claude-sonnet-4-20250514' },
14
+ scout: { provider: 'claude', model: 'claude-haiku-4-5-20251001' },
15
+ builder: { provider: 'ollama', model: 'deepseek-coder-v2' },
16
+ reviewer: { provider: 'claude', model: 'claude-sonnet-4-20250514' },
17
+ tester: { provider: 'ollama', model: 'deepseek-coder-v2' },
18
+ },
19
+ git: {
20
+ autoBranch: true,
21
+ autoMerge: true,
22
+ commitPrefix: '[orka]',
23
+ push: false,
24
+ conflictResolution: 'prompt',
25
+ },
26
+ timeouts: {
27
+ llmCall: 120_000,
28
+ task: 600_000,
29
+ },
30
+ rules: {
31
+ project: 'orka.rules.md',
32
+ global: '~/.orka/rules.md',
33
+ },
34
+ resume: {
35
+ staleLockTimeout: 300,
36
+ },
37
+ tester: {
38
+ enabled: false,
39
+ command: 'pnpm test',
40
+ timeout: 60000,
41
+ maxRetries: 3,
42
+ },
43
+ };
44
+ function resolveEnvVars(value) {
45
+ return value.replace(/\$\{(\w+)\}/g, (_, name) => process.env[name] ?? '');
46
+ }
47
+ function isRecord(value) {
48
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
49
+ }
50
+ function deepMerge(target, source) {
51
+ if (!isRecord(target) || !isRecord(source)) {
52
+ return source;
53
+ }
54
+ const result = { ...target };
55
+ for (const key of Object.keys(source)) {
56
+ const sourceValue = source[key];
57
+ const targetValue = result[key];
58
+ if (isRecord(targetValue) && isRecord(sourceValue)) {
59
+ result[key] = deepMerge(targetValue, sourceValue);
60
+ continue;
61
+ }
62
+ result[key] = sourceValue;
63
+ }
64
+ return result;
65
+ }
66
+ export function loadConfig(projectDir) {
67
+ const configPath = join(projectDir, 'orka.config.yaml');
68
+ if (!existsSync(configPath)) {
69
+ return structuredClone(DEFAULT_CONFIG);
70
+ }
71
+ const raw = readFileSync(configPath, 'utf-8');
72
+ const parsed = parse(raw);
73
+ const merged = deepMerge(structuredClone(DEFAULT_CONFIG), isRecord(parsed) ? parsed : {});
74
+ if (merged.providers.claude?.apiKey) {
75
+ merged.providers.claude.apiKey = resolveEnvVars(merged.providers.claude.apiKey);
76
+ }
77
+ return merged;
78
+ }
79
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type MessageType = 'task:created' | 'task:assigned' | 'task:started' | 'task:completed' | 'task:review' | 'task:approved' | 'task:rejected' | 'task:test_passed' | 'task:test_failed' | 'file:locked' | 'file:released' | 'file:conflict' | 'agent:blocked' | 'agent:status' | 'session:started' | 'session:completed' | 'session:failed' | 'session:awaiting';
2
+ export interface BusMessage {
3
+ type: MessageType;
4
+ agentId: string;
5
+ taskId?: string;
6
+ payload: Record<string, unknown>;
7
+ timestamp: number;
8
+ }
9
+ type MessageHandler = (message: BusMessage) => void;
10
+ export declare class MessageBus {
11
+ private readonly emitter;
12
+ private messages;
13
+ publish(message: BusMessage): void;
14
+ subscribe(type: MessageType | '*', handler: MessageHandler): () => void;
15
+ history(type?: MessageType): BusMessage[];
16
+ clear(): void;
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/core/bus.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,aAAa,GACb,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,kBAAkB,GAClB,aAAa,GACb,eAAe,GACf,eAAe,GACf,eAAe,GACf,cAAc,GACd,iBAAiB,GACjB,mBAAmB,GACnB,gBAAgB,GAChB,kBAAkB,CAAA;AAEtB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAA;AAEnD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAmB;IAEnC,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAMlC,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,GAAG,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,IAAI;IAKvE,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,EAAE;IAQzC,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,25 @@
1
+ import { EventEmitter } from 'node:events';
2
+ export class MessageBus {
3
+ emitter = new EventEmitter();
4
+ messages = [];
5
+ publish(message) {
6
+ this.messages.push(message);
7
+ this.emitter.emit(message.type, message);
8
+ this.emitter.emit('*', message);
9
+ }
10
+ subscribe(type, handler) {
11
+ this.emitter.on(type, handler);
12
+ return () => this.emitter.off(type, handler);
13
+ }
14
+ history(type) {
15
+ if (type) {
16
+ return this.messages.filter((message) => message.type === type);
17
+ }
18
+ return [...this.messages];
19
+ }
20
+ clear() {
21
+ this.messages = [];
22
+ this.emitter.removeAllListeners();
23
+ }
24
+ }
25
+ //# sourceMappingURL=bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../../src/core/bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAgC1C,MAAM,OAAO,UAAU;IACJ,OAAO,GAAG,IAAI,YAAY,EAAE,CAAA;IACrC,QAAQ,GAAiB,EAAE,CAAA;IAEnC,OAAO,CAAC,OAAmB;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;IAED,SAAS,CAAC,IAAuB,EAAE,OAAuB;QACxD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC9B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,CAAC,IAAkB;QACxB,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;QACjE,CAAC;QAED,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAA;IACnC,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { ChatMessage, LLMProvider } from '../providers/base-provider.js';
2
+ export declare class ContextManager {
3
+ private readonly maxTokens;
4
+ private readonly provider;
5
+ constructor(maxTokens: number, provider: LLMProvider);
6
+ estimateTokens(text: string): number;
7
+ private totalTokens;
8
+ prepare(messages: ChatMessage[]): Promise<ChatMessage[]>;
9
+ }
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAI7E,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW;IAIxC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIpC,OAAO,CAAC,WAAW;IAIb,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CA8B/D"}
@@ -0,0 +1,42 @@
1
+ const SUMMARIZE_THRESHOLD = 0.8; // trigger at 80% of max tokens
2
+ export class ContextManager {
3
+ maxTokens;
4
+ provider;
5
+ constructor(maxTokens, provider) {
6
+ this.maxTokens = maxTokens;
7
+ this.provider = provider;
8
+ }
9
+ // Intentional approximation: chars/4. Not accurate but consistent for all providers.
10
+ estimateTokens(text) {
11
+ return Math.ceil(text.length / 4);
12
+ }
13
+ totalTokens(messages) {
14
+ return messages.reduce((sum, m) => sum + this.estimateTokens(m.content), 0);
15
+ }
16
+ async prepare(messages) {
17
+ const total = this.totalTokens(messages);
18
+ if (total <= this.maxTokens * SUMMARIZE_THRESHOLD) {
19
+ return messages;
20
+ }
21
+ const pinned = messages.filter(m => m.role === 'system');
22
+ const rest = messages.filter(m => m.role !== 'system');
23
+ const keepRecent = Math.max(2, Math.floor(rest.length * 0.3));
24
+ const toSummarize = rest.slice(0, rest.length - keepRecent);
25
+ const recent = rest.slice(rest.length - keepRecent);
26
+ if (toSummarize.length === 0)
27
+ return messages;
28
+ const summaryPrompt = [
29
+ {
30
+ role: 'user',
31
+ content: `Ringkas percakapan berikut dalam 2-3 kalimat singkat, pertahankan keputusan teknis penting:\n\n${toSummarize.map(m => `${m.role}: ${m.content}`).join('\n')}`,
32
+ },
33
+ ];
34
+ const summaryRes = await this.provider.chat(summaryPrompt);
35
+ const summaryMessage = {
36
+ role: 'assistant',
37
+ content: `[Ringkasan konteks sebelumnya: ${summaryRes.content}]`,
38
+ };
39
+ return [...pinned, summaryMessage, ...recent];
40
+ }
41
+ }
42
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAIA,MAAM,mBAAmB,GAAG,GAAG,CAAA,CAAC,+BAA+B;AAE/D,MAAM,OAAO,cAAc;IAEN;IACA;IAFnB,YACmB,SAAiB,EACjB,QAAqB;QADrB,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAa;IACrC,CAAC;IAEJ,qFAAqF;IACrF,cAAc,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACnC,CAAC;IAEO,WAAW,CAAC,QAAuB;QACzC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAuB;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,GAAG,mBAAmB,EAAE,CAAC;YAClD,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;QACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;QAEtD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAA;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAA;QAEnD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAA;QAE7C,MAAM,aAAa,GAAG;YACpB;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,kGAAkG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACxK;SACF,CAAA;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAC1D,MAAM,cAAc,GAAgB;YAClC,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,kCAAkC,UAAU,CAAC,OAAO,GAAG;SACjE,CAAA;QAED,OAAO,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,CAAA;IAC/C,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { TaskRecord } from '../types.js';
2
+ import type { MessageBus } from './bus.js';
3
+ import type { TaskGraph } from './task.js';
4
+ export type AgentExecutor = (task: TaskRecord) => Promise<{
5
+ success: boolean;
6
+ error?: string;
7
+ }>;
8
+ interface DispatcherOptions {
9
+ maxConcurrent: number;
10
+ taskTimeout: number;
11
+ }
12
+ export declare class TaskDispatcher {
13
+ private readonly bus;
14
+ private readonly graph;
15
+ private readonly executor;
16
+ private readonly options;
17
+ private readonly running;
18
+ constructor(bus: MessageBus, graph: TaskGraph, executor: AgentExecutor, options: DispatcherOptions);
19
+ dispatchReady(): Promise<void>;
20
+ get runningCount(): number;
21
+ private executeTask;
22
+ private timeout;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../src/core/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE1C,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAE/F,UAAU,iBAAiB;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;gBAGzB,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,iBAAiB;IAGvC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpC,IAAI,YAAY,IAAI,MAAM,CAEzB;YAEa,WAAW;IAiDzB,OAAO,CAAC,OAAO;CAOhB"}
@@ -0,0 +1,76 @@
1
+ export class TaskDispatcher {
2
+ bus;
3
+ graph;
4
+ executor;
5
+ options;
6
+ running = new Set();
7
+ constructor(bus, graph, executor, options) {
8
+ this.bus = bus;
9
+ this.graph = graph;
10
+ this.executor = executor;
11
+ this.options = options;
12
+ }
13
+ async dispatchReady() {
14
+ const ready = this.graph.readyTasks();
15
+ const available = Math.max(this.options.maxConcurrent - this.running.size, 0);
16
+ const toDispatch = ready.slice(0, available);
17
+ await Promise.allSettled(toDispatch.map((task) => this.executeTask(task)));
18
+ }
19
+ get runningCount() {
20
+ return this.running.size;
21
+ }
22
+ async executeTask(task) {
23
+ this.running.add(task.id);
24
+ this.graph.updateTask(task.id, { status: 'in_progress' });
25
+ this.bus.publish({
26
+ type: 'task:started',
27
+ agentId: 'dispatcher',
28
+ taskId: task.id,
29
+ payload: { goal: task.goal },
30
+ timestamp: Date.now(),
31
+ });
32
+ try {
33
+ const result = await Promise.race([this.executor(task), this.timeout(task.id)]);
34
+ if (result.success) {
35
+ this.graph.updateTask(task.id, { status: 'completed', completedAt: Date.now() });
36
+ this.bus.publish({
37
+ type: 'task:completed',
38
+ agentId: 'dispatcher',
39
+ taskId: task.id,
40
+ payload: {},
41
+ timestamp: Date.now(),
42
+ });
43
+ return;
44
+ }
45
+ this.graph.updateTask(task.id, { status: 'interrupted' });
46
+ this.bus.publish({
47
+ type: 'agent:blocked',
48
+ agentId: 'dispatcher',
49
+ taskId: task.id,
50
+ payload: { error: result.error },
51
+ timestamp: Date.now(),
52
+ });
53
+ }
54
+ catch (error) {
55
+ this.graph.updateTask(task.id, { status: 'interrupted' });
56
+ this.bus.publish({
57
+ type: 'agent:blocked',
58
+ agentId: 'dispatcher',
59
+ taskId: task.id,
60
+ payload: { error: error instanceof Error ? error.message : 'Unknown dispatcher error' },
61
+ timestamp: Date.now(),
62
+ });
63
+ }
64
+ finally {
65
+ this.running.delete(task.id);
66
+ }
67
+ }
68
+ timeout(taskId) {
69
+ return new Promise((resolve) => {
70
+ setTimeout(() => {
71
+ resolve({ success: false, error: `Task ${taskId} timed out after ${this.options.taskTimeout}ms` });
72
+ }, this.options.taskTimeout);
73
+ });
74
+ }
75
+ }
76
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../src/core/dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type OrkaErrorCode = 'api_key_invalid' | 'provider_unreachable' | 'ollama_unreachable' | 'ollama_model_not_found' | 'rate_limit' | 'context_limit' | 'task_timeout' | 'no_tasks_generated' | 'provider_not_configured' | 'oauth_failed' | 'credentials_write_failed' | 'mcp_server_unreachable';
2
+ export declare class OrkaError extends Error {
3
+ readonly code: OrkaErrorCode;
4
+ readonly userMessage: string;
5
+ readonly cause?: Error | undefined;
6
+ constructor(code: OrkaErrorCode, userMessage: string, cause?: Error | undefined);
7
+ }
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB,iBAAiB,GACjB,sBAAsB,GACtB,oBAAoB,GACpB,wBAAwB,GACxB,YAAY,GACZ,eAAe,GACf,cAAc,GACd,oBAAoB,GACpB,yBAAyB,GACzB,cAAc,GACd,0BAA0B,GAC1B,wBAAwB,CAAA;AAE5B,qBAAa,SAAU,SAAQ,KAAK;aAEhB,IAAI,EAAE,aAAa;aACnB,WAAW,EAAE,MAAM;aACnB,KAAK,CAAC,EAAE,KAAK;gBAFb,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC"}
@@ -0,0 +1,13 @@
1
+ export class OrkaError extends Error {
2
+ code;
3
+ userMessage;
4
+ cause;
5
+ constructor(code, userMessage, cause) {
6
+ super(userMessage);
7
+ this.code = code;
8
+ this.userMessage = userMessage;
9
+ this.cause = cause;
10
+ this.name = 'OrkaError';
11
+ }
12
+ }
13
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEhB;IACA;IACA;IAHlB,YACkB,IAAmB,EACnB,WAAmB,EACnB,KAAa;QAE7B,KAAK,CAAC,WAAW,CAAC,CAAA;QAJF,SAAI,GAAJ,IAAI,CAAe;QACnB,gBAAW,GAAX,WAAW,CAAQ;QACnB,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAA;IACzB,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { FileLockRecord } from '../types.js';
2
+ import type { StateStore } from './state.js';
3
+ interface LockResult {
4
+ success: boolean;
5
+ heldBy?: string;
6
+ }
7
+ interface MultipleLockResult {
8
+ success: boolean;
9
+ acquired: string[];
10
+ conflicts: string[];
11
+ }
12
+ export declare class FileOwnership {
13
+ private readonly store;
14
+ constructor(store: StateStore);
15
+ acquireLock(filePath: string, agentId: string, taskId: string): LockResult;
16
+ acquireMultiple(filePaths: string[], agentId: string, taskId: string): MultipleLockResult;
17
+ releaseLock(filePath: string, agentId: string): void;
18
+ releaseByTask(taskId: string): void;
19
+ activeLocks(): FileLockRecord[];
20
+ staleLocks(timeoutSeconds: number): FileLockRecord[];
21
+ releaseStale(timeoutSeconds: number): string[];
22
+ private rowToLock;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=file-ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-ownership.d.ts","sourceRoot":"","sources":["../../src/core/file-ownership.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAUD,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,UAAU;IAE9C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU;IAiB1E,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB;IA+BzF,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMpD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMnC,WAAW,IAAI,cAAc,EAAE;IAK/B,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,cAAc,EAAE;IASpD,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE;IAW9C,OAAO,CAAC,SAAS;CASlB"}
@@ -0,0 +1,81 @@
1
+ export class FileOwnership {
2
+ store;
3
+ constructor(store) {
4
+ this.store = store;
5
+ }
6
+ acquireLock(filePath, agentId, taskId) {
7
+ const db = this.store.database;
8
+ const info = db
9
+ .prepare('INSERT OR IGNORE INTO file_locks (file_path, agent_id, task_id, locked_at) VALUES (?, ?, ?, ?)')
10
+ .run(filePath, agentId, taskId, Date.now());
11
+ if (info.changes === 0) {
12
+ const held = db
13
+ .prepare('SELECT agent_id FROM file_locks WHERE file_path = ? AND released_at IS NULL')
14
+ .get(filePath);
15
+ return { success: false, heldBy: held?.agent_id };
16
+ }
17
+ return { success: true };
18
+ }
19
+ acquireMultiple(filePaths, agentId, taskId) {
20
+ const db = this.store.database;
21
+ return db.transaction(() => {
22
+ const conflicts = [];
23
+ for (const filePath of filePaths) {
24
+ const existing = db
25
+ .prepare('SELECT agent_id FROM file_locks WHERE file_path = ? AND released_at IS NULL')
26
+ .get(filePath);
27
+ if (existing) {
28
+ conflicts.push(filePath);
29
+ }
30
+ }
31
+ if (conflicts.length > 0) {
32
+ return { success: false, acquired: [], conflicts };
33
+ }
34
+ const insert = db.prepare('INSERT INTO file_locks (file_path, agent_id, task_id, locked_at) VALUES (?, ?, ?, ?)');
35
+ const lockedAt = Date.now();
36
+ for (const filePath of filePaths) {
37
+ insert.run(filePath, agentId, taskId, lockedAt);
38
+ }
39
+ return { success: true, acquired: [...filePaths], conflicts: [] };
40
+ })();
41
+ }
42
+ releaseLock(filePath, agentId) {
43
+ this.store.database
44
+ .prepare('UPDATE file_locks SET released_at = ? WHERE file_path = ? AND agent_id = ? AND released_at IS NULL')
45
+ .run(Date.now(), filePath, agentId);
46
+ }
47
+ releaseByTask(taskId) {
48
+ this.store.database
49
+ .prepare('UPDATE file_locks SET released_at = ? WHERE task_id = ? AND released_at IS NULL')
50
+ .run(Date.now(), taskId);
51
+ }
52
+ activeLocks() {
53
+ const rows = this.store.database.prepare('SELECT * FROM file_locks WHERE released_at IS NULL').all();
54
+ return rows.map((row) => this.rowToLock(row));
55
+ }
56
+ staleLocks(timeoutSeconds) {
57
+ const cutoff = Date.now() - timeoutSeconds * 1000;
58
+ const rows = this.store.database
59
+ .prepare('SELECT * FROM file_locks WHERE released_at IS NULL AND locked_at < ?')
60
+ .all(cutoff);
61
+ return rows.map((row) => this.rowToLock(row));
62
+ }
63
+ releaseStale(timeoutSeconds) {
64
+ const stale = this.staleLocks(timeoutSeconds);
65
+ const cutoff = Date.now() - timeoutSeconds * 1000;
66
+ this.store.database
67
+ .prepare('UPDATE file_locks SET released_at = ? WHERE released_at IS NULL AND locked_at < ?')
68
+ .run(Date.now(), cutoff);
69
+ return stale.map((lock) => lock.filePath);
70
+ }
71
+ rowToLock(row) {
72
+ return {
73
+ filePath: row.file_path,
74
+ agentId: row.agent_id,
75
+ taskId: row.task_id,
76
+ lockedAt: row.locked_at,
77
+ releasedAt: row.released_at,
78
+ };
79
+ }
80
+ }
81
+ //# sourceMappingURL=file-ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-ownership.js","sourceRoot":"","sources":["../../src/core/file-ownership.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { MessageBus } from './bus.js';
2
+ export type { BusMessage, MessageType } from './bus.js';
3
+ export { StateStore } from './state.js';
4
+ export type { SessionRecord } from './state.js';
5
+ export { TaskGraph } from './task.js';
6
+ export { FileOwnership } from './file-ownership.js';
7
+ export { TaskDispatcher } from './dispatcher.js';
8
+ export type { AgentExecutor } from './dispatcher.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { MessageBus } from './bus.js';
2
+ export { StateStore } from './state.js';
3
+ export { TaskGraph } from './task.js';
4
+ export { FileOwnership } from './file-ownership.js';
5
+ export { TaskDispatcher } from './dispatcher.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { MCPClient, MCPServerConfig } from './mcp-client.js';
2
+ export declare class MCPClientPool {
3
+ private readonly servers;
4
+ private clients;
5
+ constructor(servers: MCPServerConfig[]);
6
+ getClient(serverName: string): Promise<MCPClient>;
7
+ disconnectAll(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=mcp-client-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client-pool.d.ts","sourceRoot":"","sources":["../../src/core/mcp-client-pool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAE5D,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,OAAO,CAA+B;gBAEjB,OAAO,EAAE,eAAe,EAAE;IAEjD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAejD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAIrC"}
@@ -0,0 +1,26 @@
1
+ import { OrkaError } from './errors.js';
2
+ import { MCPClient } from './mcp-client.js';
3
+ export class MCPClientPool {
4
+ servers;
5
+ clients = new Map();
6
+ constructor(servers) {
7
+ this.servers = servers;
8
+ }
9
+ async getClient(serverName) {
10
+ if (this.clients.has(serverName)) {
11
+ return this.clients.get(serverName);
12
+ }
13
+ const config = this.servers.find((s) => s.name === serverName);
14
+ if (!config) {
15
+ throw new OrkaError('mcp_server_unreachable', `MCP server "${serverName}" not configured`);
16
+ }
17
+ const client = new MCPClient(config);
18
+ this.clients.set(serverName, client);
19
+ return client;
20
+ }
21
+ async disconnectAll() {
22
+ await Promise.allSettled([...this.clients.values()].map((c) => c.disconnect()));
23
+ this.clients.clear();
24
+ }
25
+ }
26
+ //# sourceMappingURL=mcp-client-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client-pool.js","sourceRoot":"","sources":["../../src/core/mcp-client-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,SAAS,EAAmB,MAAM,iBAAiB,CAAA;AAE5D,MAAM,OAAO,aAAa;IAGK;IAFrB,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAA;IAE9C,YAA6B,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAE3D,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,CAAA;QACtC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;QAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,SAAS,CAAC,wBAAwB,EAAE,eAAe,UAAU,kBAAkB,CAAC,CAAA;QAC5F,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;QACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QACpC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QAC/E,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ export interface MCPServerConfig {
2
+ name: string;
3
+ command: string;
4
+ args: string[];
5
+ env?: Record<string, string>;
6
+ }
7
+ export interface MCPTool {
8
+ name: string;
9
+ description: string;
10
+ inputSchema: Record<string, unknown>;
11
+ }
12
+ export interface MCPToolResult {
13
+ content: string;
14
+ isError: boolean;
15
+ }
16
+ export declare class MCPClient {
17
+ private readonly config;
18
+ private client;
19
+ private transport;
20
+ private connected;
21
+ constructor(config: MCPServerConfig);
22
+ connect(): Promise<void>;
23
+ listTools(): Promise<MCPTool[]>;
24
+ callTool(name: string, args: Record<string, unknown>): Promise<MCPToolResult>;
25
+ disconnect(): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=mcp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../src/core/mcp-client.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,qBAAa,SAAS;IAKR,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAQ;gBAEI,MAAM,EAAE,eAAe;IAE9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBxB,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAU/B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAqB7E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC"}
@@ -0,0 +1,63 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ import { OrkaError } from './errors.js';
4
+ export class MCPClient {
5
+ config;
6
+ client;
7
+ transport;
8
+ connected = false;
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ async connect() {
13
+ if (this.connected)
14
+ return;
15
+ this.transport = new StdioClientTransport({
16
+ command: this.config.command,
17
+ args: this.config.args,
18
+ env: this.config.env,
19
+ });
20
+ this.client = new Client({ name: 'orka', version: '1.0.0' }, { capabilities: {} });
21
+ try {
22
+ await this.client.connect(this.transport);
23
+ this.connected = true;
24
+ }
25
+ catch (err) {
26
+ throw new OrkaError('mcp_server_unreachable', `MCP server "${this.config.name}" tidak bisa dihubungi`, err instanceof Error ? err : undefined);
27
+ }
28
+ }
29
+ async listTools() {
30
+ if (!this.connected)
31
+ await this.connect();
32
+ const { tools } = await this.client.listTools();
33
+ return tools.map((t) => ({
34
+ name: t.name,
35
+ description: t.description ?? '',
36
+ inputSchema: t.inputSchema,
37
+ }));
38
+ }
39
+ async callTool(name, args) {
40
+ if (!this.connected)
41
+ await this.connect();
42
+ try {
43
+ const result = await this.client.callTool({ name, arguments: args });
44
+ const text = result.content
45
+ .filter((c) => c.type === 'text')
46
+ .map((c) => c.text ?? '')
47
+ .join('');
48
+ return { content: text, isError: result.isError === true };
49
+ }
50
+ catch (err) {
51
+ if (err instanceof OrkaError)
52
+ throw err;
53
+ throw new OrkaError('mcp_server_unreachable', `Gagal memanggil tool "${name}" di server "${this.config.name}"`, err instanceof Error ? err : undefined);
54
+ }
55
+ }
56
+ async disconnect() {
57
+ if (!this.connected)
58
+ return;
59
+ await this.client.close();
60
+ this.connected = false;
61
+ }
62
+ }
63
+ //# sourceMappingURL=mcp-client.js.map