@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,167 @@
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
+ import { existsSync } from "fs"
9
+
10
+ /**
11
+ * Runtime environment types
12
+ */
13
+ export enum RuntimeEnvironment {
14
+ LOCAL = "local",
15
+ DOCKER = "docker",
16
+ K8S_SINGLE = "k8s-single",
17
+ K8S_CLUSTER = "k8s-cluster"
18
+ }
19
+
20
+ /**
21
+ * Environment detection result
22
+ */
23
+ export interface EnvironmentInfo {
24
+ environment: RuntimeEnvironment
25
+ peerCount: number
26
+ backendAvailable: boolean
27
+ clusterMode: boolean
28
+ }
29
+
30
+ /**
31
+ * Detect runtime environment based on indicators
32
+ *
33
+ * Detection logic:
34
+ * - K8s: KUBERNETES_SERVICE_HOST env var present
35
+ * - Docker: /.dockerenv file exists
36
+ * - Local: Neither of above
37
+ *
38
+ * If K8s, further detect cluster mode via DNS peer count.
39
+ */
40
+ export async function detectEnvironment(): Promise<RuntimeEnvironment> {
41
+ // Check for Kubernetes
42
+ if (process.env.KUBERNETES_SERVICE_HOST) {
43
+ console.log("[Environment] Detected Kubernetes environment")
44
+
45
+ // Check cluster mode via DNS lookup
46
+ const peerCount = await detectClusterMode()
47
+
48
+ if (peerCount >= 3) {
49
+ console.log(`[Environment] Cluster mode: ${peerCount} peers detected`)
50
+ return RuntimeEnvironment.K8S_CLUSTER
51
+ } else {
52
+ console.log(`[Environment] Single-pod mode: ${peerCount} peer(s)`)
53
+ return RuntimeEnvironment.K8S_SINGLE
54
+ }
55
+ }
56
+
57
+ // Check for Docker
58
+ if (existsSync("/.dockerenv")) {
59
+ console.log("[Environment] Detected Docker environment")
60
+ return RuntimeEnvironment.DOCKER
61
+ }
62
+
63
+ // Default to local
64
+ console.log("[Environment] Detected local environment")
65
+ return RuntimeEnvironment.LOCAL
66
+ }
67
+
68
+ /**
69
+ * Detect cluster mode by checking environment variables
70
+ *
71
+ * Simplified detection: If MINIBOB_SERVICE_NAME is set, we're in cluster mode.
72
+ * This env var is only set in Helm deployments with multiple replicas.
73
+ *
74
+ * More reliable than DNS lookup which can fail due to:
75
+ * - Missing subdomain in pod spec
76
+ * - DNS propagation delays
77
+ * - Network policies
78
+ *
79
+ * @returns Number of peer pods (3 if cluster, 1 otherwise)
80
+ */
81
+ export async function detectClusterMode(): Promise<number> {
82
+ const serviceName = process.env.MINIBOB_SERVICE_NAME
83
+
84
+ if (serviceName) {
85
+ console.log(`[Environment] Cluster mode enabled via MINIBOB_SERVICE_NAME: ${serviceName}`)
86
+ // Assume 3 pods in cluster mode (standard HA setup)
87
+ // Could enhance to query K8s API for actual count, but not worth complexity
88
+ return 3
89
+ } else {
90
+ console.log(`[Environment] Single-pod mode: MINIBOB_SERVICE_NAME not set`)
91
+ return 1
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Check backend (MCP) health before initialization
97
+ *
98
+ * Attempts to fetch /health endpoint from MCP backend.
99
+ * Returns true if backend responds within timeout.
100
+ *
101
+ * @param endpoint MCP backend URL
102
+ * @param timeoutMs Timeout in milliseconds (default: 5000)
103
+ * @returns true if backend is healthy, false otherwise
104
+ */
105
+ export async function checkBackendHealth(endpoint: string, timeoutMs = 5000): Promise<boolean> {
106
+ const healthUrl = `${endpoint}/health`
107
+
108
+ try {
109
+ console.log(`[Environment] Checking backend health: ${healthUrl}`)
110
+
111
+ const controller = new AbortController()
112
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs)
113
+
114
+ const response = await fetch(healthUrl, {
115
+ signal: controller.signal,
116
+ headers: { "Accept": "application/json" }
117
+ })
118
+
119
+ clearTimeout(timeoutId)
120
+
121
+ if (response.ok) {
122
+ console.log(`[Environment] ✓ Backend healthy (${response.status})`)
123
+ return true
124
+ } else {
125
+ console.log(`[Environment] ✗ Backend unhealthy (${response.status})`)
126
+ return false
127
+ }
128
+ } catch (error) {
129
+ if (error instanceof Error && error.name === "AbortError") {
130
+ console.log(`[Environment] ✗ Backend health check timed out after ${timeoutMs}ms`)
131
+ } else {
132
+ console.log(`[Environment] ✗ Backend health check failed: ${error}`)
133
+ }
134
+ return false
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Perform complete environment detection
140
+ *
141
+ * Detects:
142
+ * 1. Runtime environment (K8s/Docker/local)
143
+ * 2. Cluster mode (peer count)
144
+ * 3. Backend availability (health check)
145
+ *
146
+ * Returns comprehensive environment info for capability configuration.
147
+ */
148
+ export async function detectCompleteEnvironment(mcpEndpoint?: string): Promise<EnvironmentInfo> {
149
+ const environment = await detectEnvironment()
150
+
151
+ const peerCount = environment.startsWith("k8s")
152
+ ? await detectClusterMode()
153
+ : 1
154
+
155
+ const backendAvailable = mcpEndpoint
156
+ ? await checkBackendHealth(mcpEndpoint)
157
+ : false
158
+
159
+ const clusterMode = environment === RuntimeEnvironment.K8S_CLUSTER && peerCount >= 3
160
+
161
+ return {
162
+ environment,
163
+ peerCount,
164
+ backendAvailable,
165
+ clusterMode
166
+ }
167
+ }