@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.
- package/ARCHITECTURE.md +255 -0
- package/CHANGELOG.md +112 -0
- package/README.md +380 -0
- package/bin/minibob.js +36 -0
- package/dist/acp-gossip.d.ts +72 -0
- package/dist/acp-gossip.d.ts.map +1 -0
- package/dist/acp-gossip.js +156 -0
- package/dist/acp-gossip.js.map +1 -0
- package/dist/acp.d.ts +62 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +292 -0
- package/dist/acp.js.map +1 -0
- package/dist/activity.d.ts +157 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/activity.js +518 -0
- package/dist/activity.js.map +1 -0
- package/dist/agent-runtime.d.ts +104 -0
- package/dist/agent-runtime.d.ts.map +1 -0
- package/dist/boredom.d.ts +125 -0
- package/dist/boredom.d.ts.map +1 -0
- package/dist/boredom.js +244 -0
- package/dist/boredom.js.map +1 -0
- package/dist/cli/acp-server.d.ts +23 -0
- package/dist/cli/acp-server.d.ts.map +1 -0
- package/dist/cli/burrow.d.ts +26 -0
- package/dist/cli/burrow.d.ts.map +1 -0
- package/dist/cli/doctor.d.ts +22 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/goal.d.ts +22 -0
- package/dist/cli/goal.d.ts.map +1 -0
- package/dist/cli/index.d.ts +47 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/instance-registry.d.ts +78 -0
- package/dist/cli/instance-registry.d.ts.map +1 -0
- package/dist/cli/observe.d.ts +35 -0
- package/dist/cli/observe.d.ts.map +1 -0
- package/dist/cli/vessel.d.ts +14 -0
- package/dist/cli/vessel.d.ts.map +1 -0
- package/dist/composition-observer.d.ts +96 -0
- package/dist/composition-observer.d.ts.map +1 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +128 -0
- package/dist/config.js.map +1 -0
- package/dist/docker/Dockerfile +35 -0
- package/dist/environment.d.ts +72 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +142 -0
- package/dist/environment.js.map +1 -0
- package/dist/goal-processor.d.ts +165 -0
- package/dist/goal-processor.d.ts.map +1 -0
- package/dist/helm/minibob-cluster/Chart.yaml +13 -0
- package/dist/helm/minibob-cluster/templates/_helpers.tpl +60 -0
- package/dist/helm/minibob-cluster/templates/configmap.yaml +11 -0
- package/dist/helm/minibob-cluster/templates/deployment.yaml +108 -0
- package/dist/helm/minibob-cluster/templates/secret.yaml +10 -0
- package/dist/helm/minibob-cluster/templates/service.yaml +37 -0
- package/dist/helm/minibob-cluster/values-local.yaml +41 -0
- package/dist/helm/minibob-cluster/values-production.yaml +57 -0
- package/dist/helm/minibob-cluster/values-testing-cluster.yaml +43 -0
- package/dist/helm/minibob-cluster/values.yaml +127 -0
- package/dist/improviser.d.ts +74 -0
- package/dist/improviser.d.ts.map +1 -0
- package/dist/impulse-filter.d.ts +74 -0
- package/dist/impulse-filter.d.ts.map +1 -0
- package/dist/impulse.d.ts +92 -0
- package/dist/impulse.d.ts.map +1 -0
- package/dist/impulse.js +234 -0
- package/dist/impulse.js.map +1 -0
- package/dist/lib.d.ts +29 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +18561 -0
- package/dist/lib.js.map +98 -0
- package/dist/lifecycle-hooks.d.ts +99 -0
- package/dist/lifecycle-hooks.d.ts.map +1 -0
- package/dist/lifecycle-hooks.js +135 -0
- package/dist/lifecycle-hooks.js.map +1 -0
- package/dist/llm.d.ts +31 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +349 -0
- package/dist/llm.js.map +1 -0
- package/dist/mcp-activity-bridge.d.ts +66 -0
- package/dist/mcp-activity-bridge.d.ts.map +1 -0
- package/dist/mcp-activity-bridge.js +126 -0
- package/dist/mcp-activity-bridge.js.map +1 -0
- package/dist/mcp.d.ts +216 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +292 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory-agent.d.ts +92 -0
- package/dist/memory-agent.d.ts.map +1 -0
- package/dist/memory-agent.js +277 -0
- package/dist/memory-agent.js.map +1 -0
- package/dist/runtime-mapping.d.ts +97 -0
- package/dist/runtime-mapping.d.ts.map +1 -0
- package/dist/search-first-executor.d.ts +113 -0
- package/dist/search-first-executor.d.ts.map +1 -0
- package/dist/session.d.ts +48 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/template-extractor.d.ts +9 -0
- package/dist/template-extractor.d.ts.map +1 -0
- package/dist/template-generator.d.ts +12 -0
- package/dist/template-generator.d.ts.map +1 -0
- package/dist/tools.d.ts +58 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +771 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +503 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/understanding/analyzer.d.ts +55 -0
- package/dist/understanding/analyzer.d.ts.map +1 -0
- package/dist/understanding/explorer.d.ts +73 -0
- package/dist/understanding/explorer.d.ts.map +1 -0
- package/dist/understanding/index.d.ts +7 -0
- package/dist/understanding/index.d.ts.map +1 -0
- package/dist/understanding/types.d.ts +136 -0
- package/dist/understanding/types.d.ts.map +1 -0
- package/dist/validation.d.ts +29 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +106 -0
- package/dist/validation.js.map +1 -0
- package/dist/vessel-bootstrap.d.ts +190 -0
- package/dist/vessel-bootstrap.d.ts.map +1 -0
- package/dist/vessel-registry.d.ts +229 -0
- package/dist/vessel-registry.d.ts.map +1 -0
- package/index.ts +1329 -0
- package/package.json +54 -0
- package/src/acp-gossip.ts +193 -0
- package/src/acp.ts +362 -0
- package/src/activity.ts +1464 -0
- package/src/agent-runtime.ts +365 -0
- package/src/boredom.ts +423 -0
- package/src/cli/acp-server.ts +377 -0
- package/src/cli/burrow.ts +896 -0
- package/src/cli/doctor.ts +526 -0
- package/src/cli/goal.ts +224 -0
- package/src/cli/index.ts +147 -0
- package/src/cli/instance-registry.ts +271 -0
- package/src/cli/observe.ts +682 -0
- package/src/cli/vessel.ts +287 -0
- package/src/components/SystemOverview.tsx +331 -0
- package/src/composition-observer.ts +449 -0
- package/src/config.ts +172 -0
- package/src/environment.ts +167 -0
- package/src/goal-processor.ts +654 -0
- package/src/improviser.ts +591 -0
- package/src/impulse-filter.ts +273 -0
- package/src/impulse.ts +311 -0
- package/src/lib.ts +147 -0
- package/src/lifecycle-hooks.ts +181 -0
- package/src/llm.ts +434 -0
- package/src/mcp-activity-bridge.ts +158 -0
- package/src/mcp.ts +747 -0
- package/src/memory-agent.ts +316 -0
- package/src/runtime-mapping.ts +527 -0
- package/src/search-first-executor.ts +666 -0
- package/src/session.ts +141 -0
- package/src/template-extractor.ts +256 -0
- package/src/template-generator.ts +130 -0
- package/src/tools.ts +924 -0
- package/src/types.ts +497 -0
- package/src/understanding/analyzer.ts +354 -0
- package/src/understanding/explorer.ts +488 -0
- package/src/understanding/index.ts +27 -0
- package/src/understanding/types.ts +153 -0
- package/src/validation.ts +125 -0
- package/src/vessel-bootstrap.ts +440 -0
- package/src/vessel-registry.ts +621 -0
- package/templates/core/edit-file.json +85 -0
- package/templates/understanding/diagnose-problem.json +32 -0
- package/templates/understanding/explore-codebase-v2.json +57 -0
- 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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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":"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"}
|
|
@@ -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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"}
|