@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,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LifecycleHooks - Execution lifecycle management for activities
|
|
3
|
+
*
|
|
4
|
+
* Moved from metabob-opencode to minibob as part of library integration.
|
|
5
|
+
* Simplified version for minibob's use case.
|
|
6
|
+
*
|
|
7
|
+
* Provides hooks for:
|
|
8
|
+
* - Pre-prompt: Run before each task (e.g., SessionMemoryAgent)
|
|
9
|
+
* - Post-prompt: Run after each task (e.g., cleanup, logging)
|
|
10
|
+
* - Activity complete: Run when activity finishes
|
|
11
|
+
*/
|
|
12
|
+
import type { ActivityExecution, TaskResult } from "./types";
|
|
13
|
+
export declare namespace LifecycleHooks {
|
|
14
|
+
/**
|
|
15
|
+
* Hook execution context
|
|
16
|
+
*/
|
|
17
|
+
interface ActivityContext {
|
|
18
|
+
activityId: string;
|
|
19
|
+
templateId: string;
|
|
20
|
+
variables: Record<string, unknown>;
|
|
21
|
+
reason?: string;
|
|
22
|
+
}
|
|
23
|
+
interface TaskContext extends ActivityContext {
|
|
24
|
+
taskId: string;
|
|
25
|
+
taskDescription: string;
|
|
26
|
+
prompt: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Hook definitions
|
|
30
|
+
*/
|
|
31
|
+
interface Hooks {
|
|
32
|
+
/**
|
|
33
|
+
* Run before each task prompt is sent to LLM
|
|
34
|
+
* Use case: Prepare context, load impulses, analyze intent
|
|
35
|
+
*/
|
|
36
|
+
onBeforePrompt?: (context: TaskContext) => Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Run after each task completes
|
|
39
|
+
* Use case: Cleanup, logging, metrics
|
|
40
|
+
*/
|
|
41
|
+
onAfterPrompt?: (context: TaskContext, result: TaskResult) => Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Run when activity execution completes
|
|
44
|
+
* Use case: Final cleanup, reporting, notifications
|
|
45
|
+
*/
|
|
46
|
+
onActivityComplete?: (execution: ActivityExecution) => Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Run when activity execution fails
|
|
49
|
+
* Use case: Error handling, rollback, notifications
|
|
50
|
+
*/
|
|
51
|
+
onActivityFailed?: (execution: ActivityExecution, error: Error) => Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Register lifecycle hooks
|
|
55
|
+
*
|
|
56
|
+
* Example:
|
|
57
|
+
* ```ts
|
|
58
|
+
* LifecycleHooks.register({
|
|
59
|
+
* onBeforePrompt: async (context) => {
|
|
60
|
+
* // Prepare context with SessionMemoryAgent
|
|
61
|
+
* const intent = await SessionMemoryAgent.analyzeIntent({
|
|
62
|
+
* promptText: context.prompt,
|
|
63
|
+
* })
|
|
64
|
+
* await SessionMemoryAgent.prepare({ intent })
|
|
65
|
+
* },
|
|
66
|
+
* onActivityComplete: async (execution) => {
|
|
67
|
+
* console.log(`Activity ${execution.id} completed in ${execution.metrics?.duration}ms`)
|
|
68
|
+
* }
|
|
69
|
+
* })
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
function register(hooks: Hooks): void;
|
|
73
|
+
/**
|
|
74
|
+
* Clear all registered hooks
|
|
75
|
+
* Useful for testing
|
|
76
|
+
*/
|
|
77
|
+
function clear(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Execute onBeforePrompt hook
|
|
80
|
+
*/
|
|
81
|
+
function executeBeforePrompt(context: TaskContext): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Execute onAfterPrompt hook
|
|
84
|
+
*/
|
|
85
|
+
function executeAfterPrompt(context: TaskContext, result: TaskResult): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Execute onActivityComplete hook
|
|
88
|
+
*/
|
|
89
|
+
function executeActivityComplete(execution: ActivityExecution): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Execute onActivityFailed hook
|
|
92
|
+
*/
|
|
93
|
+
function executeActivityFailed(execution: ActivityExecution, activityError: Error): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Get currently registered hooks (for inspection/testing)
|
|
96
|
+
*/
|
|
97
|
+
function getRegistered(): Readonly<Hooks>;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=lifecycle-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-hooks.d.ts","sourceRoot":"","sources":["../src/lifecycle-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE5D,yBAAiB,cAAc,CAAC;IAC9B;;OAEG;IACH,UAAiB,eAAe;QAC9B,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAClC,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB;IAED,UAAiB,WAAY,SAAQ,eAAe;QAClD,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,MAAM,CAAA;QACvB,MAAM,EAAE,MAAM,CAAA;KACf;IAED;;OAEG;IACH,UAAiB,KAAK;QACpB;;;WAGG;QACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QAExD;;;WAGG;QACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QAE3E;;;WAGG;QACH,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QAEpE;;;WAGG;QACH,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KACjF;IAOD;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAG3C;IAED;;;OAGG;IACH,SAAgB,KAAK,IAAI,IAAI,CAG5B;IAED;;OAEG;IACH,SAAsB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7E;IAED;;OAEG;IACH,SAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAchG;IAED;;OAEG;IACH,SAAsB,uBAAuB,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAczF;IAED;;OAEG;IACH,SAAsB,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,EAAE,aAAa,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7G;IAED;;OAEG;IACH,SAAgB,aAAa,IAAI,QAAQ,CAAC,KAAK,CAAC,CAE/C;CACF"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LifecycleHooks - Execution lifecycle management for activities
|
|
3
|
+
*
|
|
4
|
+
* Moved from metabob-opencode to minibob as part of library integration.
|
|
5
|
+
* Simplified version for minibob's use case.
|
|
6
|
+
*
|
|
7
|
+
* Provides hooks for:
|
|
8
|
+
* - Pre-prompt: Run before each task (e.g., SessionMemoryAgent)
|
|
9
|
+
* - Post-prompt: Run after each task (e.g., cleanup, logging)
|
|
10
|
+
* - Activity complete: Run when activity finishes
|
|
11
|
+
*/
|
|
12
|
+
export var LifecycleHooks;
|
|
13
|
+
(function (LifecycleHooks) {
|
|
14
|
+
/**
|
|
15
|
+
* Registered hooks
|
|
16
|
+
*/
|
|
17
|
+
let registeredHooks = {};
|
|
18
|
+
/**
|
|
19
|
+
* Register lifecycle hooks
|
|
20
|
+
*
|
|
21
|
+
* Example:
|
|
22
|
+
* ```ts
|
|
23
|
+
* LifecycleHooks.register({
|
|
24
|
+
* onBeforePrompt: async (context) => {
|
|
25
|
+
* // Prepare context with SessionMemoryAgent
|
|
26
|
+
* const intent = await SessionMemoryAgent.analyzeIntent({
|
|
27
|
+
* promptText: context.prompt,
|
|
28
|
+
* })
|
|
29
|
+
* await SessionMemoryAgent.prepare({ intent })
|
|
30
|
+
* },
|
|
31
|
+
* onActivityComplete: async (execution) => {
|
|
32
|
+
* console.log(`Activity ${execution.id} completed in ${execution.metrics?.duration}ms`)
|
|
33
|
+
* }
|
|
34
|
+
* })
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
function register(hooks) {
|
|
38
|
+
registeredHooks = { ...registeredHooks, ...hooks };
|
|
39
|
+
console.log("[LifecycleHooks] Registered hooks:", Object.keys(hooks));
|
|
40
|
+
}
|
|
41
|
+
LifecycleHooks.register = register;
|
|
42
|
+
/**
|
|
43
|
+
* Clear all registered hooks
|
|
44
|
+
* Useful for testing
|
|
45
|
+
*/
|
|
46
|
+
function clear() {
|
|
47
|
+
registeredHooks = {};
|
|
48
|
+
console.log("[LifecycleHooks] All hooks cleared");
|
|
49
|
+
}
|
|
50
|
+
LifecycleHooks.clear = clear;
|
|
51
|
+
/**
|
|
52
|
+
* Execute onBeforePrompt hook
|
|
53
|
+
*/
|
|
54
|
+
async function executeBeforePrompt(context) {
|
|
55
|
+
if (!registeredHooks.onBeforePrompt) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
await registeredHooks.onBeforePrompt(context);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.warn("[LifecycleHooks] onBeforePrompt hook failed (non-blocking):", {
|
|
63
|
+
error: error instanceof Error ? error.message : String(error),
|
|
64
|
+
taskId: context.taskId,
|
|
65
|
+
});
|
|
66
|
+
// Non-blocking: Continue execution even if hook fails
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
LifecycleHooks.executeBeforePrompt = executeBeforePrompt;
|
|
70
|
+
/**
|
|
71
|
+
* Execute onAfterPrompt hook
|
|
72
|
+
*/
|
|
73
|
+
async function executeAfterPrompt(context, result) {
|
|
74
|
+
if (!registeredHooks.onAfterPrompt) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
await registeredHooks.onAfterPrompt(context, result);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.warn("[LifecycleHooks] onAfterPrompt hook failed (non-blocking):", {
|
|
82
|
+
error: error instanceof Error ? error.message : String(error),
|
|
83
|
+
taskId: context.taskId,
|
|
84
|
+
});
|
|
85
|
+
// Non-blocking: Continue execution even if hook fails
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
LifecycleHooks.executeAfterPrompt = executeAfterPrompt;
|
|
89
|
+
/**
|
|
90
|
+
* Execute onActivityComplete hook
|
|
91
|
+
*/
|
|
92
|
+
async function executeActivityComplete(execution) {
|
|
93
|
+
if (!registeredHooks.onActivityComplete) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
await registeredHooks.onActivityComplete(execution);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.warn("[LifecycleHooks] onActivityComplete hook failed (non-blocking):", {
|
|
101
|
+
error: error instanceof Error ? error.message : String(error),
|
|
102
|
+
activityId: execution.id,
|
|
103
|
+
});
|
|
104
|
+
// Non-blocking
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
LifecycleHooks.executeActivityComplete = executeActivityComplete;
|
|
108
|
+
/**
|
|
109
|
+
* Execute onActivityFailed hook
|
|
110
|
+
*/
|
|
111
|
+
async function executeActivityFailed(execution, activityError) {
|
|
112
|
+
if (!registeredHooks.onActivityFailed) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
await registeredHooks.onActivityFailed(execution, activityError);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.warn("[LifecycleHooks] onActivityFailed hook failed (non-blocking):", {
|
|
120
|
+
error: error instanceof Error ? error.message : String(error),
|
|
121
|
+
activityId: execution.id,
|
|
122
|
+
});
|
|
123
|
+
// Non-blocking
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
LifecycleHooks.executeActivityFailed = executeActivityFailed;
|
|
127
|
+
/**
|
|
128
|
+
* Get currently registered hooks (for inspection/testing)
|
|
129
|
+
*/
|
|
130
|
+
function getRegistered() {
|
|
131
|
+
return registeredHooks;
|
|
132
|
+
}
|
|
133
|
+
LifecycleHooks.getRegistered = getRegistered;
|
|
134
|
+
})(LifecycleHooks || (LifecycleHooks = {}));
|
|
135
|
+
//# sourceMappingURL=lifecycle-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-hooks.js","sourceRoot":"","sources":["../src/lifecycle-hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/llm.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* minibob LLM Client
|
|
3
|
+
*
|
|
4
|
+
* Minimal LLM integration supporting Anthropic Claude.
|
|
5
|
+
* Handles tool calling loop for activity execution.
|
|
6
|
+
*/
|
|
7
|
+
import type { CompletionOptions, CompletionResult, ToolHandler } from "./types";
|
|
8
|
+
export interface LLMClient {
|
|
9
|
+
complete(options: CompletionOptions): Promise<CompletionResult>;
|
|
10
|
+
completeWithTools(options: CompletionOptions, toolHandlers: Record<string, ToolHandler>): Promise<{
|
|
11
|
+
content: string;
|
|
12
|
+
toolsUsed: string[];
|
|
13
|
+
usage: {
|
|
14
|
+
inputTokens: number;
|
|
15
|
+
outputTokens: number;
|
|
16
|
+
};
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create Anthropic LLM client
|
|
21
|
+
*/
|
|
22
|
+
export declare function createAnthropicClient(apiKey: string): LLMClient;
|
|
23
|
+
/**
|
|
24
|
+
* Create OpenAI-compatible LLM client
|
|
25
|
+
*/
|
|
26
|
+
export declare function createOpenAIClient(apiKey: string, baseUrl?: string): LLMClient;
|
|
27
|
+
/**
|
|
28
|
+
* Create LLM client based on provider
|
|
29
|
+
*/
|
|
30
|
+
export declare function createLLMClient(provider: "anthropic" | "openai", apiKey: string): LLMClient;
|
|
31
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAEhB,WAAW,EACZ,MAAM,SAAS,CAAA;AAMhB,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC/D,iBAAiB,CACf,OAAO,EAAE,iBAAiB,EAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GACxC,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAA;CAC3G;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CA6M/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,SAA8B,GAAG,SAAS,CAoLnG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAS3F"}
|
package/dist/llm.js
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* minibob LLM Client
|
|
3
|
+
*
|
|
4
|
+
* Minimal LLM integration supporting Anthropic Claude.
|
|
5
|
+
* Handles tool calling loop for activity execution.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Create Anthropic LLM client
|
|
9
|
+
*/
|
|
10
|
+
export function createAnthropicClient(apiKey) {
|
|
11
|
+
const baseUrl = "https://api.anthropic.com/v1";
|
|
12
|
+
async function complete(options) {
|
|
13
|
+
// Convert messages to Anthropic format
|
|
14
|
+
const systemMessage = options.messages.find((m) => m.role === "system");
|
|
15
|
+
const conversationMessages = options.messages
|
|
16
|
+
.filter((m) => m.role !== "system")
|
|
17
|
+
.map((m) => {
|
|
18
|
+
// Tool result message
|
|
19
|
+
if (m.role === "tool") {
|
|
20
|
+
return {
|
|
21
|
+
role: "user",
|
|
22
|
+
content: [
|
|
23
|
+
{
|
|
24
|
+
type: "tool_result",
|
|
25
|
+
tool_use_id: m.toolCallId,
|
|
26
|
+
content: m.content,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// Assistant message with tool calls
|
|
32
|
+
if (m.role === "assistant" && m.toolCalls && m.toolCalls.length > 0) {
|
|
33
|
+
const content = [];
|
|
34
|
+
// Add text content if present
|
|
35
|
+
if (m.content) {
|
|
36
|
+
content.push({ type: "text", text: m.content });
|
|
37
|
+
}
|
|
38
|
+
// Add tool_use blocks
|
|
39
|
+
for (const toolCall of m.toolCalls) {
|
|
40
|
+
content.push({
|
|
41
|
+
type: "tool_use",
|
|
42
|
+
id: toolCall.id,
|
|
43
|
+
name: toolCall.name,
|
|
44
|
+
input: toolCall.arguments,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
role: "assistant",
|
|
49
|
+
content,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Regular message
|
|
53
|
+
return {
|
|
54
|
+
role: m.role,
|
|
55
|
+
content: m.content,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
// Convert tools to Anthropic format
|
|
59
|
+
const tools = options.tools?.map((t) => ({
|
|
60
|
+
name: t.name,
|
|
61
|
+
description: t.description,
|
|
62
|
+
input_schema: t.parameters,
|
|
63
|
+
}));
|
|
64
|
+
const body = {
|
|
65
|
+
model: options.model,
|
|
66
|
+
max_tokens: options.maxTokens ?? 4096,
|
|
67
|
+
messages: conversationMessages,
|
|
68
|
+
};
|
|
69
|
+
if (systemMessage) {
|
|
70
|
+
body.system = systemMessage.content;
|
|
71
|
+
}
|
|
72
|
+
if (tools && tools.length > 0) {
|
|
73
|
+
body.tools = tools;
|
|
74
|
+
}
|
|
75
|
+
if (options.temperature !== undefined) {
|
|
76
|
+
body.temperature = options.temperature;
|
|
77
|
+
}
|
|
78
|
+
const response = await fetch(`${baseUrl}/messages`, {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: {
|
|
81
|
+
"Content-Type": "application/json",
|
|
82
|
+
"x-api-key": apiKey,
|
|
83
|
+
"anthropic-version": "2023-06-01",
|
|
84
|
+
},
|
|
85
|
+
body: JSON.stringify(body),
|
|
86
|
+
});
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
const error = await response.text();
|
|
89
|
+
throw new Error(`Anthropic API error: ${response.status} - ${error}`);
|
|
90
|
+
}
|
|
91
|
+
const data = (await response.json());
|
|
92
|
+
// Extract content and tool calls
|
|
93
|
+
let content = "";
|
|
94
|
+
const toolCalls = [];
|
|
95
|
+
for (const block of data.content) {
|
|
96
|
+
if (block.type === "text" && block.text) {
|
|
97
|
+
content += block.text;
|
|
98
|
+
}
|
|
99
|
+
else if (block.type === "tool_use" && block.id && block.name) {
|
|
100
|
+
toolCalls.push({
|
|
101
|
+
id: block.id,
|
|
102
|
+
name: block.name,
|
|
103
|
+
arguments: block.input ?? {},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
content,
|
|
109
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
110
|
+
finishReason: data.stop_reason === "end_turn" ? "stop" : data.stop_reason === "tool_use" ? "tool_calls" : "stop",
|
|
111
|
+
usage: {
|
|
112
|
+
inputTokens: data.usage.input_tokens,
|
|
113
|
+
outputTokens: data.usage.output_tokens,
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
async function completeWithTools(options, toolHandlers) {
|
|
118
|
+
const messages = [...options.messages];
|
|
119
|
+
const toolsUsed = [];
|
|
120
|
+
let totalInputTokens = 0;
|
|
121
|
+
let totalOutputTokens = 0;
|
|
122
|
+
let finalContent = "";
|
|
123
|
+
let maxIterations = 20; // Prevent infinite loops
|
|
124
|
+
while (maxIterations-- > 0) {
|
|
125
|
+
const result = await complete({
|
|
126
|
+
...options,
|
|
127
|
+
messages,
|
|
128
|
+
});
|
|
129
|
+
totalInputTokens += result.usage.inputTokens;
|
|
130
|
+
totalOutputTokens += result.usage.outputTokens;
|
|
131
|
+
// If no tool calls, we're done
|
|
132
|
+
if (!result.toolCalls || result.toolCalls.length === 0) {
|
|
133
|
+
finalContent = result.content;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
// Add assistant message with tool calls
|
|
137
|
+
messages.push({
|
|
138
|
+
role: "assistant",
|
|
139
|
+
content: result.content,
|
|
140
|
+
toolCalls: result.toolCalls,
|
|
141
|
+
});
|
|
142
|
+
// Execute tool calls
|
|
143
|
+
for (const toolCall of result.toolCalls) {
|
|
144
|
+
const handler = toolHandlers[toolCall.name];
|
|
145
|
+
let toolResult;
|
|
146
|
+
if (!handler) {
|
|
147
|
+
toolResult = {
|
|
148
|
+
success: false,
|
|
149
|
+
error: `Unknown tool: ${toolCall.name}`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
try {
|
|
154
|
+
toolResult = await handler(toolCall.arguments);
|
|
155
|
+
toolsUsed.push(toolCall.name);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
toolResult = {
|
|
159
|
+
success: false,
|
|
160
|
+
error: error instanceof Error ? error.message : String(error),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Add tool result message
|
|
165
|
+
messages.push({
|
|
166
|
+
role: "tool",
|
|
167
|
+
content: toolResult.success
|
|
168
|
+
? toolResult.output ?? "Success"
|
|
169
|
+
: `Error: ${toolResult.error}`,
|
|
170
|
+
toolCallId: toolCall.id,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
content: finalContent,
|
|
176
|
+
toolsUsed: [...new Set(toolsUsed)],
|
|
177
|
+
usage: {
|
|
178
|
+
inputTokens: totalInputTokens,
|
|
179
|
+
outputTokens: totalOutputTokens,
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return { complete, completeWithTools };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Create OpenAI-compatible LLM client
|
|
187
|
+
*/
|
|
188
|
+
export function createOpenAIClient(apiKey, baseUrl = "https://api.openai.com/v1") {
|
|
189
|
+
async function complete(options) {
|
|
190
|
+
// Convert messages to OpenAI format
|
|
191
|
+
const messages = options.messages.map((m) => {
|
|
192
|
+
if (m.role === "tool") {
|
|
193
|
+
return {
|
|
194
|
+
role: "tool",
|
|
195
|
+
tool_call_id: m.toolCallId,
|
|
196
|
+
content: m.content,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (m.role === "assistant" && m.toolCalls) {
|
|
200
|
+
return {
|
|
201
|
+
role: "assistant",
|
|
202
|
+
content: m.content || null,
|
|
203
|
+
tool_calls: m.toolCalls.map((tc) => ({
|
|
204
|
+
id: tc.id,
|
|
205
|
+
type: "function",
|
|
206
|
+
function: {
|
|
207
|
+
name: tc.name,
|
|
208
|
+
arguments: JSON.stringify(tc.arguments),
|
|
209
|
+
},
|
|
210
|
+
})),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
role: m.role,
|
|
215
|
+
content: m.content,
|
|
216
|
+
};
|
|
217
|
+
});
|
|
218
|
+
// Convert tools to OpenAI format
|
|
219
|
+
const tools = options.tools?.map((t) => ({
|
|
220
|
+
type: "function",
|
|
221
|
+
function: {
|
|
222
|
+
name: t.name,
|
|
223
|
+
description: t.description,
|
|
224
|
+
parameters: t.parameters,
|
|
225
|
+
},
|
|
226
|
+
}));
|
|
227
|
+
const body = {
|
|
228
|
+
model: options.model,
|
|
229
|
+
messages,
|
|
230
|
+
max_tokens: options.maxTokens ?? 4096,
|
|
231
|
+
};
|
|
232
|
+
if (tools && tools.length > 0) {
|
|
233
|
+
body.tools = tools;
|
|
234
|
+
}
|
|
235
|
+
if (options.temperature !== undefined) {
|
|
236
|
+
body.temperature = options.temperature;
|
|
237
|
+
}
|
|
238
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
239
|
+
method: "POST",
|
|
240
|
+
headers: {
|
|
241
|
+
"Content-Type": "application/json",
|
|
242
|
+
Authorization: `Bearer ${apiKey}`,
|
|
243
|
+
},
|
|
244
|
+
body: JSON.stringify(body),
|
|
245
|
+
});
|
|
246
|
+
if (!response.ok) {
|
|
247
|
+
const error = await response.text();
|
|
248
|
+
throw new Error(`OpenAI API error: ${response.status} - ${error}`);
|
|
249
|
+
}
|
|
250
|
+
const data = (await response.json());
|
|
251
|
+
const choice = data.choices[0];
|
|
252
|
+
if (!choice) {
|
|
253
|
+
throw new Error("No response from OpenAI API");
|
|
254
|
+
}
|
|
255
|
+
const toolCalls = choice.message.tool_calls?.map((tc) => ({
|
|
256
|
+
id: tc.id,
|
|
257
|
+
name: tc.function.name,
|
|
258
|
+
arguments: JSON.parse(tc.function.arguments),
|
|
259
|
+
}));
|
|
260
|
+
return {
|
|
261
|
+
content: choice.message.content ?? "",
|
|
262
|
+
toolCalls,
|
|
263
|
+
finishReason: choice.finish_reason === "stop"
|
|
264
|
+
? "stop"
|
|
265
|
+
: choice.finish_reason === "tool_calls"
|
|
266
|
+
? "tool_calls"
|
|
267
|
+
: "stop",
|
|
268
|
+
usage: {
|
|
269
|
+
inputTokens: data.usage.prompt_tokens,
|
|
270
|
+
outputTokens: data.usage.completion_tokens,
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
async function completeWithTools(options, toolHandlers) {
|
|
275
|
+
const messages = [...options.messages];
|
|
276
|
+
const toolsUsed = [];
|
|
277
|
+
let totalInputTokens = 0;
|
|
278
|
+
let totalOutputTokens = 0;
|
|
279
|
+
let finalContent = "";
|
|
280
|
+
let maxIterations = 20;
|
|
281
|
+
while (maxIterations-- > 0) {
|
|
282
|
+
const result = await complete({
|
|
283
|
+
...options,
|
|
284
|
+
messages,
|
|
285
|
+
});
|
|
286
|
+
totalInputTokens += result.usage.inputTokens;
|
|
287
|
+
totalOutputTokens += result.usage.outputTokens;
|
|
288
|
+
if (!result.toolCalls || result.toolCalls.length === 0) {
|
|
289
|
+
finalContent = result.content;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
messages.push({
|
|
293
|
+
role: "assistant",
|
|
294
|
+
content: result.content,
|
|
295
|
+
toolCalls: result.toolCalls,
|
|
296
|
+
});
|
|
297
|
+
for (const toolCall of result.toolCalls) {
|
|
298
|
+
const handler = toolHandlers[toolCall.name];
|
|
299
|
+
let toolResult;
|
|
300
|
+
if (!handler) {
|
|
301
|
+
toolResult = {
|
|
302
|
+
success: false,
|
|
303
|
+
error: `Unknown tool: ${toolCall.name}`,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
try {
|
|
308
|
+
toolResult = await handler(toolCall.arguments);
|
|
309
|
+
toolsUsed.push(toolCall.name);
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
toolResult = {
|
|
313
|
+
success: false,
|
|
314
|
+
error: error instanceof Error ? error.message : String(error),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
messages.push({
|
|
319
|
+
role: "tool",
|
|
320
|
+
content: toolResult.success ? toolResult.output ?? "Success" : `Error: ${toolResult.error}`,
|
|
321
|
+
toolCallId: toolCall.id,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
content: finalContent,
|
|
327
|
+
toolsUsed: [...new Set(toolsUsed)],
|
|
328
|
+
usage: {
|
|
329
|
+
inputTokens: totalInputTokens,
|
|
330
|
+
outputTokens: totalOutputTokens,
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
return { complete, completeWithTools };
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Create LLM client based on provider
|
|
338
|
+
*/
|
|
339
|
+
export function createLLMClient(provider, apiKey) {
|
|
340
|
+
switch (provider) {
|
|
341
|
+
case "anthropic":
|
|
342
|
+
return createAnthropicClient(apiKey);
|
|
343
|
+
case "openai":
|
|
344
|
+
return createOpenAIClient(apiKey);
|
|
345
|
+
default:
|
|
346
|
+
throw new Error(`Unknown provider: ${provider}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=llm.js.map
|
package/dist/llm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
|