@calliopelabs/cli 0.4.6 → 0.6.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 (112) hide show
  1. package/README.md +258 -105
  2. package/dist/branching.d.ts +56 -0
  3. package/dist/branching.d.ts.map +1 -0
  4. package/dist/branching.js +211 -0
  5. package/dist/branching.js.map +1 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +235 -2
  8. package/dist/cli.js.map +1 -1
  9. package/dist/completion.d.ts +75 -0
  10. package/dist/completion.d.ts.map +1 -0
  11. package/dist/completion.js +234 -0
  12. package/dist/completion.js.map +1 -0
  13. package/dist/config.d.ts +36 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +90 -0
  16. package/dist/config.js.map +1 -1
  17. package/dist/diff.d.ts +73 -0
  18. package/dist/diff.d.ts.map +1 -0
  19. package/dist/diff.js +317 -0
  20. package/dist/diff.js.map +1 -0
  21. package/dist/errors.d.ts +41 -0
  22. package/dist/errors.d.ts.map +1 -0
  23. package/dist/errors.js +199 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/file-watcher.d.ts +91 -0
  26. package/dist/file-watcher.d.ts.map +1 -0
  27. package/dist/file-watcher.js +269 -0
  28. package/dist/file-watcher.js.map +1 -0
  29. package/dist/files.d.ts +49 -0
  30. package/dist/files.d.ts.map +1 -0
  31. package/dist/files.js +191 -0
  32. package/dist/files.js.map +1 -0
  33. package/dist/fuzzy-search.d.ts +75 -0
  34. package/dist/fuzzy-search.d.ts.map +1 -0
  35. package/dist/fuzzy-search.js +240 -0
  36. package/dist/fuzzy-search.js.map +1 -0
  37. package/dist/hooks.d.ts +79 -0
  38. package/dist/hooks.d.ts.map +1 -0
  39. package/dist/hooks.js +271 -0
  40. package/dist/hooks.js.map +1 -0
  41. package/dist/keyboard.d.ts +57 -0
  42. package/dist/keyboard.d.ts.map +1 -0
  43. package/dist/keyboard.js +265 -0
  44. package/dist/keyboard.js.map +1 -0
  45. package/dist/markdown.d.ts +14 -0
  46. package/dist/markdown.d.ts.map +1 -0
  47. package/dist/markdown.js +248 -0
  48. package/dist/markdown.js.map +1 -0
  49. package/dist/mcp.d.ts +90 -0
  50. package/dist/mcp.d.ts.map +1 -0
  51. package/dist/mcp.js +290 -0
  52. package/dist/mcp.js.map +1 -0
  53. package/dist/memory.d.ts +104 -0
  54. package/dist/memory.d.ts.map +1 -0
  55. package/dist/memory.js +394 -0
  56. package/dist/memory.js.map +1 -0
  57. package/dist/model-router.d.ts +67 -0
  58. package/dist/model-router.d.ts.map +1 -0
  59. package/dist/model-router.js +289 -0
  60. package/dist/model-router.js.map +1 -0
  61. package/dist/parallel-tools.d.ts +51 -0
  62. package/dist/parallel-tools.d.ts.map +1 -0
  63. package/dist/parallel-tools.js +278 -0
  64. package/dist/parallel-tools.js.map +1 -0
  65. package/dist/project-config.d.ts +84 -0
  66. package/dist/project-config.d.ts.map +1 -0
  67. package/dist/project-config.js +250 -0
  68. package/dist/project-config.js.map +1 -0
  69. package/dist/providers.d.ts +10 -2
  70. package/dist/providers.d.ts.map +1 -1
  71. package/dist/providers.js +240 -38
  72. package/dist/providers.js.map +1 -1
  73. package/dist/risk.d.ts +31 -0
  74. package/dist/risk.d.ts.map +1 -0
  75. package/dist/risk.js +367 -0
  76. package/dist/risk.js.map +1 -0
  77. package/dist/sandbox.d.ts +49 -0
  78. package/dist/sandbox.d.ts.map +1 -0
  79. package/dist/sandbox.js +347 -0
  80. package/dist/sandbox.js.map +1 -0
  81. package/dist/skills.d.ts +71 -0
  82. package/dist/skills.d.ts.map +1 -0
  83. package/dist/skills.js +383 -0
  84. package/dist/skills.js.map +1 -0
  85. package/dist/storage.d.ts +139 -0
  86. package/dist/storage.d.ts.map +1 -0
  87. package/dist/storage.js +508 -0
  88. package/dist/storage.js.map +1 -0
  89. package/dist/streaming.d.ts +94 -0
  90. package/dist/streaming.d.ts.map +1 -0
  91. package/dist/streaming.js +305 -0
  92. package/dist/streaming.js.map +1 -0
  93. package/dist/summarization.d.ts +76 -0
  94. package/dist/summarization.d.ts.map +1 -0
  95. package/dist/summarization.js +242 -0
  96. package/dist/summarization.js.map +1 -0
  97. package/dist/themes.d.ts +110 -0
  98. package/dist/themes.d.ts.map +1 -0
  99. package/dist/themes.js +329 -0
  100. package/dist/themes.js.map +1 -0
  101. package/dist/tools.d.ts.map +1 -1
  102. package/dist/tools.js +335 -1
  103. package/dist/tools.js.map +1 -1
  104. package/dist/types.d.ts +56 -1
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/types.js +105 -0
  107. package/dist/types.js.map +1 -1
  108. package/dist/ui-cli.d.ts +9 -2
  109. package/dist/ui-cli.d.ts.map +1 -1
  110. package/dist/ui-cli.js +1315 -220
  111. package/dist/ui-cli.js.map +1 -1
  112. package/package.json +1 -1
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Calliope CLI - Multi-Model Router
3
+ *
4
+ * Intelligently routes requests to different models based on task complexity.
5
+ */
6
+ // ============================================================================
7
+ // Default Model Tiers
8
+ // ============================================================================
9
+ const DEFAULT_TIERS = {
10
+ anthropic: {
11
+ fast: {
12
+ name: 'Haiku',
13
+ provider: 'anthropic',
14
+ model: 'claude-3-5-haiku-20241022',
15
+ maxTokens: 8192,
16
+ costPer1kInput: 0.00025,
17
+ costPer1kOutput: 0.00125,
18
+ },
19
+ balanced: {
20
+ name: 'Sonnet',
21
+ provider: 'anthropic',
22
+ model: 'claude-sonnet-4-20250514',
23
+ maxTokens: 8192,
24
+ costPer1kInput: 0.003,
25
+ costPer1kOutput: 0.015,
26
+ },
27
+ smart: {
28
+ name: 'Opus',
29
+ provider: 'anthropic',
30
+ model: 'claude-opus-4-20250514',
31
+ maxTokens: 8192,
32
+ costPer1kInput: 0.015,
33
+ costPer1kOutput: 0.075,
34
+ },
35
+ },
36
+ openai: {
37
+ fast: {
38
+ name: 'GPT-4o Mini',
39
+ provider: 'openai',
40
+ model: 'gpt-4o-mini',
41
+ maxTokens: 16384,
42
+ costPer1kInput: 0.00015,
43
+ costPer1kOutput: 0.0006,
44
+ },
45
+ balanced: {
46
+ name: 'GPT-4o',
47
+ provider: 'openai',
48
+ model: 'gpt-4o',
49
+ maxTokens: 16384,
50
+ costPer1kInput: 0.0025,
51
+ costPer1kOutput: 0.01,
52
+ },
53
+ smart: {
54
+ name: 'o1',
55
+ provider: 'openai',
56
+ model: 'o1',
57
+ maxTokens: 32768,
58
+ costPer1kInput: 0.015,
59
+ costPer1kOutput: 0.06,
60
+ },
61
+ },
62
+ google: {
63
+ fast: {
64
+ name: 'Flash',
65
+ provider: 'google',
66
+ model: 'gemini-2.0-flash',
67
+ maxTokens: 8192,
68
+ costPer1kInput: 0.000075,
69
+ costPer1kOutput: 0.0003,
70
+ },
71
+ balanced: {
72
+ name: 'Pro',
73
+ provider: 'google',
74
+ model: 'gemini-1.5-pro',
75
+ maxTokens: 8192,
76
+ costPer1kInput: 0.00125,
77
+ costPer1kOutput: 0.005,
78
+ },
79
+ smart: {
80
+ name: 'Pro (long)',
81
+ provider: 'google',
82
+ model: 'gemini-1.5-pro',
83
+ maxTokens: 32768,
84
+ costPer1kInput: 0.00125,
85
+ costPer1kOutput: 0.005,
86
+ },
87
+ },
88
+ // Fallback for other providers
89
+ together: {
90
+ fast: { name: 'Llama 8B', provider: 'together', model: 'meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo', maxTokens: 8192, costPer1kInput: 0.00018, costPer1kOutput: 0.00018 },
91
+ balanced: { name: 'Llama 70B', provider: 'together', model: 'meta-llama/Llama-3.3-70B-Instruct-Turbo', maxTokens: 8192, costPer1kInput: 0.00088, costPer1kOutput: 0.00088 },
92
+ smart: { name: 'Llama 405B', provider: 'together', model: 'meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo', maxTokens: 8192, costPer1kInput: 0.003, costPer1kOutput: 0.003 },
93
+ },
94
+ groq: {
95
+ fast: { name: 'Llama 8B', provider: 'groq', model: 'llama-3.1-8b-instant', maxTokens: 8192, costPer1kInput: 0.00005, costPer1kOutput: 0.00008 },
96
+ balanced: { name: 'Llama 70B', provider: 'groq', model: 'llama-3.3-70b-versatile', maxTokens: 8192, costPer1kInput: 0.00059, costPer1kOutput: 0.00079 },
97
+ smart: { name: 'Llama 70B', provider: 'groq', model: 'llama-3.3-70b-versatile', maxTokens: 32768, costPer1kInput: 0.00059, costPer1kOutput: 0.00079 },
98
+ },
99
+ openrouter: {
100
+ fast: { name: 'Haiku', provider: 'openrouter', model: 'anthropic/claude-3.5-haiku', maxTokens: 8192, costPer1kInput: 0.0008, costPer1kOutput: 0.004 },
101
+ balanced: { name: 'Sonnet', provider: 'openrouter', model: 'anthropic/claude-sonnet-4', maxTokens: 8192, costPer1kInput: 0.003, costPer1kOutput: 0.015 },
102
+ smart: { name: 'Opus', provider: 'openrouter', model: 'anthropic/claude-opus-4', maxTokens: 8192, costPer1kInput: 0.015, costPer1kOutput: 0.075 },
103
+ },
104
+ fireworks: {
105
+ fast: { name: 'Llama 8B', provider: 'fireworks', model: 'accounts/fireworks/models/llama-v3p1-8b-instruct', maxTokens: 8192, costPer1kInput: 0.0002, costPer1kOutput: 0.0002 },
106
+ balanced: { name: 'Llama 70B', provider: 'fireworks', model: 'accounts/fireworks/models/llama-v3p1-70b-instruct', maxTokens: 8192, costPer1kInput: 0.0009, costPer1kOutput: 0.0009 },
107
+ smart: { name: 'Llama 405B', provider: 'fireworks', model: 'accounts/fireworks/models/llama-v3p1-405b-instruct', maxTokens: 8192, costPer1kInput: 0.003, costPer1kOutput: 0.003 },
108
+ },
109
+ mistral: {
110
+ fast: { name: 'Mistral Small', provider: 'mistral', model: 'mistral-small-latest', maxTokens: 8192, costPer1kInput: 0.001, costPer1kOutput: 0.003 },
111
+ balanced: { name: 'Mistral Large', provider: 'mistral', model: 'mistral-large-latest', maxTokens: 8192, costPer1kInput: 0.003, costPer1kOutput: 0.009 },
112
+ smart: { name: 'Mistral Large', provider: 'mistral', model: 'mistral-large-latest', maxTokens: 32768, costPer1kInput: 0.003, costPer1kOutput: 0.009 },
113
+ },
114
+ ollama: {
115
+ fast: { name: 'Llama 8B', provider: 'ollama', model: 'llama3.1:8b', maxTokens: 8192, costPer1kInput: 0, costPer1kOutput: 0 },
116
+ balanced: { name: 'Llama 70B', provider: 'ollama', model: 'llama3.3', maxTokens: 8192, costPer1kInput: 0, costPer1kOutput: 0 },
117
+ smart: { name: 'Llama 70B', provider: 'ollama', model: 'llama3.3', maxTokens: 32768, costPer1kInput: 0, costPer1kOutput: 0 },
118
+ },
119
+ ai21: {
120
+ fast: { name: 'Jamba Mini', provider: 'ai21', model: 'jamba-1.5-mini', maxTokens: 4096, costPer1kInput: 0.0002, costPer1kOutput: 0.0004 },
121
+ balanced: { name: 'Jamba Large', provider: 'ai21', model: 'jamba-1.5-large', maxTokens: 4096, costPer1kInput: 0.002, costPer1kOutput: 0.008 },
122
+ smart: { name: 'Jamba Large', provider: 'ai21', model: 'jamba-1.5-large', maxTokens: 4096, costPer1kInput: 0.002, costPer1kOutput: 0.008 },
123
+ },
124
+ huggingface: {
125
+ fast: { name: 'Default', provider: 'huggingface', model: 'meta-llama/Llama-3.1-8B-Instruct', maxTokens: 4096, costPer1kInput: 0, costPer1kOutput: 0 },
126
+ balanced: { name: 'Default', provider: 'huggingface', model: 'meta-llama/Llama-3.1-70B-Instruct', maxTokens: 4096, costPer1kInput: 0, costPer1kOutput: 0 },
127
+ smart: { name: 'Default', provider: 'huggingface', model: 'meta-llama/Llama-3.1-70B-Instruct', maxTokens: 4096, costPer1kInput: 0, costPer1kOutput: 0 },
128
+ },
129
+ litellm: {
130
+ fast: { name: 'Default', provider: 'litellm', model: 'gpt-4o-mini', maxTokens: 8192, costPer1kInput: 0, costPer1kOutput: 0 },
131
+ balanced: { name: 'Default', provider: 'litellm', model: 'gpt-4o', maxTokens: 8192, costPer1kInput: 0, costPer1kOutput: 0 },
132
+ smart: { name: 'Default', provider: 'litellm', model: 'gpt-4o', maxTokens: 16384, costPer1kInput: 0, costPer1kOutput: 0 },
133
+ },
134
+ auto: {
135
+ fast: { name: 'Auto', provider: 'auto', model: 'auto', maxTokens: 8192, costPer1kInput: 0, costPer1kOutput: 0 },
136
+ balanced: { name: 'Auto', provider: 'auto', model: 'auto', maxTokens: 8192, costPer1kInput: 0, costPer1kOutput: 0 },
137
+ smart: { name: 'Auto', provider: 'auto', model: 'auto', maxTokens: 8192, costPer1kInput: 0, costPer1kOutput: 0 },
138
+ },
139
+ };
140
+ // ============================================================================
141
+ // Complexity Analysis
142
+ // ============================================================================
143
+ /**
144
+ * Analyze task complexity from user message
145
+ */
146
+ export function analyzeComplexity(message, context) {
147
+ const signals = [];
148
+ let score = 0;
149
+ const lower = message.toLowerCase();
150
+ const words = message.split(/\s+/).length;
151
+ // Message length signals
152
+ if (words < 10) {
153
+ signals.push('short message');
154
+ score -= 1;
155
+ }
156
+ else if (words > 100) {
157
+ signals.push('long message');
158
+ score += 2;
159
+ }
160
+ // Simple task indicators
161
+ const simplePatterns = [
162
+ /\b(what|how|explain|show|list|print|display)\b/i,
163
+ /\b(simple|quick|easy|basic|just)\b/i,
164
+ /\b(typo|fix|rename|format)\b/i,
165
+ ];
166
+ for (const pattern of simplePatterns) {
167
+ if (pattern.test(lower)) {
168
+ signals.push('simple task keywords');
169
+ score -= 1;
170
+ break;
171
+ }
172
+ }
173
+ // Complex task indicators
174
+ const complexPatterns = [
175
+ /\b(refactor|architect|design|implement|optimize|analyze)\b/i,
176
+ /\b(complex|comprehensive|thorough|detailed)\b/i,
177
+ /\b(security|performance|scalability)\b/i,
178
+ /\b(debug|investigate|diagnose)\b/i,
179
+ /\b(multiple|several|various|different)\s+(files?|components?|modules?)/i,
180
+ ];
181
+ for (const pattern of complexPatterns) {
182
+ if (pattern.test(lower)) {
183
+ signals.push('complex task keywords');
184
+ score += 2;
185
+ }
186
+ }
187
+ // Expert task indicators
188
+ const expertPatterns = [
189
+ /\b(cryptograph|concurrency|distributed|microservice)/i,
190
+ /\b(algorithm|data\s*structure|complexity)\b/i,
191
+ /\b(security\s*audit|vulnerability|exploit)\b/i,
192
+ /\b(machine\s*learning|neural|ai\s*model)\b/i,
193
+ ];
194
+ for (const pattern of expertPatterns) {
195
+ if (pattern.test(lower)) {
196
+ signals.push('expert domain keywords');
197
+ score += 3;
198
+ }
199
+ }
200
+ // Context-based adjustments
201
+ if (context) {
202
+ if (context.messageCount && context.messageCount > 10) {
203
+ signals.push('long conversation');
204
+ score += 1;
205
+ }
206
+ if (context.hasCode) {
207
+ signals.push('involves code');
208
+ score += 1;
209
+ }
210
+ if (context.fileCount && context.fileCount > 3) {
211
+ signals.push('multiple files');
212
+ score += 1;
213
+ }
214
+ if (context.toolsUsed && context.toolsUsed.length > 2) {
215
+ signals.push('multiple tools needed');
216
+ score += 1;
217
+ }
218
+ }
219
+ // Map score to complexity
220
+ let complexity;
221
+ if (score <= -1)
222
+ complexity = 'trivial';
223
+ else if (score <= 1)
224
+ complexity = 'simple';
225
+ else if (score <= 3)
226
+ complexity = 'moderate';
227
+ else if (score <= 5)
228
+ complexity = 'complex';
229
+ else
230
+ complexity = 'expert';
231
+ // Confidence based on signal count
232
+ const confidence = Math.min(0.9, 0.5 + signals.length * 0.1);
233
+ return { complexity, confidence, signals };
234
+ }
235
+ // ============================================================================
236
+ // Routing
237
+ // ============================================================================
238
+ /**
239
+ * Route request to appropriate model tier
240
+ */
241
+ export function routeRequest(message, provider, context) {
242
+ const { complexity, confidence, signals } = analyzeComplexity(message, context);
243
+ const tiers = DEFAULT_TIERS[provider] || DEFAULT_TIERS.anthropic;
244
+ let tier;
245
+ let reason;
246
+ switch (complexity) {
247
+ case 'trivial':
248
+ case 'simple':
249
+ tier = 'fast';
250
+ reason = `Simple task (${signals.join(', ')})`;
251
+ break;
252
+ case 'moderate':
253
+ tier = 'balanced';
254
+ reason = `Moderate complexity (${signals.join(', ')})`;
255
+ break;
256
+ case 'complex':
257
+ case 'expert':
258
+ tier = 'smart';
259
+ reason = `Complex task (${signals.join(', ')})`;
260
+ break;
261
+ }
262
+ return {
263
+ tier,
264
+ model: tiers[tier],
265
+ reason,
266
+ complexity,
267
+ confidence,
268
+ };
269
+ }
270
+ /**
271
+ * Get model tier for provider
272
+ */
273
+ export function getModelTier(provider, tier) {
274
+ const tiers = DEFAULT_TIERS[provider] || DEFAULT_TIERS.anthropic;
275
+ return tiers[tier];
276
+ }
277
+ /**
278
+ * Get all tiers for a provider
279
+ */
280
+ export function getAllTiers(provider) {
281
+ return DEFAULT_TIERS[provider] || DEFAULT_TIERS.anthropic;
282
+ }
283
+ /**
284
+ * Check if provider supports routing
285
+ */
286
+ export function supportsRouting(provider) {
287
+ return provider in DEFAULT_TIERS;
288
+ }
289
+ //# sourceMappingURL=model-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-router.js","sourceRoot":"","sources":["../src/model-router.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuCH,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,aAAa,GAAgD;IACjE,SAAS,EAAE;QACT,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,2BAA2B;YAClC,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,OAAO;YACvB,eAAe,EAAE,OAAO;SACzB;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,0BAA0B;YACjC,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,KAAK;SACvB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,wBAAwB;YAC/B,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,KAAK;SACvB;KACF;IACD,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,aAAa;YACpB,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,OAAO;YACvB,eAAe,EAAE,MAAM;SACxB;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,MAAM;YACtB,eAAe,EAAE,IAAI;SACtB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,IAAI;SACtB;KACF;IACD,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,kBAAkB;YACzB,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,QAAQ;YACxB,eAAe,EAAE,MAAM;SACxB;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,KAAK;YACX,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,gBAAgB;YACvB,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,OAAO;YACvB,eAAe,EAAE,KAAK;SACvB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,gBAAgB;YACvB,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,OAAO;YACvB,eAAe,EAAE,KAAK;SACvB;KACF;IACD,+BAA+B;IAC/B,QAAQ,EAAE;QACR,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,6CAA6C,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE;QAC1K,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,yCAAyC,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE;QAC3K,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,+CAA+C,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;KAC5K;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE;QAC/I,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE;QACvJ,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,yBAAyB,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE;KACtJ;IACD,UAAU,EAAE;QACV,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,4BAA4B,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE;QACrJ,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,2BAA2B,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;QACxJ,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,yBAAyB,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;KAClJ;IACD,SAAS,EAAE;QACT,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,kDAAkD,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE;QAC9K,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,mDAAmD,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE;QACpL,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,oDAAoD,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;KAClL;IACD,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;QACnJ,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;QACvJ,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;KACtJ;IACD,MAAM,EAAE;QACN,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;QAC5H,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;QAC9H,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;KAC7H;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE;QACzI,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;QAC7I,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;KAC3I;IACD,WAAW,EAAE;QACX,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,kCAAkC,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;QACrJ,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,mCAAmC,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;QAC1J,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,mCAAmC,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;KACxJ;IACD,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;QAC5H,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;QAC3H,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;KAC1H;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;QAC/G,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;QACnH,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE;KACjH;CACF,CAAC;AAEF,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,OAKlD;IACC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAE1C,yBAAyB;IACzB,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;SAAM,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,yBAAyB;IACzB,MAAM,cAAc,GAAG;QACrB,iDAAiD;QACjD,qCAAqC;QACrC,+BAA+B;KAChC,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACrC,KAAK,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,eAAe,GAAG;QACtB,6DAA6D;QAC7D,gDAAgD;QAChD,yCAAyC;QACzC,mCAAmC;QACnC,yEAAyE;KAC1E,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,cAAc,GAAG;QACrB,uDAAuD;QACvD,8CAA8C;QAC9C,+CAA+C;QAC/C,6CAA6C;KAC9C,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACvC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,GAAG,EAAE,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAClC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,UAA0B,CAAC;IAC/B,IAAI,KAAK,IAAI,CAAC,CAAC;QAAE,UAAU,GAAG,SAAS,CAAC;SACnC,IAAI,KAAK,IAAI,CAAC;QAAE,UAAU,GAAG,QAAQ,CAAC;SACtC,IAAI,KAAK,IAAI,CAAC;QAAE,UAAU,GAAG,UAAU,CAAC;SACxC,IAAI,KAAK,IAAI,CAAC;QAAE,UAAU,GAAG,SAAS,CAAC;;QACvC,UAAU,GAAG,QAAQ,CAAC;IAE3B,mCAAmC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAE7D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,QAAqB,EACrB,OAKC;IAED,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,SAAS,CAAC;IAEjE,IAAI,IAAmC,CAAC;IACxC,IAAI,MAAc,CAAC;IAEnB,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACX,IAAI,GAAG,MAAM,CAAC;YACd,MAAM,GAAG,gBAAgB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAC/C,MAAM;QACR,KAAK,UAAU;YACb,IAAI,GAAG,UAAU,CAAC;YAClB,MAAM,GAAG,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACvD,MAAM;QACR,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACX,IAAI,GAAG,OAAO,CAAC;YACf,MAAM,GAAG,iBAAiB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAChD,MAAM;IACV,CAAC;IAED,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;QAClB,MAAM;QACN,UAAU;QACV,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAqB,EACrB,IAAmC;IAEnC,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,SAAS,CAAC;IACjE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAqB;IAC/C,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAqB;IACnD,OAAO,QAAQ,IAAI,aAAa,CAAC;AACnC,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Calliope CLI - Parallel Tool Execution
3
+ *
4
+ * Execute independent tools concurrently for better performance.
5
+ */
6
+ import type { ToolCall } from './types.js';
7
+ export interface ToolDependency {
8
+ name: string;
9
+ dependsOn: string[];
10
+ outputs: string[];
11
+ }
12
+ export interface ToolResult {
13
+ toolCall: ToolCall;
14
+ result: string;
15
+ duration: number;
16
+ error?: string;
17
+ }
18
+ export interface ParallelExecutionPlan {
19
+ stages: ToolCall[][];
20
+ dependencies: Map<string, string[]>;
21
+ }
22
+ /**
23
+ * Analyze tool calls for dependencies
24
+ */
25
+ export declare function analyzeDependencies(toolCalls: ToolCall[]): ParallelExecutionPlan;
26
+ /**
27
+ * Execute tools in parallel stages
28
+ */
29
+ export declare function executeParallel(toolCalls: ToolCall[], executor: (call: ToolCall) => Promise<string>, onProgress?: (completed: number, total: number, current: ToolCall) => void): Promise<ToolResult[]>;
30
+ /**
31
+ * Execute with concurrency limit
32
+ */
33
+ export declare function executeWithLimit(toolCalls: ToolCall[], executor: (call: ToolCall) => Promise<string>, concurrencyLimit?: number, onProgress?: (completed: number, total: number) => void): Promise<ToolResult[]>;
34
+ /**
35
+ * Check if tool calls can be parallelized
36
+ */
37
+ export declare function canParallelize(toolCalls: ToolCall[]): boolean;
38
+ /**
39
+ * Get parallelization stats
40
+ */
41
+ export declare function getParallelizationStats(toolCalls: ToolCall[]): {
42
+ totalTools: number;
43
+ stages: number;
44
+ maxParallel: number;
45
+ speedupFactor: number;
46
+ };
47
+ /**
48
+ * Format execution plan for display
49
+ */
50
+ export declare function formatPlan(plan: ParallelExecutionPlan): string;
51
+ //# sourceMappingURL=parallel-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-tools.d.ts","sourceRoot":"","sources":["../src/parallel-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAsDD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,qBAAqB,CA2DhF;AAiDD;;GAEG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,EAC7C,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,KAAK,IAAI,GACzE,OAAO,CAAC,UAAU,EAAE,CAAC,CAqCvB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,EAC7C,gBAAgB,GAAE,MAAU,EAC5B,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACtD,OAAO,CAAC,UAAU,EAAE,CAAC,CAuDvB;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAO7D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,CAUA;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAkB9D"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Calliope CLI - Parallel Tool Execution
3
+ *
4
+ * Execute independent tools concurrently for better performance.
5
+ */
6
+ // ============================================================================
7
+ // Tool Dependencies
8
+ // ============================================================================
9
+ // Known tool dependencies
10
+ const TOOL_DEPENDENCIES = {
11
+ read_file: {
12
+ name: 'read_file',
13
+ dependsOn: [],
14
+ outputs: ['file_content'],
15
+ },
16
+ write_file: {
17
+ name: 'write_file',
18
+ dependsOn: ['file_content'], // Often depends on reading first
19
+ outputs: ['file_modified'],
20
+ },
21
+ shell: {
22
+ name: 'shell',
23
+ dependsOn: [], // Can depend on file changes
24
+ outputs: ['shell_output'],
25
+ },
26
+ list_files: {
27
+ name: 'list_files',
28
+ dependsOn: [],
29
+ outputs: ['file_list'],
30
+ },
31
+ think: {
32
+ name: 'think',
33
+ dependsOn: [],
34
+ outputs: ['thought'],
35
+ },
36
+ execute_code: {
37
+ name: 'execute_code',
38
+ dependsOn: [],
39
+ outputs: ['code_output'],
40
+ },
41
+ web_search: {
42
+ name: 'web_search',
43
+ dependsOn: [],
44
+ outputs: ['search_results'],
45
+ },
46
+ git: {
47
+ name: 'git',
48
+ dependsOn: ['file_modified'], // Git commands often follow file changes
49
+ outputs: ['git_output'],
50
+ },
51
+ };
52
+ // ============================================================================
53
+ // Dependency Analysis
54
+ // ============================================================================
55
+ /**
56
+ * Analyze tool calls for dependencies
57
+ */
58
+ export function analyzeDependencies(toolCalls) {
59
+ const dependencies = new Map();
60
+ const stages = [];
61
+ // Build dependency graph
62
+ for (let i = 0; i < toolCalls.length; i++) {
63
+ const call = toolCalls[i];
64
+ const deps = [];
65
+ // Check if this tool depends on outputs from previous tools
66
+ for (let j = 0; j < i; j++) {
67
+ const prevCall = toolCalls[j];
68
+ if (hasDependency(call, prevCall)) {
69
+ deps.push(prevCall.id);
70
+ }
71
+ }
72
+ dependencies.set(call.id, deps);
73
+ }
74
+ // Group into stages based on dependencies
75
+ const executed = new Set();
76
+ const remaining = new Set(toolCalls.map(c => c.id));
77
+ while (remaining.size > 0) {
78
+ const stage = [];
79
+ for (const call of toolCalls) {
80
+ if (!remaining.has(call.id))
81
+ continue;
82
+ const deps = dependencies.get(call.id) || [];
83
+ const allDepsExecuted = deps.every(d => executed.has(d));
84
+ if (allDepsExecuted) {
85
+ stage.push(call);
86
+ }
87
+ }
88
+ if (stage.length === 0) {
89
+ // Circular dependency or stuck - add remaining sequentially
90
+ for (const call of toolCalls) {
91
+ if (remaining.has(call.id)) {
92
+ stages.push([call]);
93
+ remaining.delete(call.id);
94
+ executed.add(call.id);
95
+ }
96
+ }
97
+ break;
98
+ }
99
+ stages.push(stage);
100
+ for (const call of stage) {
101
+ remaining.delete(call.id);
102
+ executed.add(call.id);
103
+ }
104
+ }
105
+ return { stages, dependencies };
106
+ }
107
+ /**
108
+ * Check if one tool call depends on another
109
+ */
110
+ function hasDependency(current, previous) {
111
+ const currentDef = TOOL_DEPENDENCIES[current.name];
112
+ const prevDef = TOOL_DEPENDENCIES[previous.name];
113
+ if (!currentDef || !prevDef) {
114
+ // Unknown tools - assume sequential dependency
115
+ return true;
116
+ }
117
+ // Check output/input matching
118
+ for (const output of prevDef.outputs) {
119
+ if (currentDef.dependsOn.includes(output)) {
120
+ return true;
121
+ }
122
+ }
123
+ // Check file path dependencies
124
+ const currentArgs = current.arguments;
125
+ const prevArgs = previous.arguments;
126
+ // If both operate on the same file, they depend on each other
127
+ if (currentArgs.path && prevArgs.path && currentArgs.path === prevArgs.path) {
128
+ return true;
129
+ }
130
+ // Write after read dependency
131
+ if (current.name === 'write_file' && previous.name === 'read_file') {
132
+ if (currentArgs.path === prevArgs.path) {
133
+ return true;
134
+ }
135
+ }
136
+ // Shell commands that might depend on file changes
137
+ if (current.name === 'shell' && previous.name === 'write_file') {
138
+ return true; // Conservative: assume shell might need the file
139
+ }
140
+ return false;
141
+ }
142
+ // ============================================================================
143
+ // Parallel Execution
144
+ // ============================================================================
145
+ /**
146
+ * Execute tools in parallel stages
147
+ */
148
+ export async function executeParallel(toolCalls, executor, onProgress) {
149
+ const plan = analyzeDependencies(toolCalls);
150
+ const results = [];
151
+ let completed = 0;
152
+ const total = toolCalls.length;
153
+ for (const stage of plan.stages) {
154
+ // Execute all tools in this stage concurrently
155
+ const stagePromises = stage.map(async (call) => {
156
+ const startTime = Date.now();
157
+ try {
158
+ onProgress?.(completed, total, call);
159
+ const result = await executor(call);
160
+ completed++;
161
+ return {
162
+ toolCall: call,
163
+ result,
164
+ duration: Date.now() - startTime,
165
+ };
166
+ }
167
+ catch (error) {
168
+ completed++;
169
+ return {
170
+ toolCall: call,
171
+ result: '',
172
+ duration: Date.now() - startTime,
173
+ error: error instanceof Error ? error.message : String(error),
174
+ };
175
+ }
176
+ });
177
+ const stageResults = await Promise.all(stagePromises);
178
+ results.push(...stageResults);
179
+ }
180
+ return results;
181
+ }
182
+ /**
183
+ * Execute with concurrency limit
184
+ */
185
+ export async function executeWithLimit(toolCalls, executor, concurrencyLimit = 5, onProgress) {
186
+ const results = [];
187
+ let completed = 0;
188
+ const total = toolCalls.length;
189
+ // Simple concurrent execution with limit
190
+ const executing = [];
191
+ const queue = [...toolCalls];
192
+ const runNext = async () => {
193
+ if (queue.length === 0)
194
+ return;
195
+ const call = queue.shift();
196
+ const startTime = Date.now();
197
+ try {
198
+ const result = await executor(call);
199
+ results.push({
200
+ toolCall: call,
201
+ result,
202
+ duration: Date.now() - startTime,
203
+ });
204
+ }
205
+ catch (error) {
206
+ results.push({
207
+ toolCall: call,
208
+ result: '',
209
+ duration: Date.now() - startTime,
210
+ error: error instanceof Error ? error.message : String(error),
211
+ });
212
+ }
213
+ completed++;
214
+ onProgress?.(completed, total);
215
+ // Start next if queue not empty
216
+ if (queue.length > 0) {
217
+ await runNext();
218
+ }
219
+ };
220
+ // Start initial batch
221
+ for (let i = 0; i < Math.min(concurrencyLimit, queue.length); i++) {
222
+ executing.push(runNext());
223
+ }
224
+ await Promise.all(executing);
225
+ // Sort results to match original order
226
+ results.sort((a, b) => {
227
+ const aIdx = toolCalls.findIndex(c => c.id === a.toolCall.id);
228
+ const bIdx = toolCalls.findIndex(c => c.id === b.toolCall.id);
229
+ return aIdx - bIdx;
230
+ });
231
+ return results;
232
+ }
233
+ // ============================================================================
234
+ // Utilities
235
+ // ============================================================================
236
+ /**
237
+ * Check if tool calls can be parallelized
238
+ */
239
+ export function canParallelize(toolCalls) {
240
+ if (toolCalls.length <= 1)
241
+ return false;
242
+ const plan = analyzeDependencies(toolCalls);
243
+ // If any stage has more than one tool, we can parallelize
244
+ return plan.stages.some(stage => stage.length > 1);
245
+ }
246
+ /**
247
+ * Get parallelization stats
248
+ */
249
+ export function getParallelizationStats(toolCalls) {
250
+ const plan = analyzeDependencies(toolCalls);
251
+ const maxParallel = Math.max(...plan.stages.map(s => s.length));
252
+ return {
253
+ totalTools: toolCalls.length,
254
+ stages: plan.stages.length,
255
+ maxParallel,
256
+ speedupFactor: toolCalls.length / plan.stages.length,
257
+ };
258
+ }
259
+ /**
260
+ * Format execution plan for display
261
+ */
262
+ export function formatPlan(plan) {
263
+ const lines = ['Execution Plan:', ''];
264
+ plan.stages.forEach((stage, i) => {
265
+ const parallel = stage.length > 1 ? ' (parallel)' : '';
266
+ lines.push(`Stage ${i + 1}${parallel}:`);
267
+ for (const call of stage) {
268
+ const args = call.arguments;
269
+ const preview = Object.entries(args)
270
+ .slice(0, 2)
271
+ .map(([k, v]) => `${k}=${String(v).slice(0, 20)}`)
272
+ .join(', ');
273
+ lines.push(` - ${call.name}(${preview})`);
274
+ }
275
+ });
276
+ return lines.join('\n');
277
+ }
278
+ //# sourceMappingURL=parallel-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-tools.js","sourceRoot":"","sources":["../src/parallel-tools.ts"],"names":[],"mappings":"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"}