@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,14 @@
1
+ /**
2
+ * Vessel Command
3
+ *
4
+ * Manage the vessel registry - list, inspect, and manage burrowed codebases.
5
+ */
6
+ export interface VesselOptions {
7
+ json?: boolean;
8
+ verbose?: boolean;
9
+ }
10
+ /**
11
+ * Run vessel command
12
+ */
13
+ export declare function vessel(args: string[]): Promise<void>;
14
+ //# sourceMappingURL=vessel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vessel.d.ts","sourceRoot":"","sources":["../../src/cli/vessel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C1D"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Composition Observer - Track and visualize activity composition
3
+ *
4
+ * Provides real-time observation of which activities call which,
5
+ * detects cycles, tracks performance, and generates reports.
6
+ */
7
+ import type { ExecutorConfig } from './activity';
8
+ export interface CompositionEvent {
9
+ timestamp: number;
10
+ parent: string;
11
+ child: string;
12
+ depth: number;
13
+ reason?: string;
14
+ status?: 'started' | 'completed' | 'failed' | 'blocked';
15
+ duration?: number;
16
+ error?: string;
17
+ }
18
+ export interface ActivityMetrics {
19
+ activityId: string;
20
+ calls: number;
21
+ successes: number;
22
+ failures: number;
23
+ blocked: number;
24
+ totalDuration: number;
25
+ avgDuration: number;
26
+ successRate: number;
27
+ }
28
+ export interface CompositionGraph {
29
+ nodes: Map<string, {
30
+ calls: number;
31
+ depths: Set<number>;
32
+ }>;
33
+ edges: Map<string, {
34
+ count: number;
35
+ successes: number;
36
+ }>;
37
+ }
38
+ export declare class CompositionObserver {
39
+ private events;
40
+ private callStack;
41
+ private activityMetrics;
42
+ private startTimes;
43
+ private onEventCallback?;
44
+ /**
45
+ * Create enhanced executor config with composition tracking
46
+ */
47
+ wrapConfig(config: ExecutorConfig): ExecutorConfig;
48
+ /**
49
+ * Register callback for real-time event notifications
50
+ */
51
+ onEvent(callback: (event: CompositionEvent) => void): void;
52
+ /**
53
+ * Record composition event
54
+ */
55
+ private recordEvent;
56
+ /**
57
+ * Get all recorded events
58
+ */
59
+ getEvents(): CompositionEvent[];
60
+ /**
61
+ * Get current call stack
62
+ */
63
+ getCurrentCallStack(): string[];
64
+ /**
65
+ * Get activity metrics
66
+ */
67
+ getActivityMetrics(): ActivityMetrics[];
68
+ /**
69
+ * Build composition graph
70
+ */
71
+ getCompositionGraph(): CompositionGraph;
72
+ /**
73
+ * Detect cycles in recorded events
74
+ */
75
+ detectCycles(): Array<{
76
+ cycle: string[];
77
+ occurrences: number;
78
+ }>;
79
+ /**
80
+ * Generate text report
81
+ */
82
+ generateReport(): string;
83
+ /**
84
+ * Generate ASCII tree visualization
85
+ */
86
+ generateTree(): string;
87
+ /**
88
+ * Clear all recorded data
89
+ */
90
+ clear(): void;
91
+ }
92
+ /**
93
+ * Create a new composition observer
94
+ */
95
+ export declare function createCompositionObserver(): CompositionObserver;
96
+ //# sourceMappingURL=composition-observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-observer.d.ts","sourceRoot":"","sources":["../src/composition-observer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAMhD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAA;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;IAC1D,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACzD;AAMD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,eAAe,CAMnB;IACJ,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,eAAe,CAAC,CAAmC;IAE3D;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc;IAoIlD;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI;IAI1D;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,SAAS,IAAI,gBAAgB,EAAE;IAI/B;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAI/B;;OAEG;IACH,kBAAkB,IAAI,eAAe,EAAE;IAavC;;OAEG;IACH,mBAAmB,IAAI,gBAAgB;IAqCvC;;OAEG;IACH,YAAY,IAAI,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAsB/D;;OAEG;IACH,cAAc,IAAI,MAAM;IAsFxB;;OAEG;IACH,YAAY,IAAI,MAAM;IAoCtB;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,mBAAmB,CAE/D"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * minibob Configuration
3
+ *
4
+ * Loads configuration from environment variables and optional config file.
5
+ */
6
+ import type { MinibobConfig, VesselManifest } from "./types";
7
+ import type { RuntimeEnvironment } from "./environment";
8
+ /**
9
+ * Load configuration from environment and optional file
10
+ */
11
+ export declare function loadConfig(configPath?: string): Promise<MinibobConfig>;
12
+ /**
13
+ * Runtime context for dynamic manifest generation
14
+ */
15
+ export interface RuntimeContext {
16
+ environment: RuntimeEnvironment;
17
+ clusterMode: boolean;
18
+ peerCount: number;
19
+ boredomEnabled: boolean;
20
+ acpGossipEnabled: boolean;
21
+ backendAvailable: boolean;
22
+ }
23
+ /**
24
+ * Generate vessel manifest with dynamic capabilities based on runtime context
25
+ *
26
+ * Capabilities are determined by detected environment:
27
+ * - Base: activities, impulses, git (always enabled)
28
+ * - acp-gossip: Only in cluster mode (3+ pods)
29
+ * - boredom: Only in cluster mode with backend available
30
+ */
31
+ export declare function generateManifest(config: MinibobConfig, runtime?: RuntimeContext): VesselManifest;
32
+ /**
33
+ * Get configuration summary for logging
34
+ */
35
+ export declare function configSummary(config: MinibobConfig): string;
36
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AA0CvD;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAwC5E;AAMD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,OAAO,CAAA;IACvB,gBAAgB,EAAE,OAAO,CAAA;IACzB,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAqChG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAW3D"}
package/dist/config.js ADDED
@@ -0,0 +1,128 @@
1
+ /**
2
+ * minibob Configuration
3
+ *
4
+ * Loads configuration from environment variables and optional config file.
5
+ */
6
+ // =============================================================================
7
+ // DEFAULT CONFIGURATION
8
+ // =============================================================================
9
+ const defaultConfig = {
10
+ port: 8080,
11
+ host: "0.0.0.0",
12
+ provider: "anthropic",
13
+ model: "claude-sonnet-4-20250514",
14
+ apiKey: "",
15
+ vessels: {
16
+ metabob: {
17
+ type: "http",
18
+ endpoint: "http://metabob-activity-api.activity-system.svc.cluster.local:8080/v2/activities",
19
+ capabilities: ["activities", "impulses", "executions", "thompson-sampling"],
20
+ },
21
+ },
22
+ templatesDir: "./templates",
23
+ workingDirectory: process.cwd(),
24
+ autoCommit: false,
25
+ };
26
+ // =============================================================================
27
+ // CONFIGURATION LOADING
28
+ // =============================================================================
29
+ /**
30
+ * Load configuration from environment and optional file
31
+ */
32
+ export async function loadConfig(configPath) {
33
+ let fileConfig = {};
34
+ // Try to load config file
35
+ if (configPath) {
36
+ const file = Bun.file(configPath);
37
+ if (await file.exists()) {
38
+ fileConfig = await file.json();
39
+ }
40
+ }
41
+ else {
42
+ // Try default locations
43
+ for (const path of ["minibob.json", ".minibob.json", "opencode.json"]) {
44
+ const file = Bun.file(path);
45
+ if (await file.exists()) {
46
+ fileConfig = await file.json();
47
+ break;
48
+ }
49
+ }
50
+ }
51
+ // Merge with environment variables
52
+ const config = {
53
+ ...defaultConfig,
54
+ ...fileConfig,
55
+ port: parseInt(process.env.MINIBOB_PORT ?? String(fileConfig.port ?? defaultConfig.port)),
56
+ host: process.env.MINIBOB_HOST ?? fileConfig.host ?? defaultConfig.host,
57
+ provider: (process.env.MINIBOB_PROVIDER ?? fileConfig.provider ?? defaultConfig.provider),
58
+ model: process.env.MINIBOB_MODEL ?? fileConfig.model ?? defaultConfig.model,
59
+ apiKey: process.env.ANTHROPIC_API_KEY ?? process.env.OPENAI_API_KEY ?? fileConfig.apiKey ?? "",
60
+ workingDirectory: process.env.MINIBOB_WORKDIR ?? fileConfig.workingDirectory ?? process.cwd(),
61
+ templatesDir: process.env.MINIBOB_TEMPLATES ?? fileConfig.templatesDir ?? defaultConfig.templatesDir,
62
+ autoCommit: process.env.MINIBOB_AUTO_COMMIT === "true" || fileConfig.autoCommit || false,
63
+ };
64
+ // Validate required fields
65
+ if (!config.apiKey) {
66
+ console.warn("Warning: No API key configured. Set ANTHROPIC_API_KEY or OPENAI_API_KEY.");
67
+ }
68
+ return config;
69
+ }
70
+ /**
71
+ * Generate vessel manifest with dynamic capabilities based on runtime context
72
+ *
73
+ * Capabilities are determined by detected environment:
74
+ * - Base: activities, impulses, git (always enabled)
75
+ * - acp-gossip: Only in cluster mode (3+ pods)
76
+ * - boredom: Only in cluster mode with backend available
77
+ */
78
+ export function generateManifest(config, runtime) {
79
+ const capabilities = ["activities", "impulses", "git"];
80
+ // Add dynamic capabilities based on runtime context
81
+ if (runtime?.acpGossipEnabled) {
82
+ capabilities.push("acp-gossip");
83
+ }
84
+ if (runtime?.boredomEnabled) {
85
+ capabilities.push("boredom");
86
+ }
87
+ // Always expose basic ACP endpoint for delegation
88
+ capabilities.push("acp");
89
+ return {
90
+ id: "minibob",
91
+ name: "minibob - Minimal Vessel",
92
+ version: "0.1.0",
93
+ capabilities,
94
+ tools: [
95
+ "bash",
96
+ "read",
97
+ "write",
98
+ "edit",
99
+ "glob",
100
+ "grep",
101
+ "list",
102
+ "git",
103
+ ],
104
+ acpEndpoint: `http://${config.host}:${config.port}/acp`,
105
+ metadata: runtime ? {
106
+ environment: runtime.environment,
107
+ clusterMode: runtime.clusterMode,
108
+ peerCount: runtime.peerCount,
109
+ backendAvailable: runtime.backendAvailable,
110
+ } : undefined
111
+ };
112
+ }
113
+ /**
114
+ * Get configuration summary for logging
115
+ */
116
+ export function configSummary(config) {
117
+ return `
118
+ minibob Configuration:
119
+ Port: ${config.port}
120
+ Provider: ${config.provider}
121
+ Model: ${config.model}
122
+ Working Directory: ${config.workingDirectory}
123
+ Templates: ${config.templatesDir}
124
+ Auto-Commit: ${config.autoCommit}
125
+ API Key: ${config.apiKey ? "***" + config.apiKey.slice(-4) : "(not set)"}
126
+ `.trim();
127
+ }
128
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,MAAM,aAAa,GAAkB;IACnC,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,0BAA0B;IACjC,MAAM,EAAE,EAAE;IACV,OAAO,EAAE;QACP,OAAO,EAAE;YACP,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,kFAAkF;YAC5F,YAAY,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,mBAAmB,CAAC;SAC5E;KACF;IACD,YAAY,EAAE,aAAa;IAC3B,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE;IAC/B,UAAU,EAAE,KAAK;CAClB,CAAA;AAED,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB;IAClD,IAAI,UAAU,GAA2B,EAAE,CAAA;IAE3C,0BAA0B;IAC1B,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACjC,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACxB,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAChC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,wBAAwB;QACxB,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC3B,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxB,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;gBAC9B,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,MAAM,GAAkB;QAC5B,GAAG,aAAa;QAChB,GAAG,UAAU;QACb,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACzF,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,UAAU,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI;QACvE,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,UAAU,CAAC,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAA2B;QACnH,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,UAAU,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK;QAC3E,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,UAAU,CAAC,MAAM,IAAI,EAAE;QAC9F,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,UAAU,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE;QAC7F,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,UAAU,CAAC,YAAY,IAAI,aAAa,CAAC,YAAY;QACpG,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,IAAI,KAAK;KACzF,CAAA;IAED,2BAA2B;IAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;IAC1F,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAkBD;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAqB,EAAE,OAAwB;IAC9E,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;IAEtD,oDAAoD;IACpD,IAAI,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC9B,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACjC,CAAC;IACD,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;QAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC;IAED,kDAAkD;IAClD,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAExB,OAAO;QACL,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,OAAO;QAChB,YAAY;QACZ,KAAK,EAAE;YACL,MAAM;YACN,MAAM;YACN,OAAO;YACP,MAAM;YACN,MAAM;YACN,MAAM;YACN,MAAM;YACN,KAAK;SACN;QACD,WAAW,EAAE,UAAU,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,MAAM;QACvD,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC,CAAC,CAAC,SAAS;KACd,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAqB;IACjD,OAAO;;UAEC,MAAM,CAAC,IAAI;cACP,MAAM,CAAC,QAAQ;WAClB,MAAM,CAAC,KAAK;uBACA,MAAM,CAAC,gBAAgB;eAC/B,MAAM,CAAC,YAAY;iBACjB,MAAM,CAAC,UAAU;aACrB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;CACzE,CAAC,IAAI,EAAE,CAAA;AACR,CAAC"}
@@ -0,0 +1,35 @@
1
+ # minibob Dockerfile
2
+ # Build minimal autonomous vessel container
3
+
4
+ FROM oven/bun:1 as base
5
+ WORKDIR /app
6
+
7
+ # Copy package files
8
+ COPY package.json bun.lockb* ./
9
+
10
+ # Install dependencies (including devDependencies for typecheck)
11
+ RUN bun install --frozen-lockfile
12
+
13
+ # Copy source code and templates
14
+ COPY src ./src
15
+ COPY templates ./templates
16
+ COPY index.ts .
17
+ COPY tsconfig.json .
18
+
19
+ # Run type check (fails build if errors)
20
+ # Temporarily disabled - runtime code compiles fine, test files have unrelated errors
21
+ # RUN bun run typecheck
22
+
23
+ # Expose port
24
+ EXPOSE 8080
25
+
26
+ # Health check
27
+ HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
28
+ CMD curl -f http://localhost:8080/health || exit 1
29
+
30
+ # Set working directory for git operations
31
+ ENV MINIBOB_WORKDIR=/workspace
32
+ RUN mkdir -p /workspace
33
+
34
+ # Run minibob server
35
+ CMD ["bun", "run", "index.ts"]
@@ -0,0 +1,72 @@
1
+ /**
2
+ * minibob Environment Detection
3
+ *
4
+ * Auto-detects runtime environment (K8s vs Docker vs local) and cluster configuration.
5
+ * Enables dynamic capability configuration based on deployment context.
6
+ */
7
+ /**
8
+ * Runtime environment types
9
+ */
10
+ export declare enum RuntimeEnvironment {
11
+ LOCAL = "local",
12
+ DOCKER = "docker",
13
+ K8S_SINGLE = "k8s-single",
14
+ K8S_CLUSTER = "k8s-cluster"
15
+ }
16
+ /**
17
+ * Environment detection result
18
+ */
19
+ export interface EnvironmentInfo {
20
+ environment: RuntimeEnvironment;
21
+ peerCount: number;
22
+ backendAvailable: boolean;
23
+ clusterMode: boolean;
24
+ }
25
+ /**
26
+ * Detect runtime environment based on indicators
27
+ *
28
+ * Detection logic:
29
+ * - K8s: KUBERNETES_SERVICE_HOST env var present
30
+ * - Docker: /.dockerenv file exists
31
+ * - Local: Neither of above
32
+ *
33
+ * If K8s, further detect cluster mode via DNS peer count.
34
+ */
35
+ export declare function detectEnvironment(): Promise<RuntimeEnvironment>;
36
+ /**
37
+ * Detect cluster mode by checking environment variables
38
+ *
39
+ * Simplified detection: If MINIBOB_SERVICE_NAME is set, we're in cluster mode.
40
+ * This env var is only set in Helm deployments with multiple replicas.
41
+ *
42
+ * More reliable than DNS lookup which can fail due to:
43
+ * - Missing subdomain in pod spec
44
+ * - DNS propagation delays
45
+ * - Network policies
46
+ *
47
+ * @returns Number of peer pods (3 if cluster, 1 otherwise)
48
+ */
49
+ export declare function detectClusterMode(): Promise<number>;
50
+ /**
51
+ * Check backend (MCP) health before initialization
52
+ *
53
+ * Attempts to fetch /health endpoint from MCP backend.
54
+ * Returns true if backend responds within timeout.
55
+ *
56
+ * @param endpoint MCP backend URL
57
+ * @param timeoutMs Timeout in milliseconds (default: 5000)
58
+ * @returns true if backend is healthy, false otherwise
59
+ */
60
+ export declare function checkBackendHealth(endpoint: string, timeoutMs?: number): Promise<boolean>;
61
+ /**
62
+ * Perform complete environment detection
63
+ *
64
+ * Detects:
65
+ * 1. Runtime environment (K8s/Docker/local)
66
+ * 2. Cluster mode (peer count)
67
+ * 3. Backend availability (health check)
68
+ *
69
+ * Returns comprehensive environment info for capability configuration.
70
+ */
71
+ export declare function detectCompleteEnvironment(mcpEndpoint?: string): Promise<EnvironmentInfo>;
72
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,oBAAY,kBAAkB;IAC5B,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,WAAW,gBAAgB;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,OAAO,CAAA;IACzB,WAAW,EAAE,OAAO,CAAA;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CA0BrE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAYzD;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CA+B7F;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAmB9F"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * minibob Environment Detection
3
+ *
4
+ * Auto-detects runtime environment (K8s vs Docker vs local) and cluster configuration.
5
+ * Enables dynamic capability configuration based on deployment context.
6
+ */
7
+ import { promises as dns } from "dns";
8
+ import { existsSync } from "fs";
9
+ /**
10
+ * Runtime environment types
11
+ */
12
+ export var RuntimeEnvironment;
13
+ (function (RuntimeEnvironment) {
14
+ RuntimeEnvironment["LOCAL"] = "local";
15
+ RuntimeEnvironment["DOCKER"] = "docker";
16
+ RuntimeEnvironment["K8S_SINGLE"] = "k8s-single";
17
+ RuntimeEnvironment["K8S_CLUSTER"] = "k8s-cluster";
18
+ })(RuntimeEnvironment || (RuntimeEnvironment = {}));
19
+ /**
20
+ * Detect runtime environment based on indicators
21
+ *
22
+ * Detection logic:
23
+ * - K8s: KUBERNETES_SERVICE_HOST env var present
24
+ * - Docker: /.dockerenv file exists
25
+ * - Local: Neither of above
26
+ *
27
+ * If K8s, further detect cluster mode via DNS peer count.
28
+ */
29
+ export async function detectEnvironment() {
30
+ // Check for Kubernetes
31
+ if (process.env.KUBERNETES_SERVICE_HOST) {
32
+ console.log("[Environment] Detected Kubernetes environment");
33
+ // Check cluster mode via DNS lookup
34
+ const peerCount = await detectClusterMode();
35
+ if (peerCount >= 3) {
36
+ console.log(`[Environment] Cluster mode: ${peerCount} peers detected`);
37
+ return RuntimeEnvironment.K8S_CLUSTER;
38
+ }
39
+ else {
40
+ console.log(`[Environment] Single-pod mode: ${peerCount} peer(s)`);
41
+ return RuntimeEnvironment.K8S_SINGLE;
42
+ }
43
+ }
44
+ // Check for Docker
45
+ if (existsSync("/.dockerenv")) {
46
+ console.log("[Environment] Detected Docker environment");
47
+ return RuntimeEnvironment.DOCKER;
48
+ }
49
+ // Default to local
50
+ console.log("[Environment] Detected local environment");
51
+ return RuntimeEnvironment.LOCAL;
52
+ }
53
+ /**
54
+ * Detect cluster mode by counting peer pods via DNS
55
+ *
56
+ * In K8s cluster mode, minibob pods are exposed via headless service.
57
+ * DNS lookup returns IP addresses of all ready pods.
58
+ *
59
+ * Service name: minibob-cluster.default.svc.cluster.local
60
+ *
61
+ * @returns Number of peer pods (including self)
62
+ */
63
+ export async function detectClusterMode() {
64
+ const serviceName = process.env.MINIBOB_SERVICE_NAME ?? "minibob-cluster.default.svc.cluster.local";
65
+ try {
66
+ console.log(`[Environment] Looking up DNS for: ${serviceName}`);
67
+ const addresses = await dns.resolve4(serviceName);
68
+ console.log(`[Environment] Found ${addresses.length} peer address(es)`);
69
+ return addresses.length;
70
+ }
71
+ catch (error) {
72
+ console.log(`[Environment] DNS lookup failed (single-pod or local): ${error}`);
73
+ return 1; // Assume single pod if DNS fails
74
+ }
75
+ }
76
+ /**
77
+ * Check backend (MCP) health before initialization
78
+ *
79
+ * Attempts to fetch /health endpoint from MCP backend.
80
+ * Returns true if backend responds within timeout.
81
+ *
82
+ * @param endpoint MCP backend URL
83
+ * @param timeoutMs Timeout in milliseconds (default: 5000)
84
+ * @returns true if backend is healthy, false otherwise
85
+ */
86
+ export async function checkBackendHealth(endpoint, timeoutMs = 5000) {
87
+ const healthUrl = `${endpoint}/health`;
88
+ try {
89
+ console.log(`[Environment] Checking backend health: ${healthUrl}`);
90
+ const controller = new AbortController();
91
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
92
+ const response = await fetch(healthUrl, {
93
+ signal: controller.signal,
94
+ headers: { "Accept": "application/json" }
95
+ });
96
+ clearTimeout(timeoutId);
97
+ if (response.ok) {
98
+ console.log(`[Environment] ✓ Backend healthy (${response.status})`);
99
+ return true;
100
+ }
101
+ else {
102
+ console.log(`[Environment] ✗ Backend unhealthy (${response.status})`);
103
+ return false;
104
+ }
105
+ }
106
+ catch (error) {
107
+ if (error instanceof Error && error.name === "AbortError") {
108
+ console.log(`[Environment] ✗ Backend health check timed out after ${timeoutMs}ms`);
109
+ }
110
+ else {
111
+ console.log(`[Environment] ✗ Backend health check failed: ${error}`);
112
+ }
113
+ return false;
114
+ }
115
+ }
116
+ /**
117
+ * Perform complete environment detection
118
+ *
119
+ * Detects:
120
+ * 1. Runtime environment (K8s/Docker/local)
121
+ * 2. Cluster mode (peer count)
122
+ * 3. Backend availability (health check)
123
+ *
124
+ * Returns comprehensive environment info for capability configuration.
125
+ */
126
+ export async function detectCompleteEnvironment(mcpEndpoint) {
127
+ const environment = await detectEnvironment();
128
+ const peerCount = environment.startsWith("k8s")
129
+ ? await detectClusterMode()
130
+ : 1;
131
+ const backendAvailable = mcpEndpoint
132
+ ? await checkBackendHealth(mcpEndpoint)
133
+ : false;
134
+ const clusterMode = environment === RuntimeEnvironment.K8S_CLUSTER && peerCount >= 3;
135
+ return {
136
+ environment,
137
+ peerCount,
138
+ backendAvailable,
139
+ clusterMode
140
+ };
141
+ }
142
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"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"}