@botbotgo/runtime 1.0.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.
Files changed (313) hide show
  1. package/.github/workflows/ci.yml +46 -0
  2. package/.github/workflows/release.yml +79 -0
  3. package/README.md +71 -0
  4. package/config/examples/memory.yaml +39 -0
  5. package/config/examples/model.yaml +21 -0
  6. package/config/examples/runtime.yaml +44 -0
  7. package/config/examples/skills.yaml +8 -0
  8. package/config/examples/tool.yaml +16 -0
  9. package/dist/config/index.d.ts +7 -0
  10. package/dist/config/index.d.ts.map +1 -0
  11. package/dist/config/index.js +4 -0
  12. package/dist/config/index.js.map +1 -0
  13. package/dist/config/loader.d.ts +41 -0
  14. package/dist/config/loader.d.ts.map +1 -0
  15. package/dist/config/loader.js +140 -0
  16. package/dist/config/loader.js.map +1 -0
  17. package/dist/config/resolveRuntimeConfig.d.ts +83 -0
  18. package/dist/config/resolveRuntimeConfig.d.ts.map +1 -0
  19. package/dist/config/resolveRuntimeConfig.js +85 -0
  20. package/dist/config/resolveRuntimeConfig.js.map +1 -0
  21. package/dist/config/resources.d.ts +112 -0
  22. package/dist/config/resources.d.ts.map +1 -0
  23. package/dist/config/resources.js +20 -0
  24. package/dist/config/resources.js.map +1 -0
  25. package/dist/config/runtimeConfigLoader.d.ts +28 -0
  26. package/dist/config/runtimeConfigLoader.d.ts.map +1 -0
  27. package/dist/config/runtimeConfigLoader.js +38 -0
  28. package/dist/config/runtimeConfigLoader.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +5 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/runtime/agentMiddleware.d.ts +3 -0
  34. package/dist/runtime/agentMiddleware.d.ts.map +1 -0
  35. package/dist/runtime/agentMiddleware.js +2 -0
  36. package/dist/runtime/agentMiddleware.js.map +1 -0
  37. package/dist/runtime/bootstrap/runtimeFactory.d.ts +7 -0
  38. package/dist/runtime/bootstrap/runtimeFactory.d.ts.map +1 -0
  39. package/dist/runtime/bootstrap/runtimeFactory.js +139 -0
  40. package/dist/runtime/bootstrap/runtimeFactory.js.map +1 -0
  41. package/dist/runtime/bootstrap/runtimeModuleInitializer.d.ts +5 -0
  42. package/dist/runtime/bootstrap/runtimeModuleInitializer.d.ts.map +1 -0
  43. package/dist/runtime/bootstrap/runtimeModuleInitializer.js +32 -0
  44. package/dist/runtime/bootstrap/runtimeModuleInitializer.js.map +1 -0
  45. package/dist/runtime/context/agentContext.d.ts +5 -0
  46. package/dist/runtime/context/agentContext.d.ts.map +1 -0
  47. package/dist/runtime/context/agentContext.js +19 -0
  48. package/dist/runtime/context/agentContext.js.map +1 -0
  49. package/dist/runtime/context/globalContext.d.ts +19 -0
  50. package/dist/runtime/context/globalContext.d.ts.map +1 -0
  51. package/dist/runtime/context/globalContext.js +47 -0
  52. package/dist/runtime/context/globalContext.js.map +1 -0
  53. package/dist/runtime/events/eventPublisher.d.ts +15 -0
  54. package/dist/runtime/events/eventPublisher.d.ts.map +1 -0
  55. package/dist/runtime/events/eventPublisher.js +23 -0
  56. package/dist/runtime/events/eventPublisher.js.map +1 -0
  57. package/dist/runtime/execution/agentRunExecutor.d.ts +38 -0
  58. package/dist/runtime/execution/agentRunExecutor.d.ts.map +1 -0
  59. package/dist/runtime/execution/agentRunExecutor.js +378 -0
  60. package/dist/runtime/execution/agentRunExecutor.js.map +1 -0
  61. package/dist/runtime/execution/agentRunExecutor.types.d.ts +37 -0
  62. package/dist/runtime/execution/agentRunExecutor.types.d.ts.map +1 -0
  63. package/dist/runtime/execution/agentRunExecutor.types.js +2 -0
  64. package/dist/runtime/execution/agentRunExecutor.types.js.map +1 -0
  65. package/dist/runtime/execution/agentRunProgress.d.ts +8 -0
  66. package/dist/runtime/execution/agentRunProgress.d.ts.map +1 -0
  67. package/dist/runtime/execution/agentRunProgress.js +46 -0
  68. package/dist/runtime/execution/agentRunProgress.js.map +1 -0
  69. package/dist/runtime/execution/agentRunState.d.ts +44 -0
  70. package/dist/runtime/execution/agentRunState.d.ts.map +1 -0
  71. package/dist/runtime/execution/agentRunState.js +17 -0
  72. package/dist/runtime/execution/agentRunState.js.map +1 -0
  73. package/dist/runtime/execution/policies/runCompletionPolicy.d.ts +5 -0
  74. package/dist/runtime/execution/policies/runCompletionPolicy.d.ts.map +1 -0
  75. package/dist/runtime/execution/policies/runCompletionPolicy.js +30 -0
  76. package/dist/runtime/execution/policies/runCompletionPolicy.js.map +1 -0
  77. package/dist/runtime/execution/policies/runErrorPolicy.d.ts +7 -0
  78. package/dist/runtime/execution/policies/runErrorPolicy.d.ts.map +1 -0
  79. package/dist/runtime/execution/policies/runErrorPolicy.js +40 -0
  80. package/dist/runtime/execution/policies/runErrorPolicy.js.map +1 -0
  81. package/dist/runtime/execution/policies/runPromptBuilder.d.ts +10 -0
  82. package/dist/runtime/execution/policies/runPromptBuilder.d.ts.map +1 -0
  83. package/dist/runtime/execution/policies/runPromptBuilder.js +34 -0
  84. package/dist/runtime/execution/policies/runPromptBuilder.js.map +1 -0
  85. package/dist/runtime/execution/policies/runSummaryFormatter.d.ts +6 -0
  86. package/dist/runtime/execution/policies/runSummaryFormatter.d.ts.map +1 -0
  87. package/dist/runtime/execution/policies/runSummaryFormatter.js +47 -0
  88. package/dist/runtime/execution/policies/runSummaryFormatter.js.map +1 -0
  89. package/dist/runtime/execution/policies/runtimeDelay.d.ts +4 -0
  90. package/dist/runtime/execution/policies/runtimeDelay.d.ts.map +1 -0
  91. package/dist/runtime/execution/policies/runtimeDelay.js +6 -0
  92. package/dist/runtime/execution/policies/runtimeDelay.js.map +1 -0
  93. package/dist/runtime/execution/policies/toolConfigReader.d.ts +8 -0
  94. package/dist/runtime/execution/policies/toolConfigReader.d.ts.map +1 -0
  95. package/dist/runtime/execution/policies/toolConfigReader.js +91 -0
  96. package/dist/runtime/execution/policies/toolConfigReader.js.map +1 -0
  97. package/dist/runtime/human-loop/consoleHumanLoop.d.ts +21 -0
  98. package/dist/runtime/human-loop/consoleHumanLoop.d.ts.map +1 -0
  99. package/dist/runtime/human-loop/consoleHumanLoop.js +102 -0
  100. package/dist/runtime/human-loop/consoleHumanLoop.js.map +1 -0
  101. package/dist/runtime/human-loop/humanLoop.d.ts +44 -0
  102. package/dist/runtime/human-loop/humanLoop.d.ts.map +1 -0
  103. package/dist/runtime/human-loop/humanLoop.js +36 -0
  104. package/dist/runtime/human-loop/humanLoop.js.map +1 -0
  105. package/dist/runtime/index.d.ts +10 -0
  106. package/dist/runtime/index.d.ts.map +1 -0
  107. package/dist/runtime/index.js +6 -0
  108. package/dist/runtime/index.js.map +1 -0
  109. package/dist/runtime/middleware/agentToolMiddleware.d.ts +30 -0
  110. package/dist/runtime/middleware/agentToolMiddleware.d.ts.map +1 -0
  111. package/dist/runtime/middleware/agentToolMiddleware.js +259 -0
  112. package/dist/runtime/middleware/agentToolMiddleware.js.map +1 -0
  113. package/dist/runtime/middleware/commandPolicy.d.ts +8 -0
  114. package/dist/runtime/middleware/commandPolicy.d.ts.map +1 -0
  115. package/dist/runtime/middleware/commandPolicy.js +55 -0
  116. package/dist/runtime/middleware/commandPolicy.js.map +1 -0
  117. package/dist/runtime/middleware/frameworkPrompt.d.ts +4 -0
  118. package/dist/runtime/middleware/frameworkPrompt.d.ts.map +1 -0
  119. package/dist/runtime/middleware/frameworkPrompt.js +44 -0
  120. package/dist/runtime/middleware/frameworkPrompt.js.map +1 -0
  121. package/dist/runtime/middleware/index.d.ts +4 -0
  122. package/dist/runtime/middleware/index.d.ts.map +1 -0
  123. package/dist/runtime/middleware/index.js +3 -0
  124. package/dist/runtime/middleware/index.js.map +1 -0
  125. package/dist/runtime/middleware/skillPathMap.d.ts +3 -0
  126. package/dist/runtime/middleware/skillPathMap.d.ts.map +1 -0
  127. package/dist/runtime/middleware/skillPathMap.js +44 -0
  128. package/dist/runtime/middleware/skillPathMap.js.map +1 -0
  129. package/dist/runtime/middleware/toolArgsNormalizer.d.ts +21 -0
  130. package/dist/runtime/middleware/toolArgsNormalizer.d.ts.map +1 -0
  131. package/dist/runtime/middleware/toolArgsNormalizer.js +227 -0
  132. package/dist/runtime/middleware/toolArgsNormalizer.js.map +1 -0
  133. package/dist/runtime/middleware/toolCallGuard.d.ts +8 -0
  134. package/dist/runtime/middleware/toolCallGuard.d.ts.map +1 -0
  135. package/dist/runtime/middleware/toolCallGuard.js +60 -0
  136. package/dist/runtime/middleware/toolCallGuard.js.map +1 -0
  137. package/dist/runtime/middleware/toolFsHandlers.d.ts +12 -0
  138. package/dist/runtime/middleware/toolFsHandlers.d.ts.map +1 -0
  139. package/dist/runtime/middleware/toolFsHandlers.js +79 -0
  140. package/dist/runtime/middleware/toolFsHandlers.js.map +1 -0
  141. package/dist/runtime/middleware/toolRequestParser.d.ts +14 -0
  142. package/dist/runtime/middleware/toolRequestParser.d.ts.map +1 -0
  143. package/dist/runtime/middleware/toolRequestParser.js +72 -0
  144. package/dist/runtime/middleware/toolRequestParser.js.map +1 -0
  145. package/dist/runtime/middleware/types.d.ts +87 -0
  146. package/dist/runtime/middleware/types.d.ts.map +1 -0
  147. package/dist/runtime/middleware/types.js +3 -0
  148. package/dist/runtime/middleware/types.js.map +1 -0
  149. package/dist/runtime/providers/backendResolver.d.ts +26 -0
  150. package/dist/runtime/providers/backendResolver.d.ts.map +1 -0
  151. package/dist/runtime/providers/backendResolver.js +73 -0
  152. package/dist/runtime/providers/backendResolver.js.map +1 -0
  153. package/dist/runtime/providers/index.d.ts +14 -0
  154. package/dist/runtime/providers/index.d.ts.map +1 -0
  155. package/dist/runtime/providers/index.js +10 -0
  156. package/dist/runtime/providers/index.js.map +1 -0
  157. package/dist/runtime/providers/langchainRuntime.d.ts +11 -0
  158. package/dist/runtime/providers/langchainRuntime.d.ts.map +1 -0
  159. package/dist/runtime/providers/langchainRuntime.js +45 -0
  160. package/dist/runtime/providers/langchainRuntime.js.map +1 -0
  161. package/dist/runtime/providers/localShellBackend.d.ts +10 -0
  162. package/dist/runtime/providers/localShellBackend.d.ts.map +1 -0
  163. package/dist/runtime/providers/localShellBackend.js +23 -0
  164. package/dist/runtime/providers/localShellBackend.js.map +1 -0
  165. package/dist/runtime/providers/openaiDeepAgent.d.ts +9 -0
  166. package/dist/runtime/providers/openaiDeepAgent.d.ts.map +1 -0
  167. package/dist/runtime/providers/openaiDeepAgent.js +7 -0
  168. package/dist/runtime/providers/openaiDeepAgent.js.map +1 -0
  169. package/dist/runtime/providers/openaiLocalAgent.d.ts +17 -0
  170. package/dist/runtime/providers/openaiLocalAgent.d.ts.map +1 -0
  171. package/dist/runtime/providers/openaiLocalAgent.js +26 -0
  172. package/dist/runtime/providers/openaiLocalAgent.js.map +1 -0
  173. package/dist/runtime/providers/openaiLocalAgentFactory.d.ts +36 -0
  174. package/dist/runtime/providers/openaiLocalAgentFactory.d.ts.map +1 -0
  175. package/dist/runtime/providers/openaiLocalAgentFactory.js +139 -0
  176. package/dist/runtime/providers/openaiLocalAgentFactory.js.map +1 -0
  177. package/dist/runtime/providers/shared/agentProbe.d.ts +4 -0
  178. package/dist/runtime/providers/shared/agentProbe.d.ts.map +1 -0
  179. package/dist/runtime/providers/shared/agentProbe.js +17 -0
  180. package/dist/runtime/providers/shared/agentProbe.js.map +1 -0
  181. package/dist/runtime/providers/shared/moduleFallback.d.ts +2 -0
  182. package/dist/runtime/providers/shared/moduleFallback.d.ts.map +1 -0
  183. package/dist/runtime/providers/shared/moduleFallback.js +34 -0
  184. package/dist/runtime/providers/shared/moduleFallback.js.map +1 -0
  185. package/dist/runtime/providers/shared/resourceCloser.d.ts +6 -0
  186. package/dist/runtime/providers/shared/resourceCloser.d.ts.map +1 -0
  187. package/dist/runtime/providers/shared/resourceCloser.js +30 -0
  188. package/dist/runtime/providers/shared/resourceCloser.js.map +1 -0
  189. package/dist/runtime/runtimeService.d.ts +109 -0
  190. package/dist/runtime/runtimeService.d.ts.map +1 -0
  191. package/dist/runtime/runtimeService.js +90 -0
  192. package/dist/runtime/runtimeService.js.map +1 -0
  193. package/dist/runtime/stream/agentMessages.d.ts +40 -0
  194. package/dist/runtime/stream/agentMessages.d.ts.map +1 -0
  195. package/dist/runtime/stream/agentMessages.js +44 -0
  196. package/dist/runtime/stream/agentMessages.js.map +1 -0
  197. package/dist/runtime/stream/agentStream.d.ts +31 -0
  198. package/dist/runtime/stream/agentStream.d.ts.map +1 -0
  199. package/dist/runtime/stream/agentStream.js +106 -0
  200. package/dist/runtime/stream/agentStream.js.map +1 -0
  201. package/dist/runtime/stream/messageSummary.d.ts +20 -0
  202. package/dist/runtime/stream/messageSummary.d.ts.map +1 -0
  203. package/dist/runtime/stream/messageSummary.js +150 -0
  204. package/dist/runtime/stream/messageSummary.js.map +1 -0
  205. package/dist/runtime/stream/runArtifacts.d.ts +9 -0
  206. package/dist/runtime/stream/runArtifacts.d.ts.map +1 -0
  207. package/dist/runtime/stream/runArtifacts.js +48 -0
  208. package/dist/runtime/stream/runArtifacts.js.map +1 -0
  209. package/dist/state/index.d.ts +7 -0
  210. package/dist/state/index.d.ts.map +1 -0
  211. package/dist/state/index.js +4 -0
  212. package/dist/state/index.js.map +1 -0
  213. package/dist/state/runState.d.ts +36 -0
  214. package/dist/state/runState.d.ts.map +1 -0
  215. package/dist/state/runState.js +51 -0
  216. package/dist/state/runState.js.map +1 -0
  217. package/dist/state/todos.d.ts +19 -0
  218. package/dist/state/todos.d.ts.map +1 -0
  219. package/dist/state/todos.js +45 -0
  220. package/dist/state/todos.js.map +1 -0
  221. package/dist/state/workspaceRunSession.d.ts +32 -0
  222. package/dist/state/workspaceRunSession.d.ts.map +1 -0
  223. package/dist/state/workspaceRunSession.js +67 -0
  224. package/dist/state/workspaceRunSession.js.map +1 -0
  225. package/dist/state/workspaceState.d.ts +94 -0
  226. package/dist/state/workspaceState.d.ts.map +1 -0
  227. package/dist/state/workspaceState.js +119 -0
  228. package/dist/state/workspaceState.js.map +1 -0
  229. package/dist/types.d.ts +2 -0
  230. package/dist/types.d.ts.map +1 -0
  231. package/dist/types.js +2 -0
  232. package/dist/types.js.map +1 -0
  233. package/example/.tsbuildinfo +1 -0
  234. package/example/build/.tsbuildinfo +1 -0
  235. package/example/config/memory.yaml +35 -0
  236. package/example/config/model.yaml +14 -0
  237. package/example/config/runtime.yaml +46 -0
  238. package/example/config/tool.yaml +24 -0
  239. package/example/index.ts +159 -0
  240. package/example/package-lock.json +1396 -0
  241. package/example/package.json +26 -0
  242. package/example/serve-output.mjs +52 -0
  243. package/example/tsconfig.json +19 -0
  244. package/package.json +73 -0
  245. package/scripts/resolve-deps.js +40 -0
  246. package/src/config/index.ts +29 -0
  247. package/src/config/loader.ts +174 -0
  248. package/src/config/resolveRuntimeConfig.ts +160 -0
  249. package/src/config/resources.ts +152 -0
  250. package/src/config/runtimeConfigLoader.ts +68 -0
  251. package/src/external-modules.d.ts +20 -0
  252. package/src/index.ts +36 -0
  253. package/src/runtime/agentMiddleware.ts +6 -0
  254. package/src/runtime/bootstrap/runtimeFactory.ts +212 -0
  255. package/src/runtime/bootstrap/runtimeModuleInitializer.ts +34 -0
  256. package/src/runtime/context/agentContext.ts +24 -0
  257. package/src/runtime/context/globalContext.ts +70 -0
  258. package/src/runtime/events/eventPublisher.ts +45 -0
  259. package/src/runtime/execution/agentRunExecutor.ts +499 -0
  260. package/src/runtime/execution/agentRunExecutor.types.ts +39 -0
  261. package/src/runtime/execution/agentRunProgress.ts +67 -0
  262. package/src/runtime/execution/agentRunState.ts +66 -0
  263. package/src/runtime/execution/policies/runCompletionPolicy.ts +30 -0
  264. package/src/runtime/execution/policies/runErrorPolicy.ts +50 -0
  265. package/src/runtime/execution/policies/runPromptBuilder.ts +39 -0
  266. package/src/runtime/execution/policies/runSummaryFormatter.ts +57 -0
  267. package/src/runtime/execution/policies/runtimeDelay.ts +5 -0
  268. package/src/runtime/execution/policies/toolConfigReader.ts +107 -0
  269. package/src/runtime/human-loop/consoleHumanLoop.ts +113 -0
  270. package/src/runtime/human-loop/humanLoop.ts +90 -0
  271. package/src/runtime/index.ts +36 -0
  272. package/src/runtime/middleware/agentToolMiddleware.ts +329 -0
  273. package/src/runtime/middleware/commandPolicy.ts +65 -0
  274. package/src/runtime/middleware/frameworkPrompt.ts +51 -0
  275. package/src/runtime/middleware/index.ts +7 -0
  276. package/src/runtime/middleware/skillPathMap.ts +49 -0
  277. package/src/runtime/middleware/toolArgsNormalizer.ts +277 -0
  278. package/src/runtime/middleware/toolCallGuard.ts +73 -0
  279. package/src/runtime/middleware/toolFsHandlers.ts +94 -0
  280. package/src/runtime/middleware/toolRequestParser.ts +84 -0
  281. package/src/runtime/middleware/types.ts +91 -0
  282. package/src/runtime/providers/backendResolver.ts +127 -0
  283. package/src/runtime/providers/index.ts +19 -0
  284. package/src/runtime/providers/langchainRuntime.ts +67 -0
  285. package/src/runtime/providers/localShellBackend.ts +54 -0
  286. package/src/runtime/providers/openaiDeepAgent.ts +17 -0
  287. package/src/runtime/providers/openaiLocalAgent.ts +35 -0
  288. package/src/runtime/providers/openaiLocalAgentFactory.ts +185 -0
  289. package/src/runtime/providers/shared/agentProbe.ts +24 -0
  290. package/src/runtime/providers/shared/moduleFallback.ts +41 -0
  291. package/src/runtime/providers/shared/resourceCloser.ts +30 -0
  292. package/src/runtime/runtimeService.ts +205 -0
  293. package/src/runtime/stream/agentMessages.ts +72 -0
  294. package/src/runtime/stream/agentStream.ts +168 -0
  295. package/src/runtime/stream/messageSummary.ts +164 -0
  296. package/src/runtime/stream/runArtifacts.ts +72 -0
  297. package/src/state/index.ts +19 -0
  298. package/src/state/runState.ts +84 -0
  299. package/src/state/todos.ts +59 -0
  300. package/src/state/workspaceRunSession.ts +96 -0
  301. package/src/state/workspaceState.ts +199 -0
  302. package/src/types/easynet-agent-common.d.ts +62 -0
  303. package/src/types.ts +1 -0
  304. package/test/integration/runtime-live.integration.test.ts +30 -0
  305. package/test/unit/config/loader.test.ts +429 -0
  306. package/test/unit/runtime/agentContext.test.ts +23 -0
  307. package/test/unit/runtime/agentRuntime.test.ts +99 -0
  308. package/test/unit/runtime/consoleHumanLoop.test.ts +52 -0
  309. package/test/unit/runtime/events.test.ts +11 -0
  310. package/test/unit/runtime/globalContext.test.ts +34 -0
  311. package/test/unit/runtime/humanLoop.test.ts +104 -0
  312. package/test/unit/runtime/toolArgsNormalizer.test.ts +136 -0
  313. package/tsconfig.json +18 -0
@@ -0,0 +1,127 @@
1
+ import { LocalShellBackendService } from "./localShellBackend.js";
2
+ import { requireModuleFromWorkspace } from "./shared/moduleFallback.js";
3
+
4
+ interface BackendFactoryLike {
5
+ (options?: Record<string, unknown>): unknown | Promise<unknown>;
6
+ }
7
+
8
+ interface BackendConstructorLike {
9
+ new (options?: Record<string, unknown>): unknown;
10
+ create?: BackendFactoryLike;
11
+ }
12
+
13
+ type BackendModuleLike = Record<string, unknown>;
14
+
15
+ export interface AgentBackendConfig {
16
+ /**
17
+ * Built-in selector:
18
+ * - local_shell (default)
19
+ * - deepagents_export
20
+ * - module_export
21
+ */
22
+ type?: "local_shell" | "deepagents_export" | "module_export";
23
+ /** Export name when type=deepagents_export/module_export. */
24
+ exportName?: string;
25
+ /** Module path when type=module_export (resolved from workspace root). */
26
+ module?: string;
27
+ /** Factory method name. Default: create */
28
+ createMethod?: string;
29
+ /** Backend constructor/factory options passthrough. */
30
+ options?: Record<string, unknown>;
31
+ /** Convenience overrides for local_shell. */
32
+ inheritEnv?: boolean;
33
+ timeoutMs?: number;
34
+ maxOutputBytes?: number;
35
+ }
36
+
37
+ export class BackendResolver {
38
+ public static async create(rootDir: string, config: AgentBackendConfig | undefined): Promise<unknown> {
39
+ const type = config?.type ?? "local_shell";
40
+
41
+ if (type === "local_shell") {
42
+ const localOptions = config?.options ?? {};
43
+ return LocalShellBackendService.create(rootDir, {
44
+ inheritEnv:
45
+ typeof config?.inheritEnv === "boolean"
46
+ ? config.inheritEnv
47
+ : typeof localOptions.inheritEnv === "boolean"
48
+ ? localOptions.inheritEnv
49
+ : undefined,
50
+ timeout:
51
+ typeof config?.timeoutMs === "number"
52
+ ? config.timeoutMs
53
+ : typeof localOptions.timeout === "number"
54
+ ? localOptions.timeout
55
+ : typeof localOptions.timeoutMs === "number"
56
+ ? localOptions.timeoutMs
57
+ : undefined,
58
+ maxOutputBytes:
59
+ typeof config?.maxOutputBytes === "number"
60
+ ? config.maxOutputBytes
61
+ : typeof localOptions.maxOutputBytes === "number"
62
+ ? localOptions.maxOutputBytes
63
+ : undefined,
64
+ });
65
+ }
66
+
67
+ if (type === "deepagents_export") {
68
+ const exportName = config?.exportName?.trim();
69
+ if (!exportName) {
70
+ throw new Error("Backend config error: `exportName` is required for type=deepagents_export");
71
+ }
72
+ return BackendResolver.createFromModule(rootDir, "deepagents", exportName, config);
73
+ }
74
+
75
+ if (type === "module_export") {
76
+ const moduleName = config?.module?.trim();
77
+ const exportName = config?.exportName?.trim();
78
+ if (!moduleName || !exportName) {
79
+ throw new Error("Backend config error: `module` and `exportName` are required for type=module_export");
80
+ }
81
+ return BackendResolver.createFromModule(rootDir, moduleName, exportName, config);
82
+ }
83
+
84
+ throw new Error(
85
+ `Backend config error: unsupported backend type '${String(type)}'. ` +
86
+ "Use local_shell | deepagents_export | module_export."
87
+ );
88
+ }
89
+
90
+ private static async createFromModule(
91
+ rootDir: string,
92
+ moduleName: string,
93
+ exportName: string,
94
+ config: AgentBackendConfig | undefined,
95
+ ): Promise<unknown> {
96
+ const mod = requireModuleFromWorkspace<BackendModuleLike>(rootDir, moduleName);
97
+ const target = mod[exportName];
98
+
99
+ if (!target) {
100
+ const available = Object.keys(mod).filter((key) => /backend/i.test(key)).sort();
101
+ const hint = available.length > 0 ? ` Available backend-like exports: ${available.join(", ")}` : "";
102
+ throw new Error(`Backend config error: export '${exportName}' not found in module '${moduleName}'.${hint}`);
103
+ }
104
+
105
+ const createMethod = config?.createMethod?.trim() || "create";
106
+ const options = {
107
+ rootDir,
108
+ inheritEnv: config?.inheritEnv,
109
+ timeout: config?.timeoutMs,
110
+ maxOutputBytes: config?.maxOutputBytes,
111
+ ...(config?.options ?? {}),
112
+ };
113
+
114
+ if (typeof target === "function") {
115
+ const candidate = target as BackendConstructorLike;
116
+ const factory = (candidate as unknown as Record<string, unknown>)[createMethod];
117
+ if (typeof factory === "function") {
118
+ return (factory as BackendFactoryLike).call(candidate, options);
119
+ }
120
+ return new candidate(options);
121
+ }
122
+
123
+ throw new Error(
124
+ `Backend config error: export '${exportName}' from module '${moduleName}' is not a constructor/factory.`,
125
+ );
126
+ }
127
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Runtime provider adapters that resolve host-installed dependencies
3
+ * and assemble concrete model/backend bindings.
4
+ */
5
+ export { OpenAILocalAgentService } from "./openaiLocalAgent.js";
6
+ export type {
7
+ CreateOpenAILocalAgentOptions,
8
+ OpenAILocalAgentParts,
9
+ } from "./openaiLocalAgent.js";
10
+ export { OpenAIDeepAgentService } from "./openaiDeepAgent.js";
11
+ export type {
12
+ CreateOpenAIDeepAgentOptions,
13
+ CreateOpenAIDeepAgentResult,
14
+ } from "./openaiDeepAgent.js";
15
+ export { LocalShellBackendService } from "./localShellBackend.js";
16
+ export { BackendResolver } from "./backendResolver.js";
17
+ export type { AgentBackendConfig } from "./backendResolver.js";
18
+ export { LangchainRuntimeBindingsResolver } from "./langchainRuntime.js";
19
+ export type { LangchainRuntimeBindings } from "./langchainRuntime.js";
@@ -0,0 +1,67 @@
1
+ import type { CreateAgentToolMiddlewareOptions } from "../agentMiddleware.js";
2
+ import { requireModuleFromWorkspace } from "./shared/moduleFallback.js";
3
+
4
+ export interface LangchainRuntimeBindings {
5
+ createMiddleware: CreateAgentToolMiddlewareOptions["createMiddleware"];
6
+ ToolMessage: CreateAgentToolMiddlewareOptions["ToolMessage"];
7
+ }
8
+
9
+ class FallbackToolMessage {
10
+ public readonly content: string;
11
+ public readonly tool_call_id: string;
12
+
13
+ public constructor(fields: { content: string; tool_call_id: string }) {
14
+ this.content = fields.content;
15
+ this.tool_call_id = fields.tool_call_id;
16
+ }
17
+ }
18
+
19
+ export class LangchainRuntimeBindingsResolver {
20
+ public static resolve(rootDir: string): LangchainRuntimeBindings {
21
+ const createMiddleware = LangchainRuntimeBindingsResolver.resolveCreateMiddleware(
22
+ rootDir,
23
+ );
24
+ const ToolMessage = LangchainRuntimeBindingsResolver.resolveToolMessage(
25
+ rootDir,
26
+ );
27
+
28
+ return {
29
+ createMiddleware,
30
+ ToolMessage,
31
+ };
32
+ }
33
+
34
+ private static resolveCreateMiddleware(
35
+ rootDir: string,
36
+ ): CreateAgentToolMiddlewareOptions["createMiddleware"] {
37
+ try {
38
+ const mod = requireModuleFromWorkspace<{
39
+ createMiddleware?: CreateAgentToolMiddlewareOptions["createMiddleware"];
40
+ }>(rootDir, "langchain");
41
+ if (typeof mod.createMiddleware === "function") {
42
+ return mod.createMiddleware;
43
+ }
44
+ } catch {
45
+ // Ignore and use compatibility fallback.
46
+ }
47
+
48
+ // Compatibility fallback for LangChain variants that do not expose createMiddleware.
49
+ return ((definition: unknown) => definition) as CreateAgentToolMiddlewareOptions["createMiddleware"];
50
+ }
51
+
52
+ private static resolveToolMessage(
53
+ rootDir: string,
54
+ ): CreateAgentToolMiddlewareOptions["ToolMessage"] {
55
+ try {
56
+ const mod = requireModuleFromWorkspace<{
57
+ ToolMessage?: CreateAgentToolMiddlewareOptions["ToolMessage"];
58
+ }>(rootDir, "@langchain/core/messages");
59
+ if (typeof mod.ToolMessage === "function") {
60
+ return mod.ToolMessage;
61
+ }
62
+ } catch {
63
+ // Ignore and use compatibility fallback.
64
+ }
65
+ return FallbackToolMessage as unknown as CreateAgentToolMiddlewareOptions["ToolMessage"];
66
+ }
67
+ }
@@ -0,0 +1,54 @@
1
+ import { requireModuleFromWorkspace } from "./shared/moduleFallback.js";
2
+
3
+ interface LocalShellBackendConstructorLike {
4
+ new (options?: {
5
+ rootDir?: string;
6
+ inheritEnv?: boolean;
7
+ timeout?: number;
8
+ maxOutputBytes?: number;
9
+ }): unknown;
10
+ create(options?: {
11
+ rootDir?: string;
12
+ inheritEnv?: boolean;
13
+ timeout?: number;
14
+ maxOutputBytes?: number;
15
+ }): Promise<unknown>;
16
+ }
17
+
18
+ const DEFAULT_BACKEND_TIMEOUT_MS = 15_000;
19
+
20
+ export interface LocalShellBackendOptions {
21
+ rootDir?: string;
22
+ inheritEnv?: boolean;
23
+ timeout?: number;
24
+ maxOutputBytes?: number;
25
+ }
26
+
27
+ export class LocalShellBackendService {
28
+ public static async create(rootDir: string, options: LocalShellBackendOptions = {}): Promise<unknown> {
29
+ const {
30
+ inheritEnv = true,
31
+ timeout = DEFAULT_BACKEND_TIMEOUT_MS,
32
+ maxOutputBytes,
33
+ } = options;
34
+ const { LocalShellBackend } = requireModuleFromWorkspace<{
35
+ LocalShellBackend: LocalShellBackendConstructorLike;
36
+ }>(rootDir, "deepagents");
37
+
38
+ if (typeof LocalShellBackend.create === "function") {
39
+ return LocalShellBackend.create({
40
+ rootDir,
41
+ inheritEnv,
42
+ timeout,
43
+ maxOutputBytes,
44
+ });
45
+ }
46
+
47
+ return new LocalShellBackend({
48
+ rootDir,
49
+ inheritEnv,
50
+ timeout,
51
+ maxOutputBytes,
52
+ });
53
+ }
54
+ }
@@ -0,0 +1,17 @@
1
+ import {
2
+ OpenAILocalAgentService,
3
+ type CreateOpenAILocalAgentOptions,
4
+ type OpenAILocalAgentParts,
5
+ } from "./openaiLocalAgent.js";
6
+
7
+ export interface CreateOpenAIDeepAgentOptions extends CreateOpenAILocalAgentOptions {}
8
+
9
+ export interface CreateOpenAIDeepAgentResult extends OpenAILocalAgentParts {}
10
+
11
+ export class OpenAIDeepAgentService {
12
+ public static async create(
13
+ options: CreateOpenAIDeepAgentOptions,
14
+ ): Promise<CreateOpenAIDeepAgentResult> {
15
+ return OpenAILocalAgentService.create(options);
16
+ }
17
+ }
@@ -0,0 +1,35 @@
1
+ import { AgentProbe } from "./shared/agentProbe.js";
2
+ import { OpenAILocalAgentFactory, type CreateOpenAILocalAgentOptions, type OpenAILocalAgentParts } from "./openaiLocalAgentFactory.js";
3
+ import { ResourceCloser } from "./shared/resourceCloser.js";
4
+
5
+ export type { CreateOpenAILocalAgentOptions } from "./openaiLocalAgentFactory.js";
6
+ export interface OpenAILocalAgentPartsWithClose extends OpenAILocalAgentParts {
7
+ close(): Promise<void>;
8
+ }
9
+ export type { OpenAILocalAgentPartsWithClose as OpenAILocalAgentParts };
10
+
11
+ export class OpenAILocalAgentService implements OpenAILocalAgentParts {
12
+ public readonly modelName: string;
13
+ public readonly model: unknown;
14
+ public readonly skills: string[];
15
+ public readonly backend: unknown;
16
+ public readonly agent: unknown;
17
+
18
+ private constructor(parts: OpenAILocalAgentParts) {
19
+ this.modelName = parts.modelName;
20
+ this.model = parts.model;
21
+ this.skills = parts.skills;
22
+ this.backend = parts.backend;
23
+ this.agent = parts.agent;
24
+ }
25
+
26
+ public static async create(options: CreateOpenAILocalAgentOptions): Promise<OpenAILocalAgentService> {
27
+ const parts = await OpenAILocalAgentFactory.create(options);
28
+ await AgentProbe.probeStream(parts.agent);
29
+ return new OpenAILocalAgentService(parts);
30
+ }
31
+
32
+ public async close(): Promise<void> {
33
+ await ResourceCloser.closeAll([this.agent, this.backend]);
34
+ }
35
+ }
@@ -0,0 +1,185 @@
1
+ import { resolve } from "node:path";
2
+ import { AgentMemoryStoreAdapter, type AgentMemoryStoreAdapterOptions } from "@botbotgo/memory";
3
+ import { resolveAgentSkillRootsFromToolConfig } from "@botbotgo/kit";
4
+ import { BackendResolver, type AgentBackendConfig } from "./backendResolver.js";
5
+ import {
6
+ requireAgentRuntimeChatModel,
7
+ requireAgentRuntimeMemory,
8
+ requireAgentRuntimeTools,
9
+ } from "../context/agentContext.js";
10
+ import { requireModuleFromWorkspace } from "./shared/moduleFallback.js";
11
+
12
+ interface CreateDeepAgentLike {
13
+ (params: {
14
+ backend: unknown;
15
+ skills: string[];
16
+ model: unknown;
17
+ tools?: unknown[];
18
+ systemPrompt?: string;
19
+ store?: unknown;
20
+ middleware?: unknown[];
21
+ }): unknown;
22
+ }
23
+
24
+ export interface CreateOpenAILocalAgentOptions {
25
+ rootDir: string;
26
+ configDir?: string;
27
+ toolConfigPath?: string;
28
+ allowedToolNames?: string[];
29
+ modelConfigPath?: string;
30
+ modelCheckConnectivity?: boolean;
31
+ model?: string;
32
+ systemPrompt?: string;
33
+ temperature?: number;
34
+ maxTokens?: number;
35
+ backend?: AgentBackendConfig;
36
+ middleware?: unknown[];
37
+ logger?: (message: string) => void;
38
+ }
39
+
40
+ export interface OpenAILocalAgentParts {
41
+ modelName: string;
42
+ model: unknown;
43
+ skills: string[];
44
+ backend: unknown;
45
+ agent: unknown;
46
+ }
47
+
48
+ export class OpenAILocalAgentFactory {
49
+ public static async create(options: CreateOpenAILocalAgentOptions): Promise<OpenAILocalAgentParts> {
50
+ const settings = this.resolveSettings(options);
51
+ const { createDeepAgent } = requireModuleFromWorkspace<{ createDeepAgent: CreateDeepAgentLike }>(
52
+ settings.rootDir,
53
+ "deepagents",
54
+ );
55
+ const skills = settings.requestedToolConfigPath
56
+ ? resolveAgentSkillRootsFromToolConfig({ configFilePath: settings.requestedToolConfigPath })
57
+ : [];
58
+ const backend = await BackendResolver.create(settings.rootDir, settings.backendConfig);
59
+ const tools = this.resolveTools(settings.allowedToolNames, settings.logger);
60
+ const memoryStore = this.createMemoryStore();
61
+ const { modelName, model, runtimeModel } = this.resolveModel(settings);
62
+ this.logIgnoredConfig(settings);
63
+
64
+ return {
65
+ modelName,
66
+ model,
67
+ skills,
68
+ backend,
69
+ agent: createDeepAgent({
70
+ backend,
71
+ skills,
72
+ model: runtimeModel,
73
+ tools,
74
+ systemPrompt: settings.requestedSystemPrompt,
75
+ store: memoryStore,
76
+ middleware: settings.middleware,
77
+ }),
78
+ };
79
+ }
80
+
81
+ private static resolveSettings(options: CreateOpenAILocalAgentOptions) {
82
+ return {
83
+ rootDir: options.rootDir,
84
+ configDir: options.configDir ?? resolve(options.rootDir, "config"),
85
+ requestedToolConfigPath: options.toolConfigPath,
86
+ allowedToolNames: options.allowedToolNames,
87
+ requestedModelConfigPath: options.modelConfigPath,
88
+ requestedModelCheckConnectivity: options.modelCheckConnectivity,
89
+ requestedModel: options.model,
90
+ requestedSystemPrompt: options.systemPrompt,
91
+ temperature: options.temperature,
92
+ requestedMaxTokens: options.maxTokens,
93
+ backendConfig: options.backend,
94
+ middleware: options.middleware ?? [],
95
+ logger: options.logger ?? (() => {}),
96
+ };
97
+ }
98
+
99
+ private static resolveTools(allowedToolNames: string[] | undefined, logger: (message: string) => void): unknown[] {
100
+ const tools = requireAgentRuntimeTools<unknown[]>();
101
+ this.logToolSet("loaded", tools, logger);
102
+ const filteredTools = this.filterToolsByAllowlist(tools, allowedToolNames);
103
+ this.logToolSet("filtered", filteredTools, logger);
104
+ return filteredTools;
105
+ }
106
+
107
+ private static logToolSet(label: string, tools: unknown[], logger: (message: string) => void): void {
108
+ if (process.env.AGENT_RUNTIME_DEBUG_TOOLS !== "1") return;
109
+ const names = tools
110
+ .map((tool) => (tool as { name?: unknown })?.name)
111
+ .filter((name): name is string => typeof name === "string");
112
+ logger(`[tools] ${label} count=${names.length}`);
113
+ logger(`[tools] ${label} sample=${names.slice(0, 20).join(", ")}`);
114
+ }
115
+
116
+ private static createMemoryStore(): AgentMemoryStoreAdapter {
117
+ const memoryClient = requireAgentRuntimeMemory<AgentMemoryStoreAdapterOptions["agentMemory"]>();
118
+ return new AgentMemoryStoreAdapter({ agentMemory: memoryClient });
119
+ }
120
+
121
+ private static resolveModel(settings: ReturnType<typeof OpenAILocalAgentFactory.resolveSettings>) {
122
+ const model = requireAgentRuntimeChatModel<unknown>();
123
+ const modelName = settings.requestedModel ?? "(context.chatModel)";
124
+ settings.logger(`[config] model=${modelName}`);
125
+ return {
126
+ modelName,
127
+ model,
128
+ runtimeModel: this.applyRuntimeOverrides(model, {
129
+ temperature: settings.temperature,
130
+ maxTokens: settings.requestedMaxTokens,
131
+ }),
132
+ };
133
+ }
134
+
135
+ private static logIgnoredConfig(settings: ReturnType<typeof OpenAILocalAgentFactory.resolveSettings>): void {
136
+ if (settings.requestedModelConfigPath) {
137
+ settings.logger(`[config] modelConfigPath is ignored in AgentContext mode: ${settings.requestedModelConfigPath}`);
138
+ }
139
+ if (settings.requestedModelCheckConnectivity != null) {
140
+ settings.logger("[config] modelCheckConnectivity is ignored in AgentContext mode");
141
+ }
142
+ if (settings.requestedModel) {
143
+ settings.logger(`[config] model override is ignored in AgentContext mode: ${settings.requestedModel}`);
144
+ }
145
+ }
146
+
147
+ private static applyRuntimeOverrides(
148
+ model: unknown,
149
+ options: { temperature?: number; maxTokens?: number },
150
+ ): unknown {
151
+ const bind = (model as { bind?: (kwargs: Record<string, unknown>) => unknown })?.bind;
152
+ if (typeof bind !== "function") return model;
153
+ const kwargs: Record<string, unknown> = {};
154
+ if (typeof options.temperature === "number") kwargs.temperature = options.temperature;
155
+ if (typeof options.maxTokens === "number") kwargs.max_tokens = options.maxTokens;
156
+ return Object.keys(kwargs).length === 0 ? model : bind.call(model, kwargs);
157
+ }
158
+
159
+ private static filterToolsByAllowlist(tools: unknown[], allowedToolNames?: string[]): unknown[] {
160
+ if (!allowedToolNames?.length) return tools;
161
+ const matcher = this.buildAllowlistMatcher(allowedToolNames);
162
+ return tools.filter((tool) => {
163
+ const name = (tool as { name?: unknown })?.name;
164
+ return typeof name !== "string" || matcher(name);
165
+ });
166
+ }
167
+
168
+ private static buildAllowlistMatcher(allowedToolNames: string[]): (name: string) => boolean {
169
+ const exact = new Set<string>();
170
+ const short = new Set<string>();
171
+ for (const raw of allowedToolNames) {
172
+ const name = raw.trim();
173
+ if (!name) continue;
174
+ if (name.includes(".")) exact.add(name);
175
+ else short.add(name);
176
+ }
177
+ return (candidate: string): boolean => {
178
+ if (exact.has(candidate) || short.has(candidate)) return true;
179
+ for (const name of short) {
180
+ if (candidate.endsWith(`.${name}`)) return true;
181
+ }
182
+ return false;
183
+ };
184
+ }
185
+ }
@@ -0,0 +1,24 @@
1
+ export class AgentProbe {
2
+ public static async probeStream(agent: unknown): Promise<void> {
3
+ const streamOwner = agent as {
4
+ stream?: (
5
+ input: unknown,
6
+ options: { configurable: { thread_id: string }; streamMode: "values" }
7
+ ) => Promise<AsyncIterable<unknown>>;
8
+ };
9
+ if (typeof streamOwner?.stream !== "function") return;
10
+
11
+ const stream = await streamOwner.stream(
12
+ { messages: [{ role: "user", content: "Probe request: respond briefly." }] },
13
+ { configurable: { thread_id: `probe-${Date.now()}` }, streamMode: "values" },
14
+ );
15
+ const iterator = stream[Symbol.asyncIterator]();
16
+ await Promise.race([
17
+ iterator.next(),
18
+ new Promise<never>((_, reject) => setTimeout(() => reject(new Error("model probe timeout")), 15_000)),
19
+ ]);
20
+ if (typeof iterator.return === "function") {
21
+ await iterator.return().catch(() => {});
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,41 @@
1
+ import { createRequire } from "node:module";
2
+ import { resolve } from "node:path";
3
+
4
+ const FALLBACK_PACKAGE_ROOTS = [
5
+ "..",
6
+ "../framework/kit",
7
+ "../agent-runtime",
8
+ "../kit",
9
+ "../apps/itermbot",
10
+ "../apps/imessagebot",
11
+ "../../framework/kit",
12
+ "../../agent-runtime",
13
+ "../../kit",
14
+ "../../apps/itermbot",
15
+ "../../apps/imessagebot",
16
+ ] as const;
17
+
18
+ export function requireModuleFromWorkspace<T = unknown>(
19
+ rootDir: string,
20
+ moduleName: string,
21
+ ): T {
22
+ const packageRoots = [
23
+ rootDir,
24
+ ...FALLBACK_PACKAGE_ROOTS.map((rel) => resolve(rootDir, rel)),
25
+ ];
26
+
27
+ let lastError: unknown;
28
+ for (const packageRoot of packageRoots) {
29
+ try {
30
+ const requireFromRoot = createRequire(resolve(packageRoot, "package.json"));
31
+ return requireFromRoot(moduleName) as T;
32
+ } catch (error) {
33
+ lastError = error;
34
+ }
35
+ }
36
+
37
+ throw new Error(
38
+ `Cannot resolve module '${moduleName}' from roots: ${packageRoots.join(", ")}. ` +
39
+ `Last error: ${String(lastError)}`,
40
+ );
41
+ }
@@ -0,0 +1,30 @@
1
+ const CLOSE_METHOD_ORDER = ["destroy", "dispose", "shutdown", "close"] as const;
2
+ const CLOSE_TIMEOUT_MS = 1_500;
3
+
4
+ export class ResourceCloser {
5
+ public static async closeAll(targets: unknown[]): Promise<void> {
6
+ await Promise.all(targets.map((target) => this.tryCloseHandle(target)));
7
+ }
8
+
9
+ private static async tryCloseHandle(target: unknown): Promise<void> {
10
+ if (!target || typeof target !== "object") return;
11
+ const closeLike = target as Record<string, unknown>;
12
+ for (const method of CLOSE_METHOD_ORDER) {
13
+ const fn = closeLike[method];
14
+ if (typeof fn === "function") {
15
+ await this.withTimeout(Promise.resolve(fn.call(target)), CLOSE_TIMEOUT_MS).catch(() => {});
16
+ return;
17
+ }
18
+ }
19
+ }
20
+
21
+ private static async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T | undefined> {
22
+ return Promise.race([
23
+ promise,
24
+ new Promise<undefined>((resolve) => {
25
+ const timer = setTimeout(() => resolve(undefined), timeoutMs);
26
+ if (typeof timer.unref === "function") timer.unref();
27
+ }),
28
+ ]);
29
+ }
30
+ }