@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,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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}