funolio-agent 0.1.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 (138) hide show
  1. package/README.md +55 -0
  2. package/dist/clerk/index.d.ts +62 -0
  3. package/dist/clerk/index.d.ts.map +1 -0
  4. package/dist/clerk/index.js +186 -0
  5. package/dist/clerk/index.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +42 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/configure.d.ts +2 -0
  11. package/dist/commands/configure.d.ts.map +1 -0
  12. package/dist/commands/configure.js +252 -0
  13. package/dist/commands/configure.js.map +1 -0
  14. package/dist/commands/init.d.ts +6 -0
  15. package/dist/commands/init.d.ts.map +1 -0
  16. package/dist/commands/init.js +151 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/commands/login.d.ts +6 -0
  19. package/dist/commands/login.d.ts.map +1 -0
  20. package/dist/commands/login.js +170 -0
  21. package/dist/commands/login.js.map +1 -0
  22. package/dist/commands/start.d.ts +8 -0
  23. package/dist/commands/start.d.ts.map +1 -0
  24. package/dist/commands/start.js +179 -0
  25. package/dist/commands/start.js.map +1 -0
  26. package/dist/commands/status.d.ts +2 -0
  27. package/dist/commands/status.d.ts.map +1 -0
  28. package/dist/commands/status.js +55 -0
  29. package/dist/commands/status.js.map +1 -0
  30. package/dist/config.d.ts +46 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +113 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/index.d.ts +24 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +48 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mcp/index.d.ts +9 -0
  39. package/dist/mcp/index.d.ts.map +1 -0
  40. package/dist/mcp/index.js +15 -0
  41. package/dist/mcp/index.js.map +1 -0
  42. package/dist/mcp/manager.d.ts +83 -0
  43. package/dist/mcp/manager.d.ts.map +1 -0
  44. package/dist/mcp/manager.js +338 -0
  45. package/dist/mcp/manager.js.map +1 -0
  46. package/dist/mcp/registry.d.ts +32 -0
  47. package/dist/mcp/registry.d.ts.map +1 -0
  48. package/dist/mcp/registry.js +139 -0
  49. package/dist/mcp/registry.js.map +1 -0
  50. package/dist/message-loop.d.ts +18 -0
  51. package/dist/message-loop.d.ts.map +1 -0
  52. package/dist/message-loop.js +165 -0
  53. package/dist/message-loop.js.map +1 -0
  54. package/dist/mqtt-client.d.ts +67 -0
  55. package/dist/mqtt-client.d.ts.map +1 -0
  56. package/dist/mqtt-client.js +148 -0
  57. package/dist/mqtt-client.js.map +1 -0
  58. package/dist/providers/anthropic.d.ts +10 -0
  59. package/dist/providers/anthropic.d.ts.map +1 -0
  60. package/dist/providers/anthropic.js +183 -0
  61. package/dist/providers/anthropic.js.map +1 -0
  62. package/dist/providers/google.d.ts +10 -0
  63. package/dist/providers/google.d.ts.map +1 -0
  64. package/dist/providers/google.js +161 -0
  65. package/dist/providers/google.js.map +1 -0
  66. package/dist/providers/index.d.ts +42 -0
  67. package/dist/providers/index.d.ts.map +1 -0
  68. package/dist/providers/index.js +19 -0
  69. package/dist/providers/index.js.map +1 -0
  70. package/dist/providers/openai.d.ts +10 -0
  71. package/dist/providers/openai.d.ts.map +1 -0
  72. package/dist/providers/openai.js +173 -0
  73. package/dist/providers/openai.js.map +1 -0
  74. package/dist/providers/retry.d.ts +6 -0
  75. package/dist/providers/retry.d.ts.map +1 -0
  76. package/dist/providers/retry.js +38 -0
  77. package/dist/providers/retry.js.map +1 -0
  78. package/dist/subagent/index.d.ts +8 -0
  79. package/dist/subagent/index.d.ts.map +1 -0
  80. package/dist/subagent/index.js +14 -0
  81. package/dist/subagent/index.js.map +1 -0
  82. package/dist/subagent/orchestrator.d.ts +67 -0
  83. package/dist/subagent/orchestrator.d.ts.map +1 -0
  84. package/dist/subagent/orchestrator.js +152 -0
  85. package/dist/subagent/orchestrator.js.map +1 -0
  86. package/dist/subagent/queue.d.ts +66 -0
  87. package/dist/subagent/queue.d.ts.map +1 -0
  88. package/dist/subagent/queue.js +298 -0
  89. package/dist/subagent/queue.js.map +1 -0
  90. package/dist/subagent/types.d.ts +76 -0
  91. package/dist/subagent/types.d.ts.map +1 -0
  92. package/dist/subagent/types.js +14 -0
  93. package/dist/subagent/types.js.map +1 -0
  94. package/dist/tools/edit-file.d.ts +3 -0
  95. package/dist/tools/edit-file.d.ts.map +1 -0
  96. package/dist/tools/edit-file.js +112 -0
  97. package/dist/tools/edit-file.js.map +1 -0
  98. package/dist/tools/git-tools.d.ts +5 -0
  99. package/dist/tools/git-tools.d.ts.map +1 -0
  100. package/dist/tools/git-tools.js +144 -0
  101. package/dist/tools/git-tools.js.map +1 -0
  102. package/dist/tools/index.d.ts +40 -0
  103. package/dist/tools/index.d.ts.map +1 -0
  104. package/dist/tools/index.js +126 -0
  105. package/dist/tools/index.js.map +1 -0
  106. package/dist/tools/installer.d.ts +41 -0
  107. package/dist/tools/installer.d.ts.map +1 -0
  108. package/dist/tools/installer.js +227 -0
  109. package/dist/tools/installer.js.map +1 -0
  110. package/dist/tools/list-directory.d.ts +3 -0
  111. package/dist/tools/list-directory.d.ts.map +1 -0
  112. package/dist/tools/list-directory.js +107 -0
  113. package/dist/tools/list-directory.js.map +1 -0
  114. package/dist/tools/read-file.d.ts +3 -0
  115. package/dist/tools/read-file.d.ts.map +1 -0
  116. package/dist/tools/read-file.js +89 -0
  117. package/dist/tools/read-file.js.map +1 -0
  118. package/dist/tools/run-command.d.ts +3 -0
  119. package/dist/tools/run-command.d.ts.map +1 -0
  120. package/dist/tools/run-command.js +86 -0
  121. package/dist/tools/run-command.js.map +1 -0
  122. package/dist/tools/sandbox.d.ts +17 -0
  123. package/dist/tools/sandbox.d.ts.map +1 -0
  124. package/dist/tools/sandbox.js +78 -0
  125. package/dist/tools/sandbox.js.map +1 -0
  126. package/dist/tools/write-file.d.ts +3 -0
  127. package/dist/tools/write-file.d.ts.map +1 -0
  128. package/dist/tools/write-file.js +88 -0
  129. package/dist/tools/write-file.js.map +1 -0
  130. package/dist/types.d.ts +67 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +6 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/verification/index.d.ts +17 -0
  135. package/dist/verification/index.d.ts.map +1 -0
  136. package/dist/verification/index.js +224 -0
  137. package/dist/verification/index.js.map +1 -0
  138. package/package.json +41 -0
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GoogleProvider = void 0;
4
+ const retry_1 = require("./retry");
5
+ class GoogleProvider {
6
+ config;
7
+ baseUrl = 'https://generativelanguage.googleapis.com/v1beta';
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ async chat(options) {
12
+ return (0, retry_1.withRetry)(async () => {
13
+ const contents = [];
14
+ // Google uses a different message format
15
+ for (const m of options.messages) {
16
+ if (m.role === 'assistant') {
17
+ const parts = [];
18
+ if (m.content)
19
+ parts.push({ text: m.content });
20
+ if (m.toolCalls) {
21
+ for (const tc of m.toolCalls) {
22
+ parts.push({
23
+ functionCall: {
24
+ name: tc.name,
25
+ args: tc.arguments,
26
+ },
27
+ });
28
+ }
29
+ }
30
+ contents.push({ role: 'model', parts });
31
+ }
32
+ else {
33
+ contents.push({
34
+ role: 'user',
35
+ parts: [{ text: m.content }],
36
+ });
37
+ }
38
+ }
39
+ const body = {
40
+ contents,
41
+ generationConfig: {
42
+ maxOutputTokens: 4096,
43
+ },
44
+ };
45
+ if (options.system) {
46
+ body.systemInstruction = { parts: [{ text: options.system }] };
47
+ }
48
+ const model = this.config.model;
49
+ const url = `${this.baseUrl}/models/${model}:${options.stream ? 'streamGenerateContent' : 'generateContent'}?key=${this.config.apiKey}`;
50
+ if (options.stream && options.onChunk) {
51
+ return this.chatStream(url, body, options.onChunk);
52
+ }
53
+ const response = await fetch(url, {
54
+ method: 'POST',
55
+ headers: { 'Content-Type': 'application/json' },
56
+ body: JSON.stringify(body),
57
+ });
58
+ if (!response.ok) {
59
+ const error = new Error(`Google API error: ${response.status}`);
60
+ error.status = response.status;
61
+ throw error;
62
+ }
63
+ const data = await response.json();
64
+ return this.parseResponse(data);
65
+ }, this.config.maxRetries, this.config.baseDelay);
66
+ }
67
+ async chatStream(url, body, onChunk) {
68
+ // Google streaming returns newline-delimited JSON array
69
+ url += '&alt=sse';
70
+ const response = await fetch(url, {
71
+ method: 'POST',
72
+ headers: { 'Content-Type': 'application/json' },
73
+ body: JSON.stringify(body),
74
+ });
75
+ if (!response.ok) {
76
+ const error = new Error(`Google API error: ${response.status}`);
77
+ error.status = response.status;
78
+ throw error;
79
+ }
80
+ const reader = response.body?.getReader();
81
+ if (!reader)
82
+ throw new Error('No response body');
83
+ const decoder = new TextDecoder();
84
+ let fullContent = '';
85
+ const toolCalls = [];
86
+ let buffer = '';
87
+ let toolCallCounter = 0;
88
+ while (true) {
89
+ const { done, value } = await reader.read();
90
+ if (done)
91
+ break;
92
+ buffer += decoder.decode(value, { stream: true });
93
+ const lines = buffer.split('\n');
94
+ buffer = lines.pop() || '';
95
+ for (const line of lines) {
96
+ if (!line.startsWith('data: '))
97
+ continue;
98
+ const data = line.slice(6).trim();
99
+ if (!data)
100
+ continue;
101
+ try {
102
+ const event = JSON.parse(data);
103
+ const candidate = event.candidates?.[0];
104
+ if (!candidate?.content?.parts)
105
+ continue;
106
+ for (const part of candidate.content.parts) {
107
+ if (part.text) {
108
+ fullContent += part.text;
109
+ await onChunk(part.text);
110
+ }
111
+ if (part.functionCall) {
112
+ toolCalls.push({
113
+ id: `google-tc-${toolCallCounter++}`,
114
+ name: part.functionCall.name,
115
+ arguments: part.functionCall.args || {},
116
+ });
117
+ }
118
+ }
119
+ }
120
+ catch {
121
+ // skip malformed events
122
+ }
123
+ }
124
+ }
125
+ return {
126
+ content: fullContent,
127
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
128
+ };
129
+ }
130
+ parseResponse(data) {
131
+ let content = '';
132
+ const toolCalls = [];
133
+ let toolCallCounter = 0;
134
+ const candidate = data.candidates?.[0];
135
+ if (candidate?.content?.parts) {
136
+ for (const part of candidate.content.parts) {
137
+ if (part.text) {
138
+ content += part.text;
139
+ }
140
+ if (part.functionCall) {
141
+ toolCalls.push({
142
+ id: `google-tc-${toolCallCounter++}`,
143
+ name: part.functionCall.name,
144
+ arguments: part.functionCall.args || {},
145
+ });
146
+ }
147
+ }
148
+ }
149
+ return {
150
+ content,
151
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
152
+ usage: data.usageMetadata ? {
153
+ inputTokens: data.usageMetadata.promptTokenCount || 0,
154
+ outputTokens: data.usageMetadata.candidatesTokenCount || 0,
155
+ } : undefined,
156
+ finishReason: candidate?.finishReason,
157
+ };
158
+ }
159
+ }
160
+ exports.GoogleProvider = GoogleProvider;
161
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":";;;AACA,mCAAoC;AAEpC,MAAa,cAAc;IACjB,MAAM,CAAoB;IAC1B,OAAO,GAAG,kDAAkD,CAAC;IAErE,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,OAAO,IAAA,iBAAS,EAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,QAAQ,GAAU,EAAE,CAAC;YAE3B,yCAAyC;YACzC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACjC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAU,EAAE,CAAC;oBACxB,IAAI,CAAC,CAAC,OAAO;wBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC/C,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;wBAChB,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;4BAC7B,KAAK,CAAC,IAAI,CAAC;gCACT,YAAY,EAAE;oCACZ,IAAI,EAAE,EAAE,CAAC,IAAI;oCACb,IAAI,EAAE,EAAE,CAAC,SAAS;iCACnB;6BACF,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,MAAM;wBACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;qBAC7B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAwB;gBAChC,QAAQ;gBACR,gBAAgB,EAAE;oBAChB,eAAe,EAAE,IAAI;iBACtB;aACF,CAAC;YAEF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,IAAI,CAAC,iBAAiB,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACjE,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAChC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,WAAW,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,iBAAiB,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAExI,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAQ,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrE,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC/B,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAS,CAAC;YAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,IAAyB,EAAE,OAAyC;QACxG,wDAAwD;QACxD,GAAG,IAAI,UAAU,CAAC;QAElB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAQ,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACrE,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAEpB,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;oBACxC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK;wBAAE,SAAS;oBAEzC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBAC3C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;4BACd,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC;4BACzB,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC3B,CAAC;wBACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;4BACtB,SAAS,CAAC,IAAI,CAAC;gCACb,EAAE,EAAE,aAAa,eAAe,EAAE,EAAE;gCACpC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;gCAC5B,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE;6BACxC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACxD,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,IAAS;QAC7B,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC3C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC;gBACvB,CAAC;gBACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACtB,SAAS,CAAC,IAAI,CAAC;wBACb,EAAE,EAAE,aAAa,eAAe,EAAE,EAAE;wBACpC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;wBAC5B,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE;qBACxC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO;YACP,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACvD,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC1B,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,gBAAgB,IAAI,CAAC;gBACrD,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,oBAAoB,IAAI,CAAC;aAC3D,CAAC,CAAC,CAAC,SAAS;YACb,YAAY,EAAE,SAAS,EAAE,YAAY;SACtC,CAAC;IACJ,CAAC;CACF;AA1KD,wCA0KC"}
@@ -0,0 +1,42 @@
1
+ export interface LLMToolCall {
2
+ id: string;
3
+ name: string;
4
+ arguments: Record<string, any>;
5
+ }
6
+ export interface LLMMessage {
7
+ role: 'user' | 'assistant' | 'system';
8
+ content: string;
9
+ toolCalls?: LLMToolCall[];
10
+ }
11
+ export interface LLMChatOptions {
12
+ messages: LLMMessage[];
13
+ system?: string;
14
+ stream?: boolean;
15
+ onChunk?: (chunk: string) => Promise<void>;
16
+ tools?: LLMToolDefinition[];
17
+ }
18
+ export interface LLMToolDefinition {
19
+ name: string;
20
+ description: string;
21
+ parameters: Record<string, any>;
22
+ }
23
+ export interface LLMResponse {
24
+ content: string;
25
+ toolCalls?: LLMToolCall[];
26
+ usage?: {
27
+ inputTokens: number;
28
+ outputTokens: number;
29
+ };
30
+ finishReason?: string;
31
+ }
32
+ export interface LLMProviderConfig {
33
+ apiKey: string;
34
+ model: string;
35
+ maxRetries?: number;
36
+ baseDelay?: number;
37
+ }
38
+ export interface LLMProvider {
39
+ chat(options: LLMChatOptions): Promise<LLMResponse>;
40
+ }
41
+ export declare function createProvider(providerName: string, config: LLMProviderConfig): LLMProvider;
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACrD;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAW3F"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProvider = createProvider;
4
+ const anthropic_1 = require("./anthropic");
5
+ const openai_1 = require("./openai");
6
+ const google_1 = require("./google");
7
+ function createProvider(providerName, config) {
8
+ switch (providerName) {
9
+ case 'anthropic':
10
+ return new anthropic_1.AnthropicProvider(config);
11
+ case 'openai':
12
+ return new openai_1.OpenAIProvider(config);
13
+ case 'google':
14
+ return new google_1.GoogleProvider(config);
15
+ default:
16
+ throw new Error(`Unknown LLM provider: ${providerName}. Supported: anthropic, openai, google`);
17
+ }
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;AAmDA,wCAWC;AA9DD,2CAAgD;AAChD,qCAA0C;AAC1C,qCAA0C;AAiD1C,SAAgB,cAAc,CAAC,YAAoB,EAAE,MAAyB;IAC5E,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,IAAI,6BAAiB,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,QAAQ;YACX,OAAO,IAAI,uBAAc,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,uBAAc,CAAC,MAAM,CAAC,CAAC;QACpC;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,wCAAwC,CAAC,CAAC;IACnG,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { LLMProvider, LLMProviderConfig, LLMChatOptions, LLMResponse } from './index';
2
+ export declare class OpenAIProvider implements LLMProvider {
3
+ private config;
4
+ private baseUrl;
5
+ constructor(config: LLMProviderConfig);
6
+ chat(options: LLMChatOptions): Promise<LLMResponse>;
7
+ private chatStream;
8
+ private parseResponse;
9
+ }
10
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AAGnG,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAA+B;gBAElC,MAAM,EAAE,iBAAiB;IAI/B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;YAyD3C,UAAU;IA6FxB,OAAO,CAAC,aAAa;CAyBtB"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAIProvider = void 0;
4
+ const retry_1 = require("./retry");
5
+ class OpenAIProvider {
6
+ config;
7
+ baseUrl = 'https://api.openai.com/v1';
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ async chat(options) {
12
+ return (0, retry_1.withRetry)(async () => {
13
+ const messages = [];
14
+ if (options.system) {
15
+ messages.push({ role: 'system', content: options.system });
16
+ }
17
+ for (const m of options.messages) {
18
+ if (m.role === 'assistant' && m.toolCalls?.length) {
19
+ messages.push({
20
+ role: 'assistant',
21
+ content: m.content || null,
22
+ tool_calls: m.toolCalls.map(tc => ({
23
+ id: tc.id,
24
+ type: 'function',
25
+ function: {
26
+ name: tc.name,
27
+ arguments: JSON.stringify(tc.arguments),
28
+ },
29
+ })),
30
+ });
31
+ }
32
+ else {
33
+ messages.push({ role: m.role, content: m.content });
34
+ }
35
+ }
36
+ const body = {
37
+ model: this.config.model,
38
+ messages,
39
+ max_tokens: 4096,
40
+ };
41
+ if (options.stream && options.onChunk) {
42
+ return this.chatStream(body, options.onChunk);
43
+ }
44
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
45
+ method: 'POST',
46
+ headers: {
47
+ 'Content-Type': 'application/json',
48
+ 'Authorization': `Bearer ${this.config.apiKey}`,
49
+ },
50
+ body: JSON.stringify(body),
51
+ });
52
+ if (!response.ok) {
53
+ const error = new Error(`OpenAI API error: ${response.status}`);
54
+ error.status = response.status;
55
+ throw error;
56
+ }
57
+ const data = await response.json();
58
+ return this.parseResponse(data);
59
+ }, this.config.maxRetries, this.config.baseDelay);
60
+ }
61
+ async chatStream(body, onChunk) {
62
+ body.stream = true;
63
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
64
+ method: 'POST',
65
+ headers: {
66
+ 'Content-Type': 'application/json',
67
+ 'Authorization': `Bearer ${this.config.apiKey}`,
68
+ },
69
+ body: JSON.stringify(body),
70
+ });
71
+ if (!response.ok) {
72
+ const error = new Error(`OpenAI API error: ${response.status}`);
73
+ error.status = response.status;
74
+ throw error;
75
+ }
76
+ const reader = response.body?.getReader();
77
+ if (!reader)
78
+ throw new Error('No response body');
79
+ const decoder = new TextDecoder();
80
+ let fullContent = '';
81
+ const toolCalls = new Map();
82
+ let buffer = '';
83
+ while (true) {
84
+ const { done, value } = await reader.read();
85
+ if (done)
86
+ break;
87
+ buffer += decoder.decode(value, { stream: true });
88
+ const lines = buffer.split('\n');
89
+ buffer = lines.pop() || '';
90
+ for (const line of lines) {
91
+ if (!line.startsWith('data: '))
92
+ continue;
93
+ const data = line.slice(6).trim();
94
+ if (data === '[DONE]')
95
+ continue;
96
+ try {
97
+ const event = JSON.parse(data);
98
+ const delta = event.choices?.[0]?.delta;
99
+ if (delta?.content) {
100
+ fullContent += delta.content;
101
+ await onChunk(delta.content);
102
+ }
103
+ if (delta?.tool_calls) {
104
+ for (const tc of delta.tool_calls) {
105
+ const idx = tc.index ?? 0;
106
+ if (!toolCalls.has(idx)) {
107
+ toolCalls.set(idx, {
108
+ id: tc.id || '',
109
+ name: tc.function?.name || '',
110
+ arguments: {},
111
+ });
112
+ }
113
+ const existing = toolCalls.get(idx);
114
+ if (tc.id)
115
+ existing.id = tc.id;
116
+ if (tc.function?.name)
117
+ existing.name = tc.function.name;
118
+ if (tc.function?.arguments) {
119
+ // Accumulate JSON string
120
+ const prev = existing._rawArgs || '';
121
+ existing._rawArgs = prev + tc.function.arguments;
122
+ }
123
+ }
124
+ }
125
+ }
126
+ catch {
127
+ // skip malformed events
128
+ }
129
+ }
130
+ }
131
+ // Parse accumulated tool call arguments
132
+ const parsedToolCalls = [];
133
+ for (const tc of toolCalls.values()) {
134
+ try {
135
+ tc.arguments = JSON.parse(tc._rawArgs || '{}');
136
+ }
137
+ catch {
138
+ tc.arguments = {};
139
+ }
140
+ delete tc._rawArgs;
141
+ parsedToolCalls.push(tc);
142
+ }
143
+ return {
144
+ content: fullContent,
145
+ toolCalls: parsedToolCalls.length > 0 ? parsedToolCalls : undefined,
146
+ };
147
+ }
148
+ parseResponse(data) {
149
+ const choice = data.choices?.[0];
150
+ const content = choice?.message?.content || '';
151
+ const toolCalls = [];
152
+ if (choice?.message?.tool_calls) {
153
+ for (const tc of choice.message.tool_calls) {
154
+ toolCalls.push({
155
+ id: tc.id,
156
+ name: tc.function.name,
157
+ arguments: JSON.parse(tc.function.arguments || '{}'),
158
+ });
159
+ }
160
+ }
161
+ return {
162
+ content,
163
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
164
+ usage: data.usage ? {
165
+ inputTokens: data.usage.prompt_tokens,
166
+ outputTokens: data.usage.completion_tokens,
167
+ } : undefined,
168
+ finishReason: choice?.finish_reason,
169
+ };
170
+ }
171
+ }
172
+ exports.OpenAIProvider = OpenAIProvider;
173
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Exponential backoff retry wrapper for LLM API calls.
3
+ * Retries on rate limit (429) and server errors (5xx).
4
+ */
5
+ export declare function withRetry<T>(fn: () => Promise<T>, maxRetries?: number, baseDelay?: number): Promise<T>;
6
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/providers/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,UAAU,SAAI,EACd,SAAS,SAAO,GACf,OAAO,CAAC,CAAC,CAAC,CAgCZ"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withRetry = withRetry;
4
+ /**
5
+ * Exponential backoff retry wrapper for LLM API calls.
6
+ * Retries on rate limit (429) and server errors (5xx).
7
+ */
8
+ async function withRetry(fn, maxRetries = 3, baseDelay = 1000) {
9
+ let lastError;
10
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
11
+ try {
12
+ return await fn();
13
+ }
14
+ catch (error) {
15
+ lastError = error;
16
+ const status = error.status || error.statusCode || 0;
17
+ const isRetryable = status === 429 || (status >= 500 && status < 600);
18
+ if (!isRetryable || attempt === maxRetries) {
19
+ throw error;
20
+ }
21
+ // Parse retry-after header if available
22
+ const retryAfter = error.headers?.['retry-after'];
23
+ let delay;
24
+ if (retryAfter) {
25
+ delay = parseInt(retryAfter, 10) * 1000;
26
+ if (isNaN(delay))
27
+ delay = baseDelay * Math.pow(2, attempt);
28
+ }
29
+ else {
30
+ delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
31
+ }
32
+ console.log(`Rate limited (${status}). Retrying in ${Math.round(delay / 1000)}s... (attempt ${attempt + 1}/${maxRetries})`);
33
+ await new Promise(resolve => setTimeout(resolve, delay));
34
+ }
35
+ }
36
+ throw lastError;
37
+ }
38
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/providers/retry.ts"],"names":[],"mappings":";;AAIA,8BAoCC;AAxCD;;;GAGG;AACI,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,UAAU,GAAG,CAAC,EACd,SAAS,GAAG,IAAI;IAEhB,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,SAAS,GAAG,KAAK,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;YACrD,MAAM,WAAW,GAAG,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC;YAEtE,IAAI,CAAC,WAAW,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC3C,MAAM,KAAK,CAAC;YACd,CAAC;YAED,wCAAwC;YACxC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC;YAClD,IAAI,KAAa,CAAC;YAElB,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;gBACxC,IAAI,KAAK,CAAC,KAAK,CAAC;oBAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;YAClE,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,kBAAkB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,iBAAiB,OAAO,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;YAC5H,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Phase 3K: Sub-Agent System
3
+ * Parallel task execution via BullMQ workers on Redis.
4
+ */
5
+ export { SubAgentQueue } from './queue';
6
+ export { SubAgentOrchestrator, OrchestratorConfig } from './orchestrator';
7
+ export { SubAgentTask, SubAgentJobData, SubAgentJobResult, SubAgentStatus, TIER_CONCURRENCY, CheckpointWithDependencies, DependencyNode, } from './types';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subagent/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,0BAA0B,EAC1B,cAAc,GACf,MAAM,SAAS,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 3K: Sub-Agent System
4
+ * Parallel task execution via BullMQ workers on Redis.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TIER_CONCURRENCY = exports.SubAgentOrchestrator = exports.SubAgentQueue = void 0;
8
+ var queue_1 = require("./queue");
9
+ Object.defineProperty(exports, "SubAgentQueue", { enumerable: true, get: function () { return queue_1.SubAgentQueue; } });
10
+ var orchestrator_1 = require("./orchestrator");
11
+ Object.defineProperty(exports, "SubAgentOrchestrator", { enumerable: true, get: function () { return orchestrator_1.SubAgentOrchestrator; } });
12
+ var types_1 = require("./types");
13
+ Object.defineProperty(exports, "TIER_CONCURRENCY", { enumerable: true, get: function () { return types_1.TIER_CONCURRENCY; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subagent/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iCAAwC;AAA/B,sGAAA,aAAa,OAAA;AACtB,+CAA0E;AAAjE,oHAAA,oBAAoB,OAAA;AAC7B,iCAQiB;AAHf,yGAAA,gBAAgB,OAAA"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Phase 3K: Sub-Agent Orchestrator
3
+ * Coordinates sub-agent spawning, dependency resolution, and result merging.
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { SubAgentTask, CheckpointWithDependencies } from './types';
7
+ /** Decomposed task from Phase 3G checkpoint planning */
8
+ interface DecomposedStep {
9
+ description: string;
10
+ prompt: string;
11
+ dependsOn?: number[];
12
+ expectedOutput?: string;
13
+ timeout?: number;
14
+ }
15
+ export interface OrchestratorConfig {
16
+ userId: string;
17
+ projectId: string;
18
+ tier: string;
19
+ redisUrl?: string;
20
+ llmConfig: {
21
+ provider: string;
22
+ model: string;
23
+ apiKey: string;
24
+ };
25
+ projectDir: string;
26
+ facts: string[];
27
+ files: string[];
28
+ }
29
+ /**
30
+ * SubAgentOrchestrator takes decomposed checkpoints and runs them
31
+ * as parallel sub-agents with dependency tracking.
32
+ */
33
+ export declare class SubAgentOrchestrator extends EventEmitter {
34
+ private queue;
35
+ private config;
36
+ private parentTaskId;
37
+ constructor(config: OrchestratorConfig);
38
+ /**
39
+ * Initialize the orchestrator and underlying queue.
40
+ */
41
+ initialize(): Promise<void>;
42
+ /**
43
+ * Execute a set of decomposed steps as sub-agents.
44
+ * Identifies parallelizable steps and manages dependencies.
45
+ */
46
+ executeSteps(parentTaskId: string, steps: DecomposedStep[]): Promise<SubAgentTask[]>;
47
+ /**
48
+ * Analyze steps to identify which can run in parallel.
49
+ */
50
+ private analyzeParallelism;
51
+ /** Handle when a dependent task becomes ready */
52
+ private handleTaskReady;
53
+ /**
54
+ * Merge results from all sub-agents into a single summary.
55
+ */
56
+ mergeResults(): string;
57
+ /** Get dependency graph for UI visualization */
58
+ getDependencyGraph(): CheckpointWithDependencies[];
59
+ /** Get all task statuses */
60
+ getStatuses(): SubAgentTask[];
61
+ /** Cancel all running sub-agents */
62
+ cancelAll(): Promise<void>;
63
+ /** Shutdown */
64
+ shutdown(): Promise<void>;
65
+ }
66
+ export {};
67
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/subagent/orchestrator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,YAAY,EAGZ,0BAA0B,EAE3B,MAAM,SAAS,CAAC;AAEjB,wDAAwD;AACxD,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,YAAY,CAAc;gBAEtB,MAAM,EAAE,kBAAkB;IAatC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;OAGG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoC1F;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B,iDAAiD;YACnC,eAAe;IAmB7B;;OAEG;IACH,YAAY,IAAI,MAAM;IA2BtB,gDAAgD;IAChD,kBAAkB,IAAI,0BAA0B,EAAE;IAIlD,4BAA4B;IAC5B,WAAW,IAAI,YAAY,EAAE;IAI7B,oCAAoC;IAC9B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC,eAAe;IACT,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC"}