joonecli 0.1.0
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/AGENTS.md +56 -0
- package/Handover.md +115 -0
- package/LICENSE +201 -0
- package/PROGRESS.md +160 -0
- package/README.md +114 -0
- package/dist/__tests__/bootstrap.test.d.ts +1 -0
- package/dist/__tests__/bootstrap.test.js +76 -0
- package/dist/__tests__/bootstrap.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +1 -0
- package/dist/__tests__/config.test.js +84 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/m55.test.d.ts +1 -0
- package/dist/__tests__/m55.test.js +160 -0
- package/dist/__tests__/m55.test.js.map +1 -0
- package/dist/__tests__/middleware.test.d.ts +1 -0
- package/dist/__tests__/middleware.test.js +169 -0
- package/dist/__tests__/middleware.test.js.map +1 -0
- package/dist/__tests__/modelFactory.test.d.ts +1 -0
- package/dist/__tests__/modelFactory.test.js +50 -0
- package/dist/__tests__/modelFactory.test.js.map +1 -0
- package/dist/__tests__/optimizations.test.d.ts +1 -0
- package/dist/__tests__/optimizations.test.js +136 -0
- package/dist/__tests__/optimizations.test.js.map +1 -0
- package/dist/__tests__/promptBuilder.test.d.ts +1 -0
- package/dist/__tests__/promptBuilder.test.js +108 -0
- package/dist/__tests__/promptBuilder.test.js.map +1 -0
- package/dist/__tests__/sandbox.test.d.ts +1 -0
- package/dist/__tests__/sandbox.test.js +78 -0
- package/dist/__tests__/sandbox.test.js.map +1 -0
- package/dist/__tests__/security.test.d.ts +1 -0
- package/dist/__tests__/security.test.js +86 -0
- package/dist/__tests__/security.test.js.map +1 -0
- package/dist/__tests__/streaming.test.d.ts +1 -0
- package/dist/__tests__/streaming.test.js +71 -0
- package/dist/__tests__/streaming.test.js.map +1 -0
- package/dist/__tests__/toolRouter.test.d.ts +1 -0
- package/dist/__tests__/toolRouter.test.js +37 -0
- package/dist/__tests__/toolRouter.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +1 -0
- package/dist/__tests__/tools.test.js +112 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/__tests__/tracing.test.d.ts +1 -0
- package/dist/__tests__/tracing.test.js +147 -0
- package/dist/__tests__/tracing.test.js.map +1 -0
- package/dist/cli/config.d.ts +49 -0
- package/dist/cli/config.js +86 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +625 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/modelFactory.d.ts +9 -0
- package/dist/cli/modelFactory.js +154 -0
- package/dist/cli/modelFactory.js.map +1 -0
- package/dist/cli/providers.d.ts +18 -0
- package/dist/cli/providers.js +94 -0
- package/dist/cli/providers.js.map +1 -0
- package/dist/core/agentLoop.d.ts +43 -0
- package/dist/core/agentLoop.js +245 -0
- package/dist/core/agentLoop.js.map +1 -0
- package/dist/core/errors.d.ts +62 -0
- package/dist/core/errors.js +139 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/promptBuilder.d.ts +49 -0
- package/dist/core/promptBuilder.js +84 -0
- package/dist/core/promptBuilder.js.map +1 -0
- package/dist/core/reasoningRouter.d.ts +62 -0
- package/dist/core/reasoningRouter.js +102 -0
- package/dist/core/reasoningRouter.js.map +1 -0
- package/dist/core/retry.d.ts +25 -0
- package/dist/core/retry.js +49 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/sessionResumer.d.ts +17 -0
- package/dist/core/sessionResumer.js +78 -0
- package/dist/core/sessionResumer.js.map +1 -0
- package/dist/core/sessionStore.d.ts +45 -0
- package/dist/core/sessionStore.js +167 -0
- package/dist/core/sessionStore.js.map +1 -0
- package/dist/core/tokenCounter.d.ts +17 -0
- package/dist/core/tokenCounter.js +54 -0
- package/dist/core/tokenCounter.js.map +1 -0
- package/dist/evals/dataset.d.ts +4 -0
- package/dist/evals/dataset.js +61 -0
- package/dist/evals/dataset.js.map +1 -0
- package/dist/evals/evaluator.d.ts +21 -0
- package/dist/evals/evaluator.js +68 -0
- package/dist/evals/evaluator.js.map +1 -0
- package/dist/hitl/bridge.d.ts +65 -0
- package/dist/hitl/bridge.js +120 -0
- package/dist/hitl/bridge.js.map +1 -0
- package/dist/middleware/commandSanitizer.d.ts +18 -0
- package/dist/middleware/commandSanitizer.js +50 -0
- package/dist/middleware/commandSanitizer.js.map +1 -0
- package/dist/middleware/loopDetection.d.ts +28 -0
- package/dist/middleware/loopDetection.js +49 -0
- package/dist/middleware/loopDetection.js.map +1 -0
- package/dist/middleware/permission.d.ts +17 -0
- package/dist/middleware/permission.js +59 -0
- package/dist/middleware/permission.js.map +1 -0
- package/dist/middleware/pipeline.d.ts +31 -0
- package/dist/middleware/pipeline.js +62 -0
- package/dist/middleware/pipeline.js.map +1 -0
- package/dist/middleware/preCompletion.d.ts +29 -0
- package/dist/middleware/preCompletion.js +82 -0
- package/dist/middleware/preCompletion.js.map +1 -0
- package/dist/middleware/types.d.ts +40 -0
- package/dist/middleware/types.js +8 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/sandbox/bootstrap.d.ts +38 -0
- package/dist/sandbox/bootstrap.js +107 -0
- package/dist/sandbox/bootstrap.js.map +1 -0
- package/dist/sandbox/manager.d.ts +72 -0
- package/dist/sandbox/manager.js +180 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/sync.d.ts +55 -0
- package/dist/sandbox/sync.js +135 -0
- package/dist/sandbox/sync.js.map +1 -0
- package/dist/skills/loader.d.ts +55 -0
- package/dist/skills/loader.js +132 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/tools.d.ts +5 -0
- package/dist/skills/tools.js +78 -0
- package/dist/skills/tools.js.map +1 -0
- package/dist/skills/types.d.ts +13 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/test_cache.d.ts +1 -0
- package/dist/test_cache.js +55 -0
- package/dist/test_cache.js.map +1 -0
- package/dist/test_google.js +93 -0
- package/dist/tools/askUser.d.ts +10 -0
- package/dist/tools/askUser.js +42 -0
- package/dist/tools/askUser.js.map +1 -0
- package/dist/tools/browser.d.ts +19 -0
- package/dist/tools/browser.js +111 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/index.d.ts +27 -0
- package/dist/tools/index.js +184 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +31 -0
- package/dist/tools/registry.js +168 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/router.d.ts +34 -0
- package/dist/tools/router.js +73 -0
- package/dist/tools/router.js.map +1 -0
- package/dist/tools/security.d.ts +28 -0
- package/dist/tools/security.js +183 -0
- package/dist/tools/security.js.map +1 -0
- package/dist/tools/webSearch.d.ts +6 -0
- package/dist/tools/webSearch.js +120 -0
- package/dist/tools/webSearch.js.map +1 -0
- package/dist/tracing/analyzer.d.ts +58 -0
- package/dist/tracing/analyzer.js +190 -0
- package/dist/tracing/analyzer.js.map +1 -0
- package/dist/tracing/langsmith.d.ts +38 -0
- package/dist/tracing/langsmith.js +50 -0
- package/dist/tracing/langsmith.js.map +1 -0
- package/dist/tracing/sessionTracer.d.ts +73 -0
- package/dist/tracing/sessionTracer.js +157 -0
- package/dist/tracing/sessionTracer.js.map +1 -0
- package/dist/tracing/types.d.ts +46 -0
- package/dist/tracing/types.js +5 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/ui/App.d.ts +24 -0
- package/dist/ui/App.js +172 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/HITLPrompt.d.ts +15 -0
- package/dist/ui/components/HITLPrompt.js +35 -0
- package/dist/ui/components/HITLPrompt.js.map +1 -0
- package/dist/ui/components/Header.d.ts +8 -0
- package/dist/ui/components/Header.js +6 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/MessageBubble.d.ts +13 -0
- package/dist/ui/components/MessageBubble.js +17 -0
- package/dist/ui/components/MessageBubble.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +21 -0
- package/dist/ui/components/StatusBar.js +34 -0
- package/dist/ui/components/StatusBar.js.map +1 -0
- package/dist/ui/components/StreamingText.d.ts +13 -0
- package/dist/ui/components/StreamingText.js +24 -0
- package/dist/ui/components/StreamingText.js.map +1 -0
- package/dist/ui/components/ToolCallPanel.d.ts +15 -0
- package/dist/ui/components/ToolCallPanel.js +18 -0
- package/dist/ui/components/ToolCallPanel.js.map +1 -0
- package/docs/01_insights_and_patterns.md +27 -0
- package/docs/02_edge_cases_and_mitigations.md +143 -0
- package/docs/03_initial_implementation_plan.md +66 -0
- package/docs/04_tech_stack_proposal.md +20 -0
- package/docs/05_prd.md +87 -0
- package/docs/06_user_stories.md +72 -0
- package/docs/07_system_architecture.md +138 -0
- package/docs/08_roadmap.md +200 -0
- package/e2b/Dockerfile +26 -0
- package/package.json +57 -0
- package/src/__tests__/bootstrap.test.ts +111 -0
- package/src/__tests__/config.test.ts +97 -0
- package/src/__tests__/m55.test.ts +238 -0
- package/src/__tests__/middleware.test.ts +219 -0
- package/src/__tests__/modelFactory.test.ts +63 -0
- package/src/__tests__/optimizations.test.ts +201 -0
- package/src/__tests__/promptBuilder.test.ts +141 -0
- package/src/__tests__/sandbox.test.ts +102 -0
- package/src/__tests__/security.test.ts +122 -0
- package/src/__tests__/streaming.test.ts +82 -0
- package/src/__tests__/toolRouter.test.ts +52 -0
- package/src/__tests__/tools.test.ts +146 -0
- package/src/__tests__/tracing.test.ts +196 -0
- package/src/agents/agentRegistry.ts +69 -0
- package/src/agents/agentSpec.ts +67 -0
- package/src/agents/builtinAgents.ts +142 -0
- package/src/cli/config.ts +124 -0
- package/src/cli/index.ts +730 -0
- package/src/cli/modelFactory.ts +174 -0
- package/src/cli/providers.ts +107 -0
- package/src/commands/builtinCommands.ts +293 -0
- package/src/commands/commandRegistry.ts +194 -0
- package/src/core/agentLoop.d.ts.map +1 -0
- package/src/core/agentLoop.ts +312 -0
- package/src/core/autoSave.ts +95 -0
- package/src/core/compactor.ts +252 -0
- package/src/core/contextGuard.ts +129 -0
- package/src/core/errors.ts +202 -0
- package/src/core/promptBuilder.d.ts.map +1 -0
- package/src/core/promptBuilder.ts +139 -0
- package/src/core/reasoningRouter.ts +121 -0
- package/src/core/retry.ts +75 -0
- package/src/core/sessionResumer.ts +90 -0
- package/src/core/sessionStore.ts +215 -0
- package/src/core/subAgent.ts +339 -0
- package/src/core/tokenCounter.ts +64 -0
- package/src/evals/dataset.ts +67 -0
- package/src/evals/evaluator.ts +81 -0
- package/src/hitl/bridge.ts +160 -0
- package/src/middleware/commandSanitizer.ts +60 -0
- package/src/middleware/loopDetection.ts +63 -0
- package/src/middleware/permission.ts +72 -0
- package/src/middleware/pipeline.ts +75 -0
- package/src/middleware/preCompletion.ts +94 -0
- package/src/middleware/types.ts +45 -0
- package/src/sandbox/bootstrap.ts +121 -0
- package/src/sandbox/manager.ts +239 -0
- package/src/sandbox/sync.ts +157 -0
- package/src/skills/loader.ts +143 -0
- package/src/skills/tools.ts +99 -0
- package/src/skills/types.ts +13 -0
- package/src/test_cache.ts +72 -0
- package/src/test_google.js +40 -0
- package/src/test_google.ts +40 -0
- package/src/tools/askUser.ts +47 -0
- package/src/tools/browser.ts +137 -0
- package/src/tools/index.d.ts.map +1 -0
- package/src/tools/index.ts +237 -0
- package/src/tools/registry.ts +198 -0
- package/src/tools/router.ts +78 -0
- package/src/tools/security.ts +220 -0
- package/src/tools/spawnAgent.ts +158 -0
- package/src/tools/webSearch.ts +142 -0
- package/src/tracing/analyzer.ts +265 -0
- package/src/tracing/langsmith.ts +63 -0
- package/src/tracing/sessionTracer.ts +202 -0
- package/src/tracing/types.ts +49 -0
- package/src/types/valyu.d.ts +37 -0
- package/src/ui/App.tsx +404 -0
- package/src/ui/components/HITLPrompt.tsx +119 -0
- package/src/ui/components/Header.tsx +51 -0
- package/src/ui/components/MessageBubble.tsx +46 -0
- package/src/ui/components/StatusBar.tsx +138 -0
- package/src/ui/components/StreamingText.tsx +48 -0
- package/src/ui/components/ToolCallPanel.tsx +80 -0
- package/tests/commands/commands.test.ts +356 -0
- package/tests/core/compactor.test.ts +217 -0
- package/tests/core/retryAndErrors.test.ts +164 -0
- package/tests/core/sessionResumer.test.ts +95 -0
- package/tests/core/sessionStore.test.ts +84 -0
- package/tests/core/stability.test.ts +165 -0
- package/tests/core/subAgent.test.ts +238 -0
- package/tests/hitl/hitlBridge.test.ts +115 -0
- package/tsconfig.json +16 -0
- package/vitest.config.ts +10 -0
- package/vitest.out +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
2
|
+
import { JooneConfig } from "./config.js";
|
|
3
|
+
/**
|
|
4
|
+
* Model Factory
|
|
5
|
+
*
|
|
6
|
+
* Creates a LangChain BaseChatModel based on the JooneConfig.
|
|
7
|
+
* Uses dynamic imports so only the selected provider's package is loaded.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createModel(config: JooneConfig): Promise<BaseChatModel>;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { pathToFileURL } from "node:url";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { getProviderDir, PROVIDER_PACKAGE_MAP } from "./providers.js";
|
|
4
|
+
/**
|
|
5
|
+
* Providers that do NOT require an API key (e.g. local models).
|
|
6
|
+
*/
|
|
7
|
+
const NO_KEY_PROVIDERS = new Set(["ollama"]);
|
|
8
|
+
import { createRequire } from "node:module";
|
|
9
|
+
/**
|
|
10
|
+
* Attempts to dynamically import a provider package.
|
|
11
|
+
* First tries the user-local ~/.joone/providers/node_modules directory.
|
|
12
|
+
* If that fails, falls back to a standard require/import for bundled setups.
|
|
13
|
+
*/
|
|
14
|
+
async function loadProviderPackage(provider) {
|
|
15
|
+
const packageName = PROVIDER_PACKAGE_MAP[provider];
|
|
16
|
+
if (!packageName) {
|
|
17
|
+
throw new Error(`Unknown package name for provider: ${provider}`);
|
|
18
|
+
}
|
|
19
|
+
// 1. Try user-local plugin directory
|
|
20
|
+
const localPluginPath = path.join(getProviderDir(), "node_modules", packageName);
|
|
21
|
+
try {
|
|
22
|
+
// Node.js ESM cannot import absolute directories (ERR_UNSUPPORTED_DIR_IMPORT).
|
|
23
|
+
// We must use createRequire to resolve the actual package.json "main" or "exports" entry point.
|
|
24
|
+
const require = createRequire(import.meta.url);
|
|
25
|
+
const resolvedPath = require.resolve(localPluginPath);
|
|
26
|
+
return await import(pathToFileURL(resolvedPath).href);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
// Ignore MODULE_NOT_FOUND or similar errors and fallback
|
|
30
|
+
if (err.code !== "ERR_MODULE_NOT_FOUND" && !err.message.includes("Cannot find module")) {
|
|
31
|
+
// console.debug(`Failed to load from plugin dir:`, err.message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// 2. Fallback to standard resolution (for npx, bundled versions, etc)
|
|
35
|
+
try {
|
|
36
|
+
return await import(packageName);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
throw new Error(`Provider "${provider}" requires the ${packageName} package.\nRun: joone provider add ${provider}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Model Factory
|
|
44
|
+
*
|
|
45
|
+
* Creates a LangChain BaseChatModel based on the JooneConfig.
|
|
46
|
+
* Uses dynamic imports so only the selected provider's package is loaded.
|
|
47
|
+
*/
|
|
48
|
+
export async function createModel(config) {
|
|
49
|
+
const { provider, model, apiKey, maxTokens, temperature } = config;
|
|
50
|
+
// API key validation for cloud providers
|
|
51
|
+
if (!NO_KEY_PROVIDERS.has(provider) && !apiKey) {
|
|
52
|
+
throw new Error(`API key is required for provider "${provider}". Run: joone config`);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
switch (provider) {
|
|
56
|
+
case "anthropic": {
|
|
57
|
+
const pkg = await loadProviderPackage(provider);
|
|
58
|
+
const ChatAnthropic = pkg.ChatAnthropic || pkg.default?.ChatAnthropic;
|
|
59
|
+
return new ChatAnthropic({
|
|
60
|
+
modelName: model,
|
|
61
|
+
anthropicApiKey: apiKey,
|
|
62
|
+
maxTokens,
|
|
63
|
+
temperature,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
case "openai": {
|
|
67
|
+
const pkg = await loadProviderPackage(provider);
|
|
68
|
+
const ChatOpenAI = pkg.ChatOpenAI || pkg.default?.ChatOpenAI;
|
|
69
|
+
return new ChatOpenAI({
|
|
70
|
+
modelName: model,
|
|
71
|
+
openAIApiKey: apiKey,
|
|
72
|
+
maxTokens,
|
|
73
|
+
temperature,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
case "google": {
|
|
77
|
+
const pkg = await loadProviderPackage(provider);
|
|
78
|
+
// Specifically for Google, LangChain frequently uses ChatGoogleGenerativeAI
|
|
79
|
+
const ChatGoogle = pkg.ChatGoogleGenerativeAI || pkg.default?.ChatGoogleGenerativeAI || pkg.ChatGoogleGenAI || pkg.default?.ChatGoogleGenAI;
|
|
80
|
+
if (!apiKey) {
|
|
81
|
+
throw new Error("API key is required for provider \"google\". Run: joone config");
|
|
82
|
+
}
|
|
83
|
+
return new ChatGoogle({
|
|
84
|
+
model: model,
|
|
85
|
+
apiKey: apiKey,
|
|
86
|
+
maxOutputTokens: maxTokens,
|
|
87
|
+
temperature,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
case "mistral": {
|
|
91
|
+
const { ChatMistralAI } = await loadProviderPackage(provider);
|
|
92
|
+
return new ChatMistralAI({
|
|
93
|
+
modelName: model,
|
|
94
|
+
apiKey: apiKey,
|
|
95
|
+
maxTokens,
|
|
96
|
+
temperature,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
case "groq": {
|
|
100
|
+
const { ChatGroq } = await loadProviderPackage(provider);
|
|
101
|
+
return new ChatGroq({
|
|
102
|
+
modelName: model,
|
|
103
|
+
apiKey: apiKey,
|
|
104
|
+
maxTokens,
|
|
105
|
+
temperature,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
case "deepseek": {
|
|
109
|
+
const { ChatDeepSeek } = await loadProviderPackage(provider);
|
|
110
|
+
return new ChatDeepSeek({
|
|
111
|
+
modelName: model,
|
|
112
|
+
apiKey: apiKey,
|
|
113
|
+
maxTokens,
|
|
114
|
+
temperature,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
case "fireworks": {
|
|
118
|
+
const { ChatFireworks } = await loadProviderPackage(provider);
|
|
119
|
+
return new ChatFireworks({
|
|
120
|
+
modelName: model,
|
|
121
|
+
fireworksApiKey: apiKey,
|
|
122
|
+
maxTokens,
|
|
123
|
+
temperature,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
case "together": {
|
|
127
|
+
const { ChatTogetherAI } = await loadProviderPackage(provider);
|
|
128
|
+
return new ChatTogetherAI({
|
|
129
|
+
modelName: model,
|
|
130
|
+
togetherAIApiKey: apiKey,
|
|
131
|
+
maxTokens,
|
|
132
|
+
temperature,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
case "ollama": {
|
|
136
|
+
const { ChatOllama } = await loadProviderPackage(provider);
|
|
137
|
+
return new ChatOllama({
|
|
138
|
+
model: model,
|
|
139
|
+
maxTokens,
|
|
140
|
+
temperature,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
default:
|
|
144
|
+
throw new Error(`Unsupported provider: "${provider}". Supported providers: anthropic, openai, google, mistral, groq, deepseek, fireworks, together, ollama.`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
// If LangChain itself throws an API key error (sometimes they do runtime checks)
|
|
149
|
+
if (e instanceof Error && e.message.includes("API key"))
|
|
150
|
+
throw e;
|
|
151
|
+
throw e; // Rethrow the loadProviderPackage message or other unexpected errors
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=modelFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelFactory.js","sourceRoot":"","sources":["../../src/cli/modelFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtE;;GAEG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;GAIG;AACH,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,MAAM,WAAW,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,qCAAqC;IACrC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IACjF,IAAI,CAAC;QACH,+EAA+E;QAC/E,gGAAgG;QAChG,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACtD,OAAO,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,yDAAyD;QACzD,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACtF,iEAAiE;QACpE,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,kBAAkB,WAAW,sCAAsC,QAAQ,EAAE,CAAC,CAAC;IACtH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAmB;IACnD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAEnE,yCAAyC;IACzC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,qCAAqC,QAAQ,sBAAsB,CACpE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAChD,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC;gBACtE,OAAO,IAAI,aAAa,CAAC;oBACvB,SAAS,EAAE,KAAK;oBAChB,eAAe,EAAE,MAAM;oBACvB,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAChD,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC;gBAC7D,OAAO,IAAI,UAAU,CAAC;oBACpB,SAAS,EAAE,KAAK;oBAChB,YAAY,EAAE,MAAM;oBACpB,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAChD,4EAA4E;gBAC5E,MAAM,UAAU,GAAG,GAAG,CAAC,sBAAsB,IAAI,GAAG,CAAC,OAAO,EAAE,sBAAsB,IAAI,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC;gBAE5I,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBACpF,CAAC;gBAED,OAAO,IAAI,UAAU,CAAC;oBACpB,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,MAAM;oBACd,eAAe,EAAE,SAAS;oBAC1B,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC9D,OAAO,IAAI,aAAa,CAAC;oBACvB,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,MAAM;oBACd,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBACzD,OAAO,IAAI,QAAQ,CAAC;oBAClB,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,MAAM;oBACd,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC7D,OAAO,IAAI,YAAY,CAAC;oBACtB,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,MAAM;oBACd,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC9D,OAAO,IAAI,aAAa,CAAC;oBACvB,SAAS,EAAE,KAAK;oBAChB,eAAe,EAAE,MAAM;oBACvB,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC/D,OAAO,IAAI,cAAc,CAAC;oBACxB,SAAS,EAAE,KAAK;oBAChB,gBAAgB,EAAE,MAAM;oBACxB,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC3D,OAAO,IAAI,UAAU,CAAC;oBACpB,KAAK,EAAE,KAAK;oBACZ,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAED;gBACE,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,0GAA0G,CAC7I,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,iFAAiF;QACjF,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,MAAM,CAAC,CAAC;QACjE,MAAM,CAAC,CAAC,CAAC,qEAAqE;IAChF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the absolute path to the user-local providers directory.
|
|
3
|
+
*/
|
|
4
|
+
export declare function getProviderDir(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Maps the internal Joone provider name to the official LangChain NPM package name.
|
|
7
|
+
*/
|
|
8
|
+
export declare const PROVIDER_PACKAGE_MAP: Record<string, string>;
|
|
9
|
+
/**
|
|
10
|
+
* Installs the NPM package for the given provider into the user-local `~/.joone/providers` directory.
|
|
11
|
+
* @param provider The internal Joone provider name (e.g., "google")
|
|
12
|
+
*/
|
|
13
|
+
export declare function installProvider(provider: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Uninstalls the NPM package for the given provider from the user-local `~/.joone/providers` directory.
|
|
16
|
+
* @param provider The internal Joone provider name (e.g., "google")
|
|
17
|
+
*/
|
|
18
|
+
export declare function uninstallProvider(provider: string): Promise<void>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import spawn from "cross-spawn";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
/**
|
|
6
|
+
* Returns the absolute path to the user-local providers directory.
|
|
7
|
+
*/
|
|
8
|
+
export function getProviderDir() {
|
|
9
|
+
return path.join(os.homedir(), ".joone", "providers");
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Maps the internal Joone provider name to the official LangChain NPM package name.
|
|
13
|
+
*/
|
|
14
|
+
export const PROVIDER_PACKAGE_MAP = {
|
|
15
|
+
anthropic: "@langchain/anthropic",
|
|
16
|
+
openai: "@langchain/openai",
|
|
17
|
+
google: "@langchain/google-genai",
|
|
18
|
+
mistral: "@langchain/mistralai",
|
|
19
|
+
groq: "@langchain/groq",
|
|
20
|
+
deepseek: "@langchain/deepseek",
|
|
21
|
+
fireworks: "@langchain/community",
|
|
22
|
+
together: "@langchain/community",
|
|
23
|
+
ollama: "@langchain/ollama"
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Installs the NPM package for the given provider into the user-local `~/.joone/providers` directory.
|
|
27
|
+
* @param provider The internal Joone provider name (e.g., "google")
|
|
28
|
+
*/
|
|
29
|
+
export async function installProvider(provider) {
|
|
30
|
+
const packageName = PROVIDER_PACKAGE_MAP[provider];
|
|
31
|
+
if (!packageName) {
|
|
32
|
+
throw new Error(`Unknown provider: "${provider}"`);
|
|
33
|
+
}
|
|
34
|
+
const providerDir = getProviderDir();
|
|
35
|
+
// Ensure the directory exists
|
|
36
|
+
if (!fs.existsSync(providerDir)) {
|
|
37
|
+
fs.mkdirSync(providerDir, { recursive: true });
|
|
38
|
+
}
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
// We use --no-save to avoid creating a package.json and --no-package-lock to avoid lockfiles
|
|
41
|
+
// in this isolated directory, keeping it clean and fast.
|
|
42
|
+
const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
43
|
+
const args = ["install", packageName, "--prefix", providerDir, "--no-save", "--no-package-lock"];
|
|
44
|
+
// Using cross-spawn automatically handles Windows command resolution securely without shell:true
|
|
45
|
+
const child = spawn(npmCmd, args, {
|
|
46
|
+
stdio: "ignore", // Suppress NPM's verbose output during install
|
|
47
|
+
});
|
|
48
|
+
child.on("close", (code) => {
|
|
49
|
+
if (code === 0) {
|
|
50
|
+
resolve();
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
reject(new Error(`Failed to install ${packageName} (npm install exited with code ${code})`));
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
child.on("error", (err) => {
|
|
57
|
+
reject(new Error(`Failed to spawn npm install: ${err.message}`));
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Uninstalls the NPM package for the given provider from the user-local `~/.joone/providers` directory.
|
|
63
|
+
* @param provider The internal Joone provider name (e.g., "google")
|
|
64
|
+
*/
|
|
65
|
+
export async function uninstallProvider(provider) {
|
|
66
|
+
const packageName = PROVIDER_PACKAGE_MAP[provider];
|
|
67
|
+
if (!packageName) {
|
|
68
|
+
throw new Error(`Unknown provider: "${provider}"`);
|
|
69
|
+
}
|
|
70
|
+
const providerDir = getProviderDir();
|
|
71
|
+
// If the directory doesn't exist, it's already uninstalled implicitly
|
|
72
|
+
if (!fs.existsSync(providerDir)) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
77
|
+
const args = ["uninstall", packageName, "--prefix", providerDir, "--no-save", "--no-package-lock"];
|
|
78
|
+
const child = spawn(npmCmd, args, {
|
|
79
|
+
stdio: "ignore",
|
|
80
|
+
});
|
|
81
|
+
child.on("close", (code) => {
|
|
82
|
+
if (code === 0) {
|
|
83
|
+
resolve();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
reject(new Error(`Failed to uninstall ${packageName} (npm uninstall exited with code ${code})`));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
child.on("error", (err) => {
|
|
90
|
+
reject(new Error(`Failed to spawn npm uninstall: ${err.message}`));
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/cli/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BaseChatModel } from "@langchain/core/language_models/chat_models";
|
|
2
|
+
import { AIMessage, ToolMessage, AIMessageChunk, HumanMessage } from "@langchain/core/messages";
|
|
3
|
+
import { Runnable } from "@langchain/core/runnables";
|
|
4
|
+
import { ContextState } from "./promptBuilder.js";
|
|
5
|
+
import { DynamicToolInterface } from "../tools/index.js";
|
|
6
|
+
import { MiddlewarePipeline } from "../middleware/pipeline.js";
|
|
7
|
+
import { SessionTracer } from "../tracing/sessionTracer.js";
|
|
8
|
+
export interface StreamStepOptions {
|
|
9
|
+
/** Called for each text token received from the stream. */
|
|
10
|
+
onToken?: (token: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare class ExecutionHarness {
|
|
13
|
+
private llm;
|
|
14
|
+
private promptBuilder;
|
|
15
|
+
private availableTools;
|
|
16
|
+
private pipeline;
|
|
17
|
+
tracer: SessionTracer;
|
|
18
|
+
private sessionStore;
|
|
19
|
+
sessionId: string;
|
|
20
|
+
private provider;
|
|
21
|
+
private model;
|
|
22
|
+
/**
|
|
23
|
+
* Initializes the harness with a pre-configured, tool-bound LLM instance.
|
|
24
|
+
* This allows swapping between Anthropic Claude, OpenAI GPT-4, Google Gemini, etc.
|
|
25
|
+
*/
|
|
26
|
+
constructor(boundLlm: Runnable<any, AIMessageChunk> | BaseChatModel, tools?: DynamicToolInterface[], pipeline?: MiddlewarePipeline, tracer?: SessionTracer, provider?: string, model?: string, sessionId?: string);
|
|
27
|
+
/**
|
|
28
|
+
* The main execution engine (non-streaming).
|
|
29
|
+
* Takes the context state, builds the cache-optimized prompt, and queries the LLM.
|
|
30
|
+
*/
|
|
31
|
+
step(state: ContextState): Promise<AIMessage>;
|
|
32
|
+
/**
|
|
33
|
+
* Streaming execution engine.
|
|
34
|
+
* Streams text tokens via the onToken callback and buffers tool call chunks
|
|
35
|
+
* until the full call is received. Returns a complete AIMessage for history.
|
|
36
|
+
*/
|
|
37
|
+
streamStep(state: ContextState, options: StreamStepOptions): Promise<AIMessage>;
|
|
38
|
+
/**
|
|
39
|
+
* Executes tool calls from an AI response, routing through the middleware pipeline.
|
|
40
|
+
* Each call passes through all registered before-hooks, then the tool, then after-hooks.
|
|
41
|
+
*/
|
|
42
|
+
executeToolCalls(aiMessage: AIMessage, state: ContextState): Promise<(ToolMessage | HumanMessage)[]>;
|
|
43
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { AIMessage, ToolMessage, HumanMessage } from "@langchain/core/messages";
|
|
2
|
+
import { CacheOptimizedPromptBuilder } from "./promptBuilder.js";
|
|
3
|
+
import { MiddlewarePipeline } from "../middleware/pipeline.js";
|
|
4
|
+
import { SessionTracer } from "../tracing/sessionTracer.js";
|
|
5
|
+
import { countMessageTokens } from "./tokenCounter.js";
|
|
6
|
+
import { SessionStore } from "./sessionStore.js";
|
|
7
|
+
import { retryWithBackoff } from "./retry.js";
|
|
8
|
+
import { wrapLLMError, JooneError, ToolExecutionError } from "./errors.js";
|
|
9
|
+
import { SystemMessage } from "@langchain/core/messages";
|
|
10
|
+
export class ExecutionHarness {
|
|
11
|
+
llm;
|
|
12
|
+
promptBuilder;
|
|
13
|
+
availableTools;
|
|
14
|
+
pipeline;
|
|
15
|
+
tracer;
|
|
16
|
+
sessionStore;
|
|
17
|
+
sessionId;
|
|
18
|
+
provider;
|
|
19
|
+
model;
|
|
20
|
+
/**
|
|
21
|
+
* Initializes the harness with a pre-configured, tool-bound LLM instance.
|
|
22
|
+
* This allows swapping between Anthropic Claude, OpenAI GPT-4, Google Gemini, etc.
|
|
23
|
+
*/
|
|
24
|
+
constructor(boundLlm, tools = [], pipeline, tracer, provider = "unknown", model = "unknown", sessionId) {
|
|
25
|
+
this.llm = boundLlm;
|
|
26
|
+
this.promptBuilder = new CacheOptimizedPromptBuilder();
|
|
27
|
+
this.availableTools = tools;
|
|
28
|
+
this.pipeline = pipeline ?? new MiddlewarePipeline();
|
|
29
|
+
this.tracer = tracer ?? new SessionTracer();
|
|
30
|
+
this.sessionStore = new SessionStore();
|
|
31
|
+
this.sessionId = sessionId ?? this.tracer.getSessionId();
|
|
32
|
+
this.provider = provider;
|
|
33
|
+
this.model = model;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The main execution engine (non-streaming).
|
|
37
|
+
* Takes the context state, builds the cache-optimized prompt, and queries the LLM.
|
|
38
|
+
*/
|
|
39
|
+
async step(state) {
|
|
40
|
+
const start = Date.now();
|
|
41
|
+
const messages = this.promptBuilder.buildPrompt(state);
|
|
42
|
+
try {
|
|
43
|
+
const response = await retryWithBackoff(() => this.llm.invoke(messages).catch((e) => { throw wrapLLMError(e, this.provider); }), {
|
|
44
|
+
onRetry: (attempt, error, delay) => {
|
|
45
|
+
this.tracer.recordError({ message: `LLM retry #${attempt}: ${error.message} (waiting ${delay}ms)` });
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
const promptTokens = countMessageTokens(messages);
|
|
49
|
+
const completionTokens = countMessageTokens([response]);
|
|
50
|
+
this.tracer.recordLLMCall({
|
|
51
|
+
promptTokens,
|
|
52
|
+
completionTokens,
|
|
53
|
+
cached: false,
|
|
54
|
+
duration: Date.now() - start
|
|
55
|
+
});
|
|
56
|
+
await this.sessionStore.saveSession(this.sessionId, state, this.provider, this.model);
|
|
57
|
+
return response;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// Self-recovery: inject the error hint and let the agent adapt
|
|
61
|
+
if (error instanceof JooneError && error.retryable) {
|
|
62
|
+
this.tracer.recordError({ message: `LLM retries exhausted: ${error.message}` });
|
|
63
|
+
state.conversationHistory.push(new SystemMessage(error.toRecoveryHint()));
|
|
64
|
+
await this.sessionStore.saveSession(this.sessionId, state, this.provider, this.model);
|
|
65
|
+
// Return a synthetic AI message so the turn doesn't crash
|
|
66
|
+
return new AIMessage(error.toRecoveryHint());
|
|
67
|
+
}
|
|
68
|
+
throw error; // Fatal (auth, config) — propagate to TUI
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Streaming execution engine.
|
|
73
|
+
* Streams text tokens via the onToken callback and buffers tool call chunks
|
|
74
|
+
* until the full call is received. Returns a complete AIMessage for history.
|
|
75
|
+
*/
|
|
76
|
+
async streamStep(state, options) {
|
|
77
|
+
const start = Date.now();
|
|
78
|
+
const messages = this.promptBuilder.buildPrompt(state);
|
|
79
|
+
try {
|
|
80
|
+
const result = await retryWithBackoff(async () => {
|
|
81
|
+
let fullContent = "";
|
|
82
|
+
const toolCallBuffers = new Map();
|
|
83
|
+
let stream;
|
|
84
|
+
try {
|
|
85
|
+
stream = await this.llm.stream(messages);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
throw wrapLLMError(e, this.provider);
|
|
89
|
+
}
|
|
90
|
+
for await (const chunk of stream) {
|
|
91
|
+
if (chunk.content && typeof chunk.content === "string") {
|
|
92
|
+
fullContent += chunk.content;
|
|
93
|
+
if (options.onToken) {
|
|
94
|
+
options.onToken(chunk.content);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) {
|
|
98
|
+
for (const tc of chunk.tool_call_chunks) {
|
|
99
|
+
const idx = tc.index ?? 0;
|
|
100
|
+
if (!toolCallBuffers.has(idx)) {
|
|
101
|
+
toolCallBuffers.set(idx, {
|
|
102
|
+
id: tc.id || "",
|
|
103
|
+
name: tc.name || "",
|
|
104
|
+
argsJson: "",
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
const buf = toolCallBuffers.get(idx);
|
|
108
|
+
if (tc.id)
|
|
109
|
+
buf.id = tc.id;
|
|
110
|
+
if (tc.name)
|
|
111
|
+
buf.name = tc.name;
|
|
112
|
+
if (tc.args)
|
|
113
|
+
buf.argsJson += tc.args;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const toolCalls = Array.from(toolCallBuffers.values()).map((buf) => ({
|
|
118
|
+
id: buf.id,
|
|
119
|
+
name: buf.name,
|
|
120
|
+
args: (() => {
|
|
121
|
+
try {
|
|
122
|
+
return JSON.parse(buf.argsJson || "{}");
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return { _parseError: true, rawArgs: buf.argsJson };
|
|
126
|
+
}
|
|
127
|
+
})(),
|
|
128
|
+
type: "tool_call",
|
|
129
|
+
}));
|
|
130
|
+
return new AIMessage({
|
|
131
|
+
content: fullContent,
|
|
132
|
+
tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
133
|
+
});
|
|
134
|
+
}, {
|
|
135
|
+
onRetry: (attempt, error, delay) => {
|
|
136
|
+
this.tracer.recordError({ message: `LLM stream retry #${attempt}: ${error.message} (waiting ${delay}ms)` });
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
const promptTokens = countMessageTokens(messages);
|
|
140
|
+
const completionTokens = countMessageTokens([result]);
|
|
141
|
+
this.tracer.recordLLMCall({
|
|
142
|
+
promptTokens,
|
|
143
|
+
completionTokens,
|
|
144
|
+
cached: false,
|
|
145
|
+
duration: Date.now() - start
|
|
146
|
+
});
|
|
147
|
+
await this.sessionStore.saveSession(this.sessionId, state, this.provider, this.model);
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// Self-recovery for streaming
|
|
152
|
+
if (error instanceof JooneError && error.retryable) {
|
|
153
|
+
this.tracer.recordError({ message: `LLM stream retries exhausted: ${error.message}` });
|
|
154
|
+
state.conversationHistory.push(new SystemMessage(error.toRecoveryHint()));
|
|
155
|
+
await this.sessionStore.saveSession(this.sessionId, state, this.provider, this.model);
|
|
156
|
+
return new AIMessage(error.toRecoveryHint());
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Executes tool calls from an AI response, routing through the middleware pipeline.
|
|
163
|
+
* Each call passes through all registered before-hooks, then the tool, then after-hooks.
|
|
164
|
+
*/
|
|
165
|
+
async executeToolCalls(aiMessage, state) {
|
|
166
|
+
const results = [];
|
|
167
|
+
if (!aiMessage.tool_calls || aiMessage.tool_calls.length === 0) {
|
|
168
|
+
return results;
|
|
169
|
+
}
|
|
170
|
+
for (const call of aiMessage.tool_calls) {
|
|
171
|
+
// Soft-Fail Edge Case: If the LLM omits the tool_call_id, do not execute the tool.
|
|
172
|
+
// Return a HumanMessage prompting correction instead of a malformed ToolMessage.
|
|
173
|
+
if (!call.id) {
|
|
174
|
+
this.tracer.recordError({ message: `Malformed tool call: Missing ID for ${call.name}`, tool: call.name });
|
|
175
|
+
results.push(new HumanMessage(`You attempted to call the tool '${call.name}', but you did not provide a tool_call_id. ` +
|
|
176
|
+
`This is a malformed request. Please try again and ensure you provide a valid ID.`));
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const safeCallId = call.id;
|
|
180
|
+
// Handle malformed args from streaming parse errors
|
|
181
|
+
if (call.args && call.args._parseError) {
|
|
182
|
+
this.tracer.recordError({ message: `Failed to parse tool arguments`, tool: call.name });
|
|
183
|
+
results.push(new ToolMessage({
|
|
184
|
+
content: `Error: Failed to parse tool arguments. The JSON provided was malformed:\n${call.args.rawArgs}\nPlease correct the JSON format and try again.`,
|
|
185
|
+
tool_call_id: safeCallId
|
|
186
|
+
}));
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const tool = this.availableTools.find(t => t.name === call.name);
|
|
190
|
+
if (!tool) {
|
|
191
|
+
this.tracer.recordError({ message: `Tool ${call.name} not found`, tool: call.name });
|
|
192
|
+
results.push(new ToolMessage({
|
|
193
|
+
content: `Error: Tool ${call.name} not found.`,
|
|
194
|
+
tool_call_id: safeCallId
|
|
195
|
+
}));
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const ctx = {
|
|
199
|
+
toolName: call.name,
|
|
200
|
+
args: call.args,
|
|
201
|
+
callId: safeCallId,
|
|
202
|
+
};
|
|
203
|
+
const start = Date.now();
|
|
204
|
+
try {
|
|
205
|
+
const output = await this.pipeline.run(ctx, async (c) => tool.execute(c.args));
|
|
206
|
+
this.tracer.recordToolCall({
|
|
207
|
+
name: call.name,
|
|
208
|
+
args: call.args,
|
|
209
|
+
result: typeof output === "string" ? output : JSON.stringify(output).substring(0, 100),
|
|
210
|
+
duration: Date.now() - start,
|
|
211
|
+
success: true
|
|
212
|
+
});
|
|
213
|
+
const stringifiedOutput = typeof output === "string" ? output : JSON.stringify(output);
|
|
214
|
+
results.push(new ToolMessage({
|
|
215
|
+
content: stringifiedOutput,
|
|
216
|
+
tool_call_id: safeCallId
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
const toolError = new ToolExecutionError(error.message, {
|
|
221
|
+
toolName: call.name,
|
|
222
|
+
args: call.args,
|
|
223
|
+
retryable: false,
|
|
224
|
+
cause: error,
|
|
225
|
+
});
|
|
226
|
+
this.tracer.recordToolCall({
|
|
227
|
+
name: call.name,
|
|
228
|
+
args: call.args,
|
|
229
|
+
duration: Date.now() - start,
|
|
230
|
+
success: false
|
|
231
|
+
});
|
|
232
|
+
this.tracer.recordError({ message: toolError.message, tool: call.name });
|
|
233
|
+
results.push(new ToolMessage({
|
|
234
|
+
content: toolError.toRecoveryHint(),
|
|
235
|
+
tool_call_id: safeCallId
|
|
236
|
+
}));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Add the tool results to the state immediately before saving
|
|
240
|
+
state.conversationHistory.push(...results);
|
|
241
|
+
await this.sessionStore.saveSession(this.sessionId, state, this.provider, this.model);
|
|
242
|
+
return results;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=agentLoop.js.map
|