@metabob/minibob 0.1.2

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 (174) hide show
  1. package/ARCHITECTURE.md +255 -0
  2. package/CHANGELOG.md +112 -0
  3. package/README.md +380 -0
  4. package/bin/minibob.js +36 -0
  5. package/dist/acp-gossip.d.ts +72 -0
  6. package/dist/acp-gossip.d.ts.map +1 -0
  7. package/dist/acp-gossip.js +156 -0
  8. package/dist/acp-gossip.js.map +1 -0
  9. package/dist/acp.d.ts +62 -0
  10. package/dist/acp.d.ts.map +1 -0
  11. package/dist/acp.js +292 -0
  12. package/dist/acp.js.map +1 -0
  13. package/dist/activity.d.ts +157 -0
  14. package/dist/activity.d.ts.map +1 -0
  15. package/dist/activity.js +518 -0
  16. package/dist/activity.js.map +1 -0
  17. package/dist/agent-runtime.d.ts +104 -0
  18. package/dist/agent-runtime.d.ts.map +1 -0
  19. package/dist/boredom.d.ts +125 -0
  20. package/dist/boredom.d.ts.map +1 -0
  21. package/dist/boredom.js +244 -0
  22. package/dist/boredom.js.map +1 -0
  23. package/dist/cli/acp-server.d.ts +23 -0
  24. package/dist/cli/acp-server.d.ts.map +1 -0
  25. package/dist/cli/burrow.d.ts +26 -0
  26. package/dist/cli/burrow.d.ts.map +1 -0
  27. package/dist/cli/doctor.d.ts +22 -0
  28. package/dist/cli/doctor.d.ts.map +1 -0
  29. package/dist/cli/goal.d.ts +22 -0
  30. package/dist/cli/goal.d.ts.map +1 -0
  31. package/dist/cli/index.d.ts +47 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/instance-registry.d.ts +78 -0
  34. package/dist/cli/instance-registry.d.ts.map +1 -0
  35. package/dist/cli/observe.d.ts +35 -0
  36. package/dist/cli/observe.d.ts.map +1 -0
  37. package/dist/cli/vessel.d.ts +14 -0
  38. package/dist/cli/vessel.d.ts.map +1 -0
  39. package/dist/composition-observer.d.ts +96 -0
  40. package/dist/composition-observer.d.ts.map +1 -0
  41. package/dist/config.d.ts +36 -0
  42. package/dist/config.d.ts.map +1 -0
  43. package/dist/config.js +128 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/docker/Dockerfile +35 -0
  46. package/dist/environment.d.ts +72 -0
  47. package/dist/environment.d.ts.map +1 -0
  48. package/dist/environment.js +142 -0
  49. package/dist/environment.js.map +1 -0
  50. package/dist/goal-processor.d.ts +165 -0
  51. package/dist/goal-processor.d.ts.map +1 -0
  52. package/dist/helm/minibob-cluster/Chart.yaml +13 -0
  53. package/dist/helm/minibob-cluster/templates/_helpers.tpl +60 -0
  54. package/dist/helm/minibob-cluster/templates/configmap.yaml +11 -0
  55. package/dist/helm/minibob-cluster/templates/deployment.yaml +108 -0
  56. package/dist/helm/minibob-cluster/templates/secret.yaml +10 -0
  57. package/dist/helm/minibob-cluster/templates/service.yaml +37 -0
  58. package/dist/helm/minibob-cluster/values-local.yaml +41 -0
  59. package/dist/helm/minibob-cluster/values-production.yaml +57 -0
  60. package/dist/helm/minibob-cluster/values-testing-cluster.yaml +43 -0
  61. package/dist/helm/minibob-cluster/values.yaml +127 -0
  62. package/dist/improviser.d.ts +74 -0
  63. package/dist/improviser.d.ts.map +1 -0
  64. package/dist/impulse-filter.d.ts +74 -0
  65. package/dist/impulse-filter.d.ts.map +1 -0
  66. package/dist/impulse.d.ts +92 -0
  67. package/dist/impulse.d.ts.map +1 -0
  68. package/dist/impulse.js +234 -0
  69. package/dist/impulse.js.map +1 -0
  70. package/dist/lib.d.ts +29 -0
  71. package/dist/lib.d.ts.map +1 -0
  72. package/dist/lib.js +18561 -0
  73. package/dist/lib.js.map +98 -0
  74. package/dist/lifecycle-hooks.d.ts +99 -0
  75. package/dist/lifecycle-hooks.d.ts.map +1 -0
  76. package/dist/lifecycle-hooks.js +135 -0
  77. package/dist/lifecycle-hooks.js.map +1 -0
  78. package/dist/llm.d.ts +31 -0
  79. package/dist/llm.d.ts.map +1 -0
  80. package/dist/llm.js +349 -0
  81. package/dist/llm.js.map +1 -0
  82. package/dist/mcp-activity-bridge.d.ts +66 -0
  83. package/dist/mcp-activity-bridge.d.ts.map +1 -0
  84. package/dist/mcp-activity-bridge.js +126 -0
  85. package/dist/mcp-activity-bridge.js.map +1 -0
  86. package/dist/mcp.d.ts +216 -0
  87. package/dist/mcp.d.ts.map +1 -0
  88. package/dist/mcp.js +292 -0
  89. package/dist/mcp.js.map +1 -0
  90. package/dist/memory-agent.d.ts +92 -0
  91. package/dist/memory-agent.d.ts.map +1 -0
  92. package/dist/memory-agent.js +277 -0
  93. package/dist/memory-agent.js.map +1 -0
  94. package/dist/runtime-mapping.d.ts +97 -0
  95. package/dist/runtime-mapping.d.ts.map +1 -0
  96. package/dist/search-first-executor.d.ts +113 -0
  97. package/dist/search-first-executor.d.ts.map +1 -0
  98. package/dist/session.d.ts +48 -0
  99. package/dist/session.d.ts.map +1 -0
  100. package/dist/template-extractor.d.ts +9 -0
  101. package/dist/template-extractor.d.ts.map +1 -0
  102. package/dist/template-generator.d.ts +12 -0
  103. package/dist/template-generator.d.ts.map +1 -0
  104. package/dist/tools.d.ts +58 -0
  105. package/dist/tools.d.ts.map +1 -0
  106. package/dist/tools.js +771 -0
  107. package/dist/tools.js.map +1 -0
  108. package/dist/types.d.ts +503 -0
  109. package/dist/types.d.ts.map +1 -0
  110. package/dist/types.js +8 -0
  111. package/dist/types.js.map +1 -0
  112. package/dist/understanding/analyzer.d.ts +55 -0
  113. package/dist/understanding/analyzer.d.ts.map +1 -0
  114. package/dist/understanding/explorer.d.ts +73 -0
  115. package/dist/understanding/explorer.d.ts.map +1 -0
  116. package/dist/understanding/index.d.ts +7 -0
  117. package/dist/understanding/index.d.ts.map +1 -0
  118. package/dist/understanding/types.d.ts +136 -0
  119. package/dist/understanding/types.d.ts.map +1 -0
  120. package/dist/validation.d.ts +29 -0
  121. package/dist/validation.d.ts.map +1 -0
  122. package/dist/validation.js +106 -0
  123. package/dist/validation.js.map +1 -0
  124. package/dist/vessel-bootstrap.d.ts +190 -0
  125. package/dist/vessel-bootstrap.d.ts.map +1 -0
  126. package/dist/vessel-registry.d.ts +229 -0
  127. package/dist/vessel-registry.d.ts.map +1 -0
  128. package/index.ts +1329 -0
  129. package/package.json +54 -0
  130. package/src/acp-gossip.ts +193 -0
  131. package/src/acp.ts +362 -0
  132. package/src/activity.ts +1464 -0
  133. package/src/agent-runtime.ts +365 -0
  134. package/src/boredom.ts +423 -0
  135. package/src/cli/acp-server.ts +377 -0
  136. package/src/cli/burrow.ts +896 -0
  137. package/src/cli/doctor.ts +526 -0
  138. package/src/cli/goal.ts +224 -0
  139. package/src/cli/index.ts +147 -0
  140. package/src/cli/instance-registry.ts +271 -0
  141. package/src/cli/observe.ts +682 -0
  142. package/src/cli/vessel.ts +287 -0
  143. package/src/components/SystemOverview.tsx +331 -0
  144. package/src/composition-observer.ts +449 -0
  145. package/src/config.ts +172 -0
  146. package/src/environment.ts +167 -0
  147. package/src/goal-processor.ts +654 -0
  148. package/src/improviser.ts +591 -0
  149. package/src/impulse-filter.ts +273 -0
  150. package/src/impulse.ts +311 -0
  151. package/src/lib.ts +147 -0
  152. package/src/lifecycle-hooks.ts +181 -0
  153. package/src/llm.ts +434 -0
  154. package/src/mcp-activity-bridge.ts +158 -0
  155. package/src/mcp.ts +747 -0
  156. package/src/memory-agent.ts +316 -0
  157. package/src/runtime-mapping.ts +527 -0
  158. package/src/search-first-executor.ts +666 -0
  159. package/src/session.ts +141 -0
  160. package/src/template-extractor.ts +256 -0
  161. package/src/template-generator.ts +130 -0
  162. package/src/tools.ts +924 -0
  163. package/src/types.ts +497 -0
  164. package/src/understanding/analyzer.ts +354 -0
  165. package/src/understanding/explorer.ts +488 -0
  166. package/src/understanding/index.ts +27 -0
  167. package/src/understanding/types.ts +153 -0
  168. package/src/validation.ts +125 -0
  169. package/src/vessel-bootstrap.ts +440 -0
  170. package/src/vessel-registry.ts +621 -0
  171. package/templates/core/edit-file.json +85 -0
  172. package/templates/understanding/diagnose-problem.json +32 -0
  173. package/templates/understanding/explore-codebase-v2.json +57 -0
  174. package/templates/understanding/explore-codebase.json +37 -0
@@ -0,0 +1,518 @@
1
+ /**
2
+ * minibob Activity Executor
3
+ *
4
+ * Executes activity templates with impulse injection and tool calling.
5
+ */
6
+ import { createLLMClient } from "./llm";
7
+ import { createToolHandlers, getAllToolDefinitions } from "./tools";
8
+ import { createImpulse, loadImpulses, formatImpulsesForContext, storeActivityOutput, getImpulseStore, } from "./impulse";
9
+ import { getMCPClient, isMCPEnabled } from "./mcp";
10
+ /**
11
+ * Activity executor for running activity templates
12
+ */
13
+ export class ActivityExecutor {
14
+ llm;
15
+ toolHandlers;
16
+ config;
17
+ customToolDefinitions;
18
+ constructor(config) {
19
+ this.config = config;
20
+ this.llm = createLLMClient(config.provider, config.apiKey);
21
+ // Collect custom tool definitions for passing to getAllToolDefinitions later
22
+ this.customToolDefinitions = Object.values(config.customTools ?? {}).map(({ definition }) => definition);
23
+ this.toolHandlers = createToolHandlers({
24
+ workingDirectory: config.workingDirectory,
25
+ onActivityExecute: async (templateId, variables, reason) => {
26
+ // Nested activity execution
27
+ const template = await loadTemplateFromMCPOrLocal(templateId);
28
+ const nestedExecutor = new ActivityExecutor(config);
29
+ return nestedExecutor.execute({ template, variables, reason });
30
+ },
31
+ onSearchActivities: config.onSearchActivities, // Wire activity search callback
32
+ onCreateActivity: config.onCreateActivity, // Wire activity creation callback
33
+ onImpulseCreate: (impulse) => {
34
+ // Create impulse
35
+ createImpulse({
36
+ id: impulse.id,
37
+ pointer: impulse.type === "memo" && impulse.content
38
+ ? { type: "memo", content: impulse.content }
39
+ : impulse.type === "file" && impulse.content
40
+ ? { type: "file", path: impulse.content }
41
+ : { type: "custom", resolver: impulse.type, data: {} },
42
+ budget: impulse.budget,
43
+ priority: impulse.priority,
44
+ });
45
+ },
46
+ customTools: config.customTools,
47
+ });
48
+ }
49
+ /**
50
+ * Execute an activity template
51
+ */
52
+ async execute(options) {
53
+ const { template, variables, reason, onTaskStart, onTaskComplete } = options;
54
+ const activityId = `act_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
55
+ const execution = {
56
+ id: activityId,
57
+ templateId: template.id,
58
+ status: "executing",
59
+ variables,
60
+ impulses: [],
61
+ taskResults: [],
62
+ startedAt: Date.now(),
63
+ };
64
+ console.log(`[Activity] Starting: ${template.name} (${activityId})`);
65
+ if (reason) {
66
+ console.log(`[Activity] Reason: ${reason}`);
67
+ }
68
+ // Register template to backend if MCP is enabled (ensure variant tracking)
69
+ if (isMCPEnabled()) {
70
+ const mcp = getMCPClient();
71
+ if (mcp) {
72
+ console.log(`[Activity] Registering template variant: ${template.id}`);
73
+ await mcp.registerTemplate(template);
74
+ }
75
+ }
76
+ try {
77
+ // Step 1: Create impulses from context requirements
78
+ const impulses = await this.createImpulsesFromRequirements(activityId, template, variables);
79
+ execution.impulses = impulses;
80
+ // Step 2: Sort tasks by dependencies
81
+ const sortedTasks = this.topologicalSort(template.tasks);
82
+ // Step 3: Execute tasks in order
83
+ let totalInputTokens = 0;
84
+ let totalOutputTokens = 0;
85
+ for (const task of sortedTasks) {
86
+ onTaskStart?.(task.id);
87
+ console.log(`[Task] Executing: ${task.id} - ${task.description}`);
88
+ const result = await this.executeTask(activityId, task, variables, impulses);
89
+ execution.taskResults.push(result);
90
+ if (result.tokens) {
91
+ totalInputTokens += result.tokens.input;
92
+ totalOutputTokens += result.tokens.output;
93
+ }
94
+ onTaskComplete?.(task.id, result);
95
+ if (result.status === "failed") {
96
+ console.error(`[Task] Failed: ${task.id} - ${result.error}`);
97
+ // Check retry policy
98
+ if (task.retry && task.retry.maxAttempts > 1) {
99
+ let retryCount = 1;
100
+ while (retryCount < task.retry.maxAttempts && result.status === "failed") {
101
+ console.log(`[Task] Retrying ${task.id} (attempt ${retryCount + 1}/${task.retry.maxAttempts})`);
102
+ const retryResult = await this.executeTask(activityId, task, variables, impulses, result.error);
103
+ execution.taskResults[execution.taskResults.length - 1] = retryResult;
104
+ if (retryResult.tokens) {
105
+ totalInputTokens += retryResult.tokens.input;
106
+ totalOutputTokens += retryResult.tokens.output;
107
+ }
108
+ if (retryResult.status === "completed")
109
+ break;
110
+ retryCount++;
111
+ }
112
+ }
113
+ // If still failed after retries, abort
114
+ if (execution.taskResults[execution.taskResults.length - 1]?.status === "failed") {
115
+ execution.status = "failed";
116
+ break;
117
+ }
118
+ }
119
+ }
120
+ // Step 4: Complete execution
121
+ execution.completedAt = Date.now();
122
+ if (execution.status !== "failed") {
123
+ execution.status = "completed";
124
+ }
125
+ execution.metrics = {
126
+ duration: execution.completedAt - execution.startedAt,
127
+ cost: this.estimateCost(totalInputTokens, totalOutputTokens),
128
+ totalTokens: { input: totalInputTokens, output: totalOutputTokens },
129
+ };
130
+ console.log(`[Activity] Completed: ${execution.status} in ${execution.metrics.duration}ms`);
131
+ // Report execution to MCP backend if enabled
132
+ if (isMCPEnabled()) {
133
+ const mcp = getMCPClient();
134
+ if (mcp) {
135
+ console.log(`[Activity] Reporting execution to MCP backend...`);
136
+ const reported = await mcp.reportExecution(execution);
137
+ if (reported) {
138
+ console.log(`[Activity] ✓ Execution reported to backend`);
139
+ }
140
+ else {
141
+ console.warn(`[Activity] ⚠ Failed to report execution to backend`);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ catch (error) {
147
+ execution.status = "failed";
148
+ execution.completedAt = Date.now();
149
+ console.error(`[Activity] Error:`, error);
150
+ // Still try to report failure to backend
151
+ if (isMCPEnabled()) {
152
+ const mcp = getMCPClient();
153
+ if (mcp) {
154
+ await mcp.reportExecution(execution).catch(() => {
155
+ // Ignore reporting errors on failure
156
+ });
157
+ }
158
+ }
159
+ }
160
+ return execution;
161
+ }
162
+ /**
163
+ * Create impulses from template context requirements
164
+ */
165
+ async createImpulsesFromRequirements(activityId, template, variables) {
166
+ const impulses = [];
167
+ if (!template.contextRequirements) {
168
+ return impulses;
169
+ }
170
+ for (const req of template.contextRequirements) {
171
+ // Interpolate source with variables
172
+ const source = this.interpolate(req.source, variables);
173
+ let impulse;
174
+ switch (req.type) {
175
+ case "file":
176
+ impulse = createImpulse({
177
+ id: req.id,
178
+ pointer: { type: "file", path: source },
179
+ budget: req.budget,
180
+ priority: req.priority,
181
+ });
182
+ break;
183
+ case "glob":
184
+ // Resolve glob to files and create impulses for each
185
+ // For simplicity, create a single impulse that will list files
186
+ impulse = createImpulse({
187
+ id: req.id,
188
+ pointer: {
189
+ type: "custom",
190
+ resolver: "glob",
191
+ data: { pattern: source, cwd: this.config.workingDirectory },
192
+ },
193
+ budget: req.budget,
194
+ priority: req.priority,
195
+ });
196
+ break;
197
+ case "memo":
198
+ impulse = createImpulse({
199
+ id: req.id,
200
+ pointer: { type: "memo", content: source },
201
+ budget: req.budget,
202
+ priority: req.priority,
203
+ });
204
+ break;
205
+ default:
206
+ impulse = createImpulse({
207
+ id: req.id,
208
+ pointer: {
209
+ type: "custom",
210
+ resolver: req.type,
211
+ data: { source },
212
+ },
213
+ budget: req.budget,
214
+ priority: req.priority,
215
+ });
216
+ }
217
+ impulses.push(impulse);
218
+ }
219
+ // Register glob resolver if not already registered
220
+ getImpulseStore().registerResolver("glob", async (data) => {
221
+ const pattern = data.pattern;
222
+ const cwd = data.cwd ?? this.config.workingDirectory;
223
+ const glob = new Bun.Glob(pattern);
224
+ const files = [];
225
+ for await (const file of glob.scan({ cwd })) {
226
+ files.push(file);
227
+ if (files.length >= 50)
228
+ break;
229
+ }
230
+ return files.join("\n");
231
+ });
232
+ return impulses;
233
+ }
234
+ /**
235
+ * Execute a single task
236
+ */
237
+ async executeTask(activityId, task, variables, impulses, lastError) {
238
+ const startedAt = Date.now();
239
+ try {
240
+ // Load required impulses
241
+ const taskImpulseIds = task.impulseReferences ?? impulses.map((i) => i.id);
242
+ const loadedImpulses = await loadImpulses(taskImpulseIds);
243
+ // Build prompt
244
+ let prompt = this.interpolate(task.prompt.template, variables);
245
+ // Add impulse context
246
+ const impulseContext = formatImpulsesForContext(loadedImpulses);
247
+ if (impulseContext) {
248
+ prompt = `${impulseContext}\n\n${prompt}`;
249
+ }
250
+ // Add error context if retrying
251
+ if (lastError) {
252
+ prompt = `Previous attempt failed with error:\n${lastError}\n\nPlease try again, addressing the error.\n\n${prompt}`;
253
+ }
254
+ // Build messages
255
+ const messages = [
256
+ {
257
+ role: "system",
258
+ content: this.config.systemPrompt ?? this.getDefaultSystemPrompt(),
259
+ },
260
+ {
261
+ role: "user",
262
+ content: prompt,
263
+ },
264
+ ];
265
+ // Execute with tool calling
266
+ const result = await this.llm.completeWithTools({
267
+ model: this.config.model,
268
+ messages,
269
+ tools: getAllToolDefinitions(this.customToolDefinitions),
270
+ maxTokens: task.prompt.maxTokens ?? 4096,
271
+ }, this.toolHandlers);
272
+ // Store output for potential downstream tasks
273
+ storeActivityOutput(activityId, task.id, result.content);
274
+ // Run validation if specified
275
+ if (task.validation) {
276
+ const validationResult = await this.runValidation(task.validation);
277
+ if (!validationResult.success) {
278
+ return {
279
+ taskId: task.id,
280
+ status: "failed",
281
+ output: result.content,
282
+ error: `Validation failed: ${validationResult.error}`,
283
+ startedAt,
284
+ completedAt: Date.now(),
285
+ tokens: { input: result.usage.inputTokens, output: result.usage.outputTokens },
286
+ };
287
+ }
288
+ }
289
+ return {
290
+ taskId: task.id,
291
+ status: "completed",
292
+ output: result.content,
293
+ startedAt,
294
+ completedAt: Date.now(),
295
+ tokens: { input: result.usage.inputTokens, output: result.usage.outputTokens },
296
+ };
297
+ }
298
+ catch (error) {
299
+ return {
300
+ taskId: task.id,
301
+ status: "failed",
302
+ error: error instanceof Error ? error.message : String(error),
303
+ startedAt,
304
+ completedAt: Date.now(),
305
+ };
306
+ }
307
+ }
308
+ /**
309
+ * Run validation checks
310
+ */
311
+ async runValidation(validation) {
312
+ if (!validation)
313
+ return { success: true };
314
+ // Check required files exist
315
+ if (validation.requiredFiles) {
316
+ for (const filePath of validation.requiredFiles) {
317
+ const file = Bun.file(filePath);
318
+ if (!(await file.exists())) {
319
+ return { success: false, error: `Required file missing: ${filePath}` };
320
+ }
321
+ }
322
+ }
323
+ // Check required patterns
324
+ if (validation.requiredPatterns) {
325
+ for (const { file: filePath, pattern } of validation.requiredPatterns) {
326
+ const file = Bun.file(filePath);
327
+ if (!(await file.exists())) {
328
+ return { success: false, error: `File missing for pattern check: ${filePath}` };
329
+ }
330
+ const content = await file.text();
331
+ const regex = new RegExp(pattern);
332
+ if (!regex.test(content)) {
333
+ return { success: false, error: `Pattern not found in ${filePath}: ${pattern}` };
334
+ }
335
+ }
336
+ }
337
+ // Check forbidden patterns
338
+ if (validation.forbiddenPatterns) {
339
+ for (const { file: filePath, pattern } of validation.forbiddenPatterns) {
340
+ const file = Bun.file(filePath);
341
+ if (await file.exists()) {
342
+ const content = await file.text();
343
+ const regex = new RegExp(pattern);
344
+ if (regex.test(content)) {
345
+ return { success: false, error: `Forbidden pattern found in ${filePath}: ${pattern}` };
346
+ }
347
+ }
348
+ }
349
+ }
350
+ // Run validation commands
351
+ if (validation.commands) {
352
+ for (const { command, expectedOutput } of validation.commands) {
353
+ const bashHandler = this.toolHandlers.bash;
354
+ if (!bashHandler) {
355
+ return { success: false, error: "bash tool handler not available" };
356
+ }
357
+ const result = await bashHandler({ command });
358
+ if (!result.success) {
359
+ return { success: false, error: `Validation command failed: ${command}` };
360
+ }
361
+ if (expectedOutput && !result.output?.includes(expectedOutput)) {
362
+ return { success: false, error: `Unexpected output from: ${command}` };
363
+ }
364
+ }
365
+ }
366
+ return { success: true };
367
+ }
368
+ /**
369
+ * Topological sort for task dependencies
370
+ */
371
+ topologicalSort(tasks) {
372
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
373
+ const visited = new Set();
374
+ const result = [];
375
+ const visit = (taskId) => {
376
+ if (visited.has(taskId))
377
+ return;
378
+ visited.add(taskId);
379
+ const task = taskMap.get(taskId);
380
+ if (!task)
381
+ return;
382
+ for (const depId of task.dependencies ?? []) {
383
+ visit(depId);
384
+ }
385
+ result.push(task);
386
+ };
387
+ for (const task of tasks) {
388
+ visit(task.id);
389
+ }
390
+ return result;
391
+ }
392
+ /**
393
+ * Interpolate variables into template string
394
+ */
395
+ interpolate(template, variables) {
396
+ return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
397
+ const value = variables[key];
398
+ if (value === undefined)
399
+ return `{{${key}}}`;
400
+ if (typeof value === "object")
401
+ return JSON.stringify(value, null, 2);
402
+ return String(value);
403
+ });
404
+ }
405
+ /**
406
+ * Estimate cost based on token usage
407
+ */
408
+ estimateCost(inputTokens, outputTokens) {
409
+ // Approximate costs for Claude 3.5 Sonnet
410
+ const inputCostPerMillion = 3.0;
411
+ const outputCostPerMillion = 15.0;
412
+ return ((inputTokens / 1_000_000) * inputCostPerMillion +
413
+ (outputTokens / 1_000_000) * outputCostPerMillion);
414
+ }
415
+ /**
416
+ * Get default system prompt
417
+ *
418
+ * ARCHITECTURE: Enforces activity-first constraint per corrected trailblazing architecture.
419
+ * MiniBob must search for existing activities and create new ones for non-trivial tasks.
420
+ */
421
+ getDefaultSystemPrompt() {
422
+ return `You are minibob, an autonomous vessel that creates and composes activities instead of using direct tool calls.
423
+
424
+ **CORE PRINCIPLE**: You learn by creating reusable activities, not by executing one-off tool calls.
425
+
426
+ **CONSTRAINTS - ACTIVITY-FIRST APPROACH**:
427
+
428
+ For NON-TRIVIAL tasks (anything beyond simple reads/status checks):
429
+ 1. search_activities() to find existing templates
430
+ 2. If match found: Execute the activity
431
+ 3. If no match: create_activity_goal_seeking() to create new template
432
+ 4. Record your reasoning for the choice
433
+
434
+ For TRIVIAL tasks (simple operations that don't benefit from templating):
435
+ - Simple file reads (read a single file to check content)
436
+ - Basic git status checks (git status, git diff)
437
+ - Simple list operations (ls, find single file)
438
+ ✅ Direct tool use allowed
439
+
440
+ **EXAMPLES**:
441
+
442
+ Non-Trivial (MUST use activities):
443
+ ❌ "Fix all TypeScript errors" → search_activities → create if no match
444
+ ❌ "Add authentication" → search_activities → create if no match
445
+ ❌ "Refactor component" → search_activities → create if no match
446
+ ❌ "Deploy to production" → search_activities → create if no match
447
+
448
+ Trivial (Direct tools OK):
449
+ ✅ "Read src/index.ts to see imports" → read tool
450
+ ✅ "Check git status" → bash git status
451
+ ✅ "List files in src/" → bash ls src/
452
+
453
+ **WORKFLOW**:
454
+ 1. Analyze task complexity
455
+ 2. If non-trivial: search_activities() first
456
+ - Found match? Execute it
457
+ - No match? create_activity_goal_seeking()
458
+ 3. If trivial: Use direct tools (read, bash, git)
459
+ 4. Always explain your reasoning
460
+
461
+ **GUIDELINES**:
462
+ - Prefer activity composition over direct execution
463
+ - Create reusable templates from complex workflows
464
+ - Search before creating (avoid duplicate activities)
465
+ - Report activity execution results clearly
466
+ - When stuck, ask specific targeted questions
467
+
468
+ Be autonomous, learn from execution, and build reusable knowledge.`;
469
+ }
470
+ }
471
+ /**
472
+ * Load an activity template from a JSON file
473
+ */
474
+ export async function loadTemplate(path) {
475
+ const file = Bun.file(path);
476
+ if (!(await file.exists())) {
477
+ throw new Error(`Template not found: ${path}`);
478
+ }
479
+ const content = await file.json();
480
+ return content;
481
+ }
482
+ /**
483
+ * Load activity template from MCP backend or local file
484
+ *
485
+ * If templateIdOrPath looks like a file path (contains / or .json), load from file.
486
+ * Otherwise, try to load from MCP backend first, then fall back to local templates/ directory.
487
+ */
488
+ export async function loadTemplateFromMCPOrLocal(templateIdOrPath) {
489
+ // Check if it's a file path
490
+ if (templateIdOrPath.includes("/") || templateIdOrPath.endsWith(".json")) {
491
+ return loadTemplate(templateIdOrPath);
492
+ }
493
+ // Try MCP first if enabled
494
+ if (isMCPEnabled()) {
495
+ const mcp = getMCPClient();
496
+ if (mcp) {
497
+ console.log(`[Activity] Fetching template "${templateIdOrPath}" from MCP backend...`);
498
+ const template = await mcp.getActivityTemplate(templateIdOrPath);
499
+ if (template) {
500
+ console.log(`[Activity] ✓ Template loaded from MCP backend`);
501
+ return template;
502
+ }
503
+ console.log(`[Activity] Template not found in MCP, trying local...`);
504
+ }
505
+ }
506
+ // Fall back to local templates directory
507
+ const localPath = `templates/${templateIdOrPath}.json`;
508
+ return loadTemplate(localPath);
509
+ }
510
+ /**
511
+ * Create executor and run activity
512
+ */
513
+ export async function runActivity(config, templatePath, variables, reason) {
514
+ const template = await loadTemplate(templatePath);
515
+ const executor = new ActivityExecutor(config);
516
+ return executor.execute({ template, variables, reason });
517
+ }
518
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Agent Runtime - Reusable backend integration for CLI and server modes
3
+ *
4
+ * Provides:
5
+ * - Backend registration/deregistration
6
+ * - Heartbeat reporting
7
+ * - Execution metrics tracking
8
+ * - Graceful shutdown
9
+ *
10
+ * Usage:
11
+ * const runtime = await AgentRuntime.initialize(config)
12
+ * // ... do work ...
13
+ * await runtime.reportExecution(execution)
14
+ * await runtime.shutdown()
15
+ */
16
+ import type { MinibobConfig, ActivityExecution } from "./types";
17
+ import type { MCPClient } from "./mcp";
18
+ export interface AgentRuntimeConfig {
19
+ config: MinibobConfig;
20
+ mode: "cli" | "server";
21
+ instanceId?: string;
22
+ enableHeartbeat?: boolean;
23
+ heartbeatInterval?: number;
24
+ }
25
+ export interface AgentMetrics {
26
+ executionsCompleted: number;
27
+ executionsFailed: number;
28
+ totalCost: number;
29
+ totalTokens: {
30
+ input: number;
31
+ output: number;
32
+ };
33
+ uptime: number;
34
+ }
35
+ export interface CurrentActivity {
36
+ id: string;
37
+ name?: string;
38
+ task?: string;
39
+ startedAt: number;
40
+ }
41
+ export declare class AgentRuntime {
42
+ private config;
43
+ private mode;
44
+ private instanceId;
45
+ private startTime;
46
+ private mcp;
47
+ private manifest;
48
+ private heartbeatInterval;
49
+ private heartbeatIntervalMs;
50
+ private enableHeartbeat;
51
+ private metrics;
52
+ private currentActivity;
53
+ private shuttingDown;
54
+ private constructor();
55
+ /**
56
+ * Initialize agent runtime with backend connection
57
+ */
58
+ static initialize(options: AgentRuntimeConfig): Promise<AgentRuntime>;
59
+ /**
60
+ * Start heartbeat reporting
61
+ */
62
+ private startHeartbeat;
63
+ /**
64
+ * Mark start of activity execution
65
+ */
66
+ setCurrentActivity(activity: CurrentActivity): void;
67
+ /**
68
+ * Clear current activity
69
+ */
70
+ clearCurrentActivity(): void;
71
+ /**
72
+ * Report execution to backend
73
+ */
74
+ reportExecution(execution: ActivityExecution): Promise<void>;
75
+ /**
76
+ * Get current metrics
77
+ */
78
+ getMetrics(): AgentMetrics;
79
+ /**
80
+ * Get instance ID
81
+ */
82
+ getInstanceId(): string;
83
+ /**
84
+ * Check if backend is available
85
+ */
86
+ hasBackend(): boolean;
87
+ /**
88
+ * Get MCP client (if available)
89
+ */
90
+ getMCP(): MCPClient | null;
91
+ /**
92
+ * Setup graceful shutdown handlers
93
+ */
94
+ private setupShutdownHandlers;
95
+ /**
96
+ * Shutdown runtime and cleanup
97
+ */
98
+ shutdown(): Promise<void>;
99
+ /**
100
+ * Generate unique instance ID
101
+ */
102
+ private generateInstanceId;
103
+ }
104
+ //# sourceMappingURL=agent-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAkB,MAAM,SAAS,CAAA;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAStC,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,aAAa,CAAA;IACrB,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,GAAG,CAAyB;IACpC,OAAO,CAAC,QAAQ,CAA8B;IAE9C,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,mBAAmB,CAAQ;IACnC,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,OAAO,CAMd;IAED,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO;IASP;;OAEG;WACU,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAmE3E;;OAEG;IACH,OAAO,CAAC,cAAc;IAgDtB;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAInD;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAI5B;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBlE;;OAEG;IACH,UAAU,IAAI,YAAY;IAO1B;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,MAAM,IAAI,SAAS,GAAG,IAAI;IAI1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAM3B"}