@minded-ai/mindedjs 1.0.0-ec2-beta-1

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 (454) hide show
  1. package/README.md +6 -0
  2. package/dist/agent.d.ts +256 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +896 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/browserTask/README.md +419 -0
  7. package/dist/browserTask/browserAgent.py +632 -0
  8. package/dist/browserTask/captcha_isolated.png +0 -0
  9. package/dist/browserTask/executeBrowserTask.d.ts +14 -0
  10. package/dist/browserTask/executeBrowserTask.d.ts.map +1 -0
  11. package/dist/browserTask/executeBrowserTask.js +195 -0
  12. package/dist/browserTask/executeBrowserTask.js.map +1 -0
  13. package/dist/browserTask/executeBrowserTask.py +153 -0
  14. package/dist/browserTask/executeBrowserTask.ts +79 -0
  15. package/dist/browserTask/localBrowserTask.d.ts +49 -0
  16. package/dist/browserTask/localBrowserTask.d.ts.map +1 -0
  17. package/dist/browserTask/localBrowserTask.js +284 -0
  18. package/dist/browserTask/localBrowserTask.js.map +1 -0
  19. package/dist/browserTask/requirements.txt +8 -0
  20. package/dist/browserTask/setup.sh +144 -0
  21. package/dist/browserTask/types.d.ts +35 -0
  22. package/dist/browserTask/types.d.ts.map +1 -0
  23. package/dist/browserTask/types.js +10 -0
  24. package/dist/browserTask/types.js.map +1 -0
  25. package/dist/checkpointer/checkpointSaverFactory.d.ts +7 -0
  26. package/dist/checkpointer/checkpointSaverFactory.d.ts.map +1 -0
  27. package/dist/checkpointer/checkpointSaverFactory.js +53 -0
  28. package/dist/checkpointer/checkpointSaverFactory.js.map +1 -0
  29. package/dist/cli/index.d.ts +3 -0
  30. package/dist/cli/index.d.ts.map +1 -0
  31. package/dist/cli/index.js +209 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/cli/lambdaHandlerTemplate.d.ts +10 -0
  34. package/dist/cli/lambdaHandlerTemplate.d.ts.map +1 -0
  35. package/dist/cli/lambdaHandlerTemplate.js +76 -0
  36. package/dist/cli/lambdaHandlerTemplate.js.map +1 -0
  37. package/dist/cli/lambdaHandlerTemplate.ts +78 -0
  38. package/dist/cli/localOperatorSetup.d.ts +6 -0
  39. package/dist/cli/localOperatorSetup.d.ts.map +1 -0
  40. package/dist/cli/localOperatorSetup.js +310 -0
  41. package/dist/cli/localOperatorSetup.js.map +1 -0
  42. package/dist/debugging/index.d.ts +2 -0
  43. package/dist/debugging/index.d.ts.map +1 -0
  44. package/dist/debugging/index.js +6 -0
  45. package/dist/debugging/index.js.map +1 -0
  46. package/dist/debugging/llmCallbackHandler.d.ts +36 -0
  47. package/dist/debugging/llmCallbackHandler.d.ts.map +1 -0
  48. package/dist/debugging/llmCallbackHandler.js +101 -0
  49. package/dist/debugging/llmCallbackHandler.js.map +1 -0
  50. package/dist/edges/createDirectEdge.d.ts +4 -0
  51. package/dist/edges/createDirectEdge.d.ts.map +1 -0
  52. package/dist/edges/createDirectEdge.js +24 -0
  53. package/dist/edges/createDirectEdge.js.map +1 -0
  54. package/dist/edges/createLogicalRouter.d.ts +8 -0
  55. package/dist/edges/createLogicalRouter.d.ts.map +1 -0
  56. package/dist/edges/createLogicalRouter.js +194 -0
  57. package/dist/edges/createLogicalRouter.js.map +1 -0
  58. package/dist/edges/createPromptRouter.d.ts +12 -0
  59. package/dist/edges/createPromptRouter.d.ts.map +1 -0
  60. package/dist/edges/createPromptRouter.js +176 -0
  61. package/dist/edges/createPromptRouter.js.map +1 -0
  62. package/dist/edges/edgeFactory.d.ts +14 -0
  63. package/dist/edges/edgeFactory.d.ts.map +1 -0
  64. package/dist/edges/edgeFactory.js +125 -0
  65. package/dist/edges/edgeFactory.js.map +1 -0
  66. package/dist/events/AgentEvents.d.ts +56 -0
  67. package/dist/events/AgentEvents.d.ts.map +1 -0
  68. package/dist/events/AgentEvents.js +13 -0
  69. package/dist/events/AgentEvents.js.map +1 -0
  70. package/dist/events/index.d.ts +3 -0
  71. package/dist/events/index.d.ts.map +1 -0
  72. package/dist/events/index.js +5 -0
  73. package/dist/events/index.js.map +1 -0
  74. package/dist/index.d.ts +35 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +98 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/interfaces/zendesk.d.ts +35 -0
  79. package/dist/interfaces/zendesk.d.ts.map +1 -0
  80. package/dist/interfaces/zendesk.js +219 -0
  81. package/dist/interfaces/zendesk.js.map +1 -0
  82. package/dist/internalTools/appActionRunnerTool.d.ts +5 -0
  83. package/dist/internalTools/appActionRunnerTool.d.ts.map +1 -0
  84. package/dist/internalTools/appActionRunnerTool.js +88 -0
  85. package/dist/internalTools/appActionRunnerTool.js.map +1 -0
  86. package/dist/internalTools/documentExtraction/documentExtraction.d.ts +129 -0
  87. package/dist/internalTools/documentExtraction/documentExtraction.d.ts.map +1 -0
  88. package/dist/internalTools/documentExtraction/documentExtraction.js +736 -0
  89. package/dist/internalTools/documentExtraction/documentExtraction.js.map +1 -0
  90. package/dist/internalTools/documentExtraction/types.d.ts +29 -0
  91. package/dist/internalTools/documentExtraction/types.d.ts.map +1 -0
  92. package/dist/internalTools/documentExtraction/types.js +35 -0
  93. package/dist/internalTools/documentExtraction/types.js.map +1 -0
  94. package/dist/internalTools/libraryActionRunnerTool.d.ts +4 -0
  95. package/dist/internalTools/libraryActionRunnerTool.d.ts.map +1 -0
  96. package/dist/internalTools/libraryActionRunnerTool.js +53 -0
  97. package/dist/internalTools/libraryActionRunnerTool.js.map +1 -0
  98. package/dist/internalTools/retell.d.ts +12 -0
  99. package/dist/internalTools/retell.d.ts.map +1 -0
  100. package/dist/internalTools/retell.js +54 -0
  101. package/dist/internalTools/retell.js.map +1 -0
  102. package/dist/internalTools/sendPlaceholderMessage.d.ts +14 -0
  103. package/dist/internalTools/sendPlaceholderMessage.d.ts.map +1 -0
  104. package/dist/internalTools/sendPlaceholderMessage.js +61 -0
  105. package/dist/internalTools/sendPlaceholderMessage.js.map +1 -0
  106. package/dist/internalTools/timer.d.ts +99 -0
  107. package/dist/internalTools/timer.d.ts.map +1 -0
  108. package/dist/internalTools/timer.js +139 -0
  109. package/dist/internalTools/timer.js.map +1 -0
  110. package/dist/internalTools/voice/escalateVoiceCall.d.ts +2 -0
  111. package/dist/internalTools/voice/escalateVoiceCall.d.ts.map +1 -0
  112. package/dist/internalTools/voice/escalateVoiceCall.js +52 -0
  113. package/dist/internalTools/voice/escalateVoiceCall.js.map +1 -0
  114. package/dist/internalTools/voice/retell.d.ts +12 -0
  115. package/dist/internalTools/voice/retell.d.ts.map +1 -0
  116. package/dist/internalTools/voice/retell.js +54 -0
  117. package/dist/internalTools/voice/retell.js.map +1 -0
  118. package/dist/internalTools/voice/sendPlaceholderMessage.d.ts +14 -0
  119. package/dist/internalTools/voice/sendPlaceholderMessage.d.ts.map +1 -0
  120. package/dist/internalTools/voice/sendPlaceholderMessage.js +61 -0
  121. package/dist/internalTools/voice/sendPlaceholderMessage.js.map +1 -0
  122. package/dist/interrupts/BaseInterruptSessionManager.d.ts +49 -0
  123. package/dist/interrupts/BaseInterruptSessionManager.d.ts.map +1 -0
  124. package/dist/interrupts/BaseInterruptSessionManager.js +34 -0
  125. package/dist/interrupts/BaseInterruptSessionManager.js.map +1 -0
  126. package/dist/interrupts/MemoryInterruptSessionManager.d.ts +14 -0
  127. package/dist/interrupts/MemoryInterruptSessionManager.d.ts.map +1 -0
  128. package/dist/interrupts/MemoryInterruptSessionManager.js +60 -0
  129. package/dist/interrupts/MemoryInterruptSessionManager.js.map +1 -0
  130. package/dist/interrupts/MindedInterruptSessionManager.d.ts +13 -0
  131. package/dist/interrupts/MindedInterruptSessionManager.d.ts.map +1 -0
  132. package/dist/interrupts/MindedInterruptSessionManager.js +162 -0
  133. package/dist/interrupts/MindedInterruptSessionManager.js.map +1 -0
  134. package/dist/interrupts/interruptSessionManagerFactory.d.ts +3 -0
  135. package/dist/interrupts/interruptSessionManagerFactory.d.ts.map +1 -0
  136. package/dist/interrupts/interruptSessionManagerFactory.js +56 -0
  137. package/dist/interrupts/interruptSessionManagerFactory.js.map +1 -0
  138. package/dist/llm/createLlmInstance.d.ts +3 -0
  139. package/dist/llm/createLlmInstance.d.ts.map +1 -0
  140. package/dist/llm/createLlmInstance.js +31 -0
  141. package/dist/llm/createLlmInstance.js.map +1 -0
  142. package/dist/nodes/addAppToolNode.d.ts +13 -0
  143. package/dist/nodes/addAppToolNode.d.ts.map +1 -0
  144. package/dist/nodes/addAppToolNode.js +87 -0
  145. package/dist/nodes/addAppToolNode.js.map +1 -0
  146. package/dist/nodes/addBrowserTaskNode.d.ts +13 -0
  147. package/dist/nodes/addBrowserTaskNode.d.ts.map +1 -0
  148. package/dist/nodes/addBrowserTaskNode.js +167 -0
  149. package/dist/nodes/addBrowserTaskNode.js.map +1 -0
  150. package/dist/nodes/addBrowserTaskRunNode.d.ts +13 -0
  151. package/dist/nodes/addBrowserTaskRunNode.d.ts.map +1 -0
  152. package/dist/nodes/addBrowserTaskRunNode.js +167 -0
  153. package/dist/nodes/addBrowserTaskRunNode.js.map +1 -0
  154. package/dist/nodes/addHumanInTheLoopNode.d.ts +9 -0
  155. package/dist/nodes/addHumanInTheLoopNode.d.ts.map +1 -0
  156. package/dist/nodes/addHumanInTheLoopNode.js +22 -0
  157. package/dist/nodes/addHumanInTheLoopNode.js.map +1 -0
  158. package/dist/nodes/addJumpToNode.d.ts +7 -0
  159. package/dist/nodes/addJumpToNode.d.ts.map +1 -0
  160. package/dist/nodes/addJumpToNode.js +24 -0
  161. package/dist/nodes/addJumpToNode.js.map +1 -0
  162. package/dist/nodes/addJunctionNode.d.ts +7 -0
  163. package/dist/nodes/addJunctionNode.d.ts.map +1 -0
  164. package/dist/nodes/addJunctionNode.js +20 -0
  165. package/dist/nodes/addJunctionNode.js.map +1 -0
  166. package/dist/nodes/addPromptNode.d.ts +18 -0
  167. package/dist/nodes/addPromptNode.d.ts.map +1 -0
  168. package/dist/nodes/addPromptNode.js +253 -0
  169. package/dist/nodes/addPromptNode.js.map +1 -0
  170. package/dist/nodes/addRpaNode.d.ts +18 -0
  171. package/dist/nodes/addRpaNode.d.ts.map +1 -0
  172. package/dist/nodes/addRpaNode.js +180 -0
  173. package/dist/nodes/addRpaNode.js.map +1 -0
  174. package/dist/nodes/addToolNode.d.ts +13 -0
  175. package/dist/nodes/addToolNode.d.ts.map +1 -0
  176. package/dist/nodes/addToolNode.js +67 -0
  177. package/dist/nodes/addToolNode.js.map +1 -0
  178. package/dist/nodes/addToolRunNode.d.ts +17 -0
  179. package/dist/nodes/addToolRunNode.d.ts.map +1 -0
  180. package/dist/nodes/addToolRunNode.js +59 -0
  181. package/dist/nodes/addToolRunNode.js.map +1 -0
  182. package/dist/nodes/addTriggerNode.d.ts +7 -0
  183. package/dist/nodes/addTriggerNode.d.ts.map +1 -0
  184. package/dist/nodes/addTriggerNode.js +25 -0
  185. package/dist/nodes/addTriggerNode.js.map +1 -0
  186. package/dist/nodes/compilePrompt.d.ts +5 -0
  187. package/dist/nodes/compilePrompt.d.ts.map +1 -0
  188. package/dist/nodes/compilePrompt.js +76 -0
  189. package/dist/nodes/compilePrompt.js.map +1 -0
  190. package/dist/nodes/nodeFactory.d.ts +16 -0
  191. package/dist/nodes/nodeFactory.d.ts.map +1 -0
  192. package/dist/nodes/nodeFactory.js +45 -0
  193. package/dist/nodes/nodeFactory.js.map +1 -0
  194. package/dist/nodes/rpaStepsExecutor.d.ts +5 -0
  195. package/dist/nodes/rpaStepsExecutor.d.ts.map +1 -0
  196. package/dist/nodes/rpaStepsExecutor.js +156 -0
  197. package/dist/nodes/rpaStepsExecutor.js.map +1 -0
  198. package/dist/platform/config.d.ts +16 -0
  199. package/dist/platform/config.d.ts.map +1 -0
  200. package/dist/platform/config.js +80 -0
  201. package/dist/platform/config.js.map +1 -0
  202. package/dist/platform/mindedCheckpointSaver.d.ts +10 -0
  203. package/dist/platform/mindedCheckpointSaver.d.ts.map +1 -0
  204. package/dist/platform/mindedCheckpointSaver.js +137 -0
  205. package/dist/platform/mindedCheckpointSaver.js.map +1 -0
  206. package/dist/platform/mindedConnection.d.ts +15 -0
  207. package/dist/platform/mindedConnection.d.ts.map +1 -0
  208. package/dist/platform/mindedConnection.js +254 -0
  209. package/dist/platform/mindedConnection.js.map +1 -0
  210. package/dist/platform/mindedConnectionTypes.d.ts +404 -0
  211. package/dist/platform/mindedConnectionTypes.d.ts.map +1 -0
  212. package/dist/platform/mindedConnectionTypes.js +51 -0
  213. package/dist/platform/mindedConnectionTypes.js.map +1 -0
  214. package/dist/platform/models/mindedChatOpenAI.d.ts +20 -0
  215. package/dist/platform/models/mindedChatOpenAI.d.ts.map +1 -0
  216. package/dist/platform/models/mindedChatOpenAI.js +32 -0
  217. package/dist/platform/models/mindedChatOpenAI.js.map +1 -0
  218. package/dist/platform/models/parallelWrapper.d.ts +17 -0
  219. package/dist/platform/models/parallelWrapper.d.ts.map +1 -0
  220. package/dist/platform/models/parallelWrapper.js +105 -0
  221. package/dist/platform/models/parallelWrapper.js.map +1 -0
  222. package/dist/platform/piiGateway/gateway.d.ts +14 -0
  223. package/dist/platform/piiGateway/gateway.d.ts.map +1 -0
  224. package/dist/platform/piiGateway/gateway.js +117 -0
  225. package/dist/platform/piiGateway/gateway.js.map +1 -0
  226. package/dist/platform/piiGateway/index.d.ts +3 -0
  227. package/dist/platform/piiGateway/index.d.ts.map +1 -0
  228. package/dist/platform/piiGateway/index.js +7 -0
  229. package/dist/platform/piiGateway/index.js.map +1 -0
  230. package/dist/platform/piiGateway/types.d.ts +27 -0
  231. package/dist/platform/piiGateway/types.d.ts.map +1 -0
  232. package/dist/platform/piiGateway/types.js +3 -0
  233. package/dist/platform/piiGateway/types.js.map +1 -0
  234. package/dist/platform/toolExecutor.d.ts +29 -0
  235. package/dist/platform/toolExecutor.d.ts.map +1 -0
  236. package/dist/platform/toolExecutor.js +84 -0
  237. package/dist/platform/toolExecutor.js.map +1 -0
  238. package/dist/platform/utils/parseAttachments.d.ts +14 -0
  239. package/dist/platform/utils/parseAttachments.d.ts.map +1 -0
  240. package/dist/platform/utils/parseAttachments.js +53 -0
  241. package/dist/platform/utils/parseAttachments.js.map +1 -0
  242. package/dist/platform/utils/tools.d.ts +6 -0
  243. package/dist/platform/utils/tools.d.ts.map +1 -0
  244. package/dist/platform/utils/tools.js +57 -0
  245. package/dist/platform/utils/tools.js.map +1 -0
  246. package/dist/playbooks/playbooks.d.ts +15 -0
  247. package/dist/playbooks/playbooks.d.ts.map +1 -0
  248. package/dist/playbooks/playbooks.js +208 -0
  249. package/dist/playbooks/playbooks.js.map +1 -0
  250. package/dist/toolsLibrary/classifier.d.ts +74 -0
  251. package/dist/toolsLibrary/classifier.d.ts.map +1 -0
  252. package/dist/toolsLibrary/classifier.js +256 -0
  253. package/dist/toolsLibrary/classifier.js.map +1 -0
  254. package/dist/toolsLibrary/extraction.d.ts +83 -0
  255. package/dist/toolsLibrary/extraction.d.ts.map +1 -0
  256. package/dist/toolsLibrary/extraction.js +328 -0
  257. package/dist/toolsLibrary/extraction.js.map +1 -0
  258. package/dist/toolsLibrary/index.d.ts +9 -0
  259. package/dist/toolsLibrary/index.d.ts.map +1 -0
  260. package/dist/toolsLibrary/index.js +46 -0
  261. package/dist/toolsLibrary/index.js.map +1 -0
  262. package/dist/toolsLibrary/parseDocument.d.ts +30 -0
  263. package/dist/toolsLibrary/parseDocument.d.ts.map +1 -0
  264. package/dist/toolsLibrary/parseDocument.js +119 -0
  265. package/dist/toolsLibrary/parseDocument.js.map +1 -0
  266. package/dist/triggers/triggerTypeToDefaultMessage.d.ts +4 -0
  267. package/dist/triggers/triggerTypeToDefaultMessage.d.ts.map +1 -0
  268. package/dist/triggers/triggerTypeToDefaultMessage.js +10 -0
  269. package/dist/triggers/triggerTypeToDefaultMessage.js.map +1 -0
  270. package/dist/types/Agent.types.d.ts +60 -0
  271. package/dist/types/Agent.types.d.ts.map +1 -0
  272. package/dist/types/Agent.types.js +9 -0
  273. package/dist/types/Agent.types.js.map +1 -0
  274. package/dist/types/Flows.types.d.ts +232 -0
  275. package/dist/types/Flows.types.d.ts.map +1 -0
  276. package/dist/types/Flows.types.js +65 -0
  277. package/dist/types/Flows.types.js.map +1 -0
  278. package/dist/types/LLM.types.d.ts +7 -0
  279. package/dist/types/LLM.types.d.ts.map +1 -0
  280. package/dist/types/LLM.types.js +11 -0
  281. package/dist/types/LLM.types.js.map +1 -0
  282. package/dist/types/LangGraph.types.d.ts +45 -0
  283. package/dist/types/LangGraph.types.d.ts.map +1 -0
  284. package/dist/types/LangGraph.types.js +77 -0
  285. package/dist/types/LangGraph.types.js.map +1 -0
  286. package/dist/types/Platform.types.d.ts +7 -0
  287. package/dist/types/Platform.types.d.ts.map +1 -0
  288. package/dist/types/Platform.types.js +11 -0
  289. package/dist/types/Platform.types.js.map +1 -0
  290. package/dist/types/Tools.types.d.ts +26 -0
  291. package/dist/types/Tools.types.d.ts.map +1 -0
  292. package/dist/types/Tools.types.js +3 -0
  293. package/dist/types/Tools.types.js.map +1 -0
  294. package/dist/types/Voice.types.d.ts +5 -0
  295. package/dist/types/Voice.types.d.ts.map +1 -0
  296. package/dist/types/Voice.types.js +3 -0
  297. package/dist/types/Voice.types.js.map +1 -0
  298. package/dist/utils/agentUtils.d.ts +5 -0
  299. package/dist/utils/agentUtils.d.ts.map +1 -0
  300. package/dist/utils/agentUtils.js +97 -0
  301. package/dist/utils/agentUtils.js.map +1 -0
  302. package/dist/utils/extractStateMemoryResponse.d.ts +5 -0
  303. package/dist/utils/extractStateMemoryResponse.d.ts.map +1 -0
  304. package/dist/utils/extractStateMemoryResponse.js +91 -0
  305. package/dist/utils/extractStateMemoryResponse.js.map +1 -0
  306. package/dist/utils/history.d.ts +4 -0
  307. package/dist/utils/history.d.ts.map +1 -0
  308. package/dist/utils/history.js +33 -0
  309. package/dist/utils/history.js.map +1 -0
  310. package/dist/utils/logger.d.ts +3 -0
  311. package/dist/utils/logger.d.ts.map +1 -0
  312. package/dist/utils/logger.js +39 -0
  313. package/dist/utils/logger.js.map +1 -0
  314. package/dist/utils/schemaUtils.d.ts +15 -0
  315. package/dist/utils/schemaUtils.d.ts.map +1 -0
  316. package/dist/utils/schemaUtils.js +56 -0
  317. package/dist/utils/schemaUtils.js.map +1 -0
  318. package/dist/utils/wait.d.ts +2 -0
  319. package/dist/utils/wait.d.ts.map +1 -0
  320. package/dist/utils/wait.js +6 -0
  321. package/dist/utils/wait.js.map +1 -0
  322. package/dist/voice/elevenLabsUtils.d.ts +65 -0
  323. package/dist/voice/elevenLabsUtils.d.ts.map +1 -0
  324. package/dist/voice/elevenLabsUtils.js +4 -0
  325. package/dist/voice/elevenLabsUtils.js.map +1 -0
  326. package/dist/voice/voiceSession.d.ts +37 -0
  327. package/dist/voice/voiceSession.d.ts.map +1 -0
  328. package/dist/voice/voiceSession.js +306 -0
  329. package/dist/voice/voiceSession.js.map +1 -0
  330. package/docs/.gitbook/assets/ADLC.png +0 -0
  331. package/docs/.gitbook/assets/PII-masking.png +0 -0
  332. package/docs/.gitbook/assets/image.png +0 -0
  333. package/docs/.gitbook/assets/on-prem.svg +4 -0
  334. package/docs/README.md +54 -0
  335. package/docs/SUMMARY.md +56 -0
  336. package/docs/examples/order-refund-flow.md +566 -0
  337. package/docs/getting-started/environment-configuration.md +158 -0
  338. package/docs/getting-started/installation.md +44 -0
  339. package/docs/getting-started/project-configuration.md +206 -0
  340. package/docs/getting-started/quick-start.md +262 -0
  341. package/docs/integrations/zendesk.md +554 -0
  342. package/docs/low-code-editor/edges.md +396 -0
  343. package/docs/low-code-editor/flows.md +74 -0
  344. package/docs/low-code-editor/nodes.md +367 -0
  345. package/docs/low-code-editor/playbooks.md +280 -0
  346. package/docs/low-code-editor/tools.md +358 -0
  347. package/docs/low-code-editor/triggers.md +182 -0
  348. package/docs/platform/on-prem.md +182 -0
  349. package/docs/platform/operator.md +89 -0
  350. package/docs/platform/pii-masking.md +221 -0
  351. package/docs/platform/scenarios.md +43 -0
  352. package/docs/platform/secrets.md +99 -0
  353. package/docs/platform/sso.md +27 -0
  354. package/docs/resources/your-first-eval.md +108 -0
  355. package/docs/sdk/agent-api.md +540 -0
  356. package/docs/sdk/debugging.md +80 -0
  357. package/docs/sdk/events.md +595 -0
  358. package/docs/sdk/logging.md +72 -0
  359. package/docs/sdk/memory.md +271 -0
  360. package/docs/sdk/parallel-llm.md +242 -0
  361. package/docs/sdk/vectorstore-query.md +60 -0
  362. package/docs/tooling/classifier.md +217 -0
  363. package/docs/tooling/document-processing.md +389 -0
  364. package/docs/tooling/extraction.md +78 -0
  365. package/docs/tooling/timers.md +61 -0
  366. package/package.json +73 -0
  367. package/src/agent.ts +1019 -0
  368. package/src/browserTask/executeBrowserTask.py +153 -0
  369. package/src/browserTask/executeBrowserTask.ts +253 -0
  370. package/src/browserTask/localBrowserTask.ts +300 -0
  371. package/src/browserTask/profile/Default/Extension Rules/000003.log +0 -0
  372. package/src/browserTask/profile/Default/Extension Scripts/000003.log +0 -0
  373. package/src/browserTask/profile/Default/Extension State/000003.log +0 -0
  374. package/src/browserTask/profile/Default/GCM Store/000003.log +0 -0
  375. package/src/browserTask/profile/Default/Local Storage/leveldb/000004.log +0 -0
  376. package/src/browserTask/profile/Default/Session Storage/000003.log +0 -0
  377. package/src/browserTask/profile/Default/Site Characteristics Database/000003.log +0 -0
  378. package/src/browserTask/profile/Default/Sync Data/LevelDB/000003.log +0 -0
  379. package/src/browserTask/profile/Default/shared_proto_db/000003.log +0 -0
  380. package/src/browserTask/profile/Default/shared_proto_db/metadata/000003.log +0 -0
  381. package/src/browserTask/types.ts +37 -0
  382. package/src/checkpointer/checkpointSaverFactory.ts +18 -0
  383. package/src/cli/index.ts +188 -0
  384. package/src/cli/lambdaHandlerTemplate.ts +78 -0
  385. package/src/cli/localOperatorSetup.ts +308 -0
  386. package/src/debugging/index.ts +1 -0
  387. package/src/debugging/llmCallbackHandler.ts +125 -0
  388. package/src/edges/createDirectEdge.ts +22 -0
  389. package/src/edges/createLogicalRouter.ts +182 -0
  390. package/src/edges/createPromptRouter.ts +213 -0
  391. package/src/edges/edgeFactory.ts +167 -0
  392. package/src/events/AgentEvents.ts +58 -0
  393. package/src/events/index.ts +3 -0
  394. package/src/index.ts +105 -0
  395. package/src/interfaces/zendesk.ts +212 -0
  396. package/src/internalTools/appActionRunnerTool.ts +68 -0
  397. package/src/internalTools/documentExtraction/documentExtraction.ts +804 -0
  398. package/src/internalTools/documentExtraction/types.ts +59 -0
  399. package/src/internalTools/libraryActionRunnerTool.ts +62 -0
  400. package/src/internalTools/timer.ts +125 -0
  401. package/src/internalTools/voice/escalateVoiceCall.ts +15 -0
  402. package/src/internalTools/voice/retell.ts +28 -0
  403. package/src/internalTools/voice/sendPlaceholderMessage.ts +27 -0
  404. package/src/interrupts/BaseInterruptSessionManager.ts +80 -0
  405. package/src/interrupts/MemoryInterruptSessionManager.ts +63 -0
  406. package/src/interrupts/MindedInterruptSessionManager.ts +163 -0
  407. package/src/interrupts/interruptSessionManagerFactory.ts +20 -0
  408. package/src/llm/createLlmInstance.ts +33 -0
  409. package/src/nodes/addAppToolNode.ts +111 -0
  410. package/src/nodes/addBrowserTaskNode.ts +191 -0
  411. package/src/nodes/addBrowserTaskRunNode.ts +190 -0
  412. package/src/nodes/addHumanInTheLoopNode.ts +26 -0
  413. package/src/nodes/addJumpToNode.ts +26 -0
  414. package/src/nodes/addJunctionNode.ts +21 -0
  415. package/src/nodes/addPromptNode.ts +305 -0
  416. package/src/nodes/addRpaNode.ts +217 -0
  417. package/src/nodes/addToolNode.ts +84 -0
  418. package/src/nodes/addToolRunNode.ts +80 -0
  419. package/src/nodes/addTriggerNode.ts +27 -0
  420. package/src/nodes/compilePrompt.ts +44 -0
  421. package/src/nodes/nodeFactory.ts +61 -0
  422. package/src/nodes/rpaStepsExecutor.ts +175 -0
  423. package/src/platform/config.ts +89 -0
  424. package/src/platform/mindedCheckpointSaver.ts +146 -0
  425. package/src/platform/mindedConnection.ts +250 -0
  426. package/src/platform/mindedConnectionTypes.ts +495 -0
  427. package/src/platform/models/mindedChatOpenAI.ts +49 -0
  428. package/src/platform/models/parallelWrapper.ts +141 -0
  429. package/src/platform/piiGateway/gateway.ts +103 -0
  430. package/src/platform/piiGateway/index.ts +5 -0
  431. package/src/platform/piiGateway/types.ts +29 -0
  432. package/src/platform/toolExecutor.ts +106 -0
  433. package/src/platform/utils/parseAttachments.ts +56 -0
  434. package/src/platform/utils/tools.ts +55 -0
  435. package/src/playbooks/playbooks.ts +200 -0
  436. package/src/toolsLibrary/classifier.ts +326 -0
  437. package/src/toolsLibrary/extraction.ts +393 -0
  438. package/src/toolsLibrary/index.ts +10 -0
  439. package/src/toolsLibrary/parseDocument.ts +129 -0
  440. package/src/triggers/triggerTypeToDefaultMessage.ts +9 -0
  441. package/src/types/Agent.types.ts +73 -0
  442. package/src/types/Flows.types.ts +262 -0
  443. package/src/types/LLM.types.ts +15 -0
  444. package/src/types/LangGraph.types.ts +86 -0
  445. package/src/types/Platform.types.ts +6 -0
  446. package/src/types/Tools.types.ts +28 -0
  447. package/src/types/Voice.types.ts +4 -0
  448. package/src/utils/agentUtils.ts +69 -0
  449. package/src/utils/history.ts +38 -0
  450. package/src/utils/logger.ts +38 -0
  451. package/src/utils/schemaUtils.ts +68 -0
  452. package/src/utils/wait.ts +1 -0
  453. package/src/voice/elevenLabsUtils.ts +81 -0
  454. package/src/voice/voiceSession.ts +309 -0
@@ -0,0 +1,804 @@
1
+ import { ZodSchema, ZodTypeAny } from 'zod';
2
+ import { BaseLanguageModel } from '@langchain/core/language_models/base';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import { logger } from '../../utils/logger';
6
+ import * as os from 'os';
7
+ import { DocumentExtractionOptions, DocumentProcessingResult, DocumentProcessorConfig, SUPPORTED_DOCUMENT_TYPES } from './types';
8
+
9
+ /**
10
+ * Extract data from documents using AI or return raw text.
11
+ *
12
+ * This function allows you to process various document types (PDFs, images, Word docs, etc.)
13
+ * in multiple ways:
14
+ * - With LLM + Schema: Extract structured data according to a Zod schema
15
+ * - With LLM + System Prompt: Extract unstructured data based on prompt instructions
16
+ * - Without LLM: Extract raw text content using LlamaParse
17
+ *
18
+ * @param options - Document extraction options
19
+ * @param options.llm - Optional language model for AI-powered extraction
20
+ * @param options.documentPath - Path to the document file
21
+ * @param options.documentContent - Document content as Buffer or string
22
+ * @param options.documentUrl - URL to fetch the document from
23
+ * @param options.schema - Optional Zod schema for structured data extraction
24
+ * @param options.systemPrompt - Optional prompt for guiding extraction
25
+ * @param options.config - Optional document processor configuration
26
+ *
27
+ * @returns Promise resolving to extracted data/text and metadata
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * import { extractFromDocument } from '@minded-ai/mindedjs';
32
+ * import { z } from 'zod';
33
+ *
34
+ * // Extract structured data with schema
35
+ * const result1 = await extractFromDocument({
36
+ * llm: agent.llm,
37
+ * documentPath: './invoice.pdf',
38
+ * schema: z.object({
39
+ * invoiceNumber: z.string(),
40
+ * amount: z.number(),
41
+ * })
42
+ * });
43
+ *
44
+ * // Extract unstructured data with prompt
45
+ * const result2 = await extractFromDocument({
46
+ * llm: agent.llm,
47
+ * documentPath: './contract.pdf',
48
+ * systemPrompt: 'Extract all payment terms and conditions'
49
+ * });
50
+ *
51
+ * // Extract raw text without LLM
52
+ * const result3 = await extractFromDocument({
53
+ * documentPath: './document.pdf'
54
+ * });
55
+ * ```
56
+ */
57
+ export async function extractFromDocument<T = string>(options: {
58
+ llm?: BaseLanguageModel;
59
+ documentPath?: string;
60
+ documentContent?: Buffer | string;
61
+ documentUrl?: string;
62
+ schema?: ZodSchema<T>;
63
+ systemPrompt?: string;
64
+ config?: DocumentProcessorConfig;
65
+ }): Promise<{
66
+ data: T;
67
+ metadata: {
68
+ fileSize?: number;
69
+ fileType: string;
70
+ processingTime: number;
71
+ contentLength: number;
72
+ };
73
+ }> {
74
+ // Create a document processor
75
+ const processor = new DocumentProcessor(options.config, options.llm);
76
+
77
+ // Extract from document using the processor
78
+ return processor.extractFromDocument({
79
+ documentPath: options.documentPath,
80
+ documentContent: options.documentContent,
81
+ documentUrl: options.documentUrl,
82
+ schema: options.schema,
83
+ systemPrompt: options.systemPrompt,
84
+ });
85
+ }
86
+
87
+ /**
88
+ * Generic document processor that can extract structured data from various document types
89
+ * including images, PDFs, Word documents, spreadsheets, and more.
90
+ */
91
+ export class DocumentProcessor {
92
+ private config: DocumentProcessorConfig;
93
+ private llm: BaseLanguageModel | null = null;
94
+ private llamaCloudApiKey: string | null = null;
95
+ private sharpModule: any = null;
96
+ private sharpLoadAttempted = false;
97
+
98
+ constructor(config: DocumentProcessorConfig = {}, llm?: BaseLanguageModel) {
99
+ this.config = {
100
+ maxImageWidth: 1200,
101
+ imageQuality: 85,
102
+ useBase64: false,
103
+ ...config,
104
+ };
105
+
106
+ this.llm = llm || null;
107
+ this.llamaCloudApiKey = this.config.llamaCloudApiKey || process.env.LLAMA_CLOUD_API_KEY || null;
108
+ }
109
+
110
+ /**
111
+ * Parse document using LlamaCloud REST API
112
+ */
113
+ private async parseWithLlamaCloud(filePath: string): Promise<string | null> {
114
+ if (!this.llamaCloudApiKey) {
115
+ return null;
116
+ }
117
+
118
+ try {
119
+ // Step 1: Upload file and start parsing
120
+ const fileContent = fs.readFileSync(filePath);
121
+ const fileName = path.basename(filePath);
122
+ const mimeType = this.getMimeType(path.extname(filePath));
123
+
124
+ const formData = new FormData();
125
+ const blob = new Blob([fileContent], { type: mimeType });
126
+ formData.append('file', blob, fileName);
127
+ formData.append('premium_mode', 'true');
128
+
129
+ const uploadResponse = await fetch('https://api.cloud.llamaindex.ai/api/v1/parsing/upload', {
130
+ method: 'POST',
131
+ headers: {
132
+ Accept: 'application/json',
133
+ Authorization: `Bearer ${this.llamaCloudApiKey}`,
134
+ },
135
+ body: formData,
136
+ });
137
+
138
+ if (!uploadResponse.ok) {
139
+ const errorText = await uploadResponse.text();
140
+ throw new Error(`Failed to upload file: ${uploadResponse.status} - ${errorText}`);
141
+ }
142
+
143
+ const uploadResult = await uploadResponse.json();
144
+ const jobId = uploadResult.id || uploadResult.job_id;
145
+
146
+ if (!jobId) {
147
+ throw new Error('No job ID returned from upload');
148
+ }
149
+
150
+ logger.info({
151
+ msg: '[DocumentProcessor] File uploaded to LlamaCloud',
152
+ jobId,
153
+ fileName,
154
+ });
155
+
156
+ // Step 2: Poll for job completion
157
+ let attempts = 0;
158
+ const maxAttempts = 60; // 60 attempts with 2 second delay = 2 minutes max
159
+ const pollDelay = 2000; // 2 seconds
160
+
161
+ while (attempts < maxAttempts) {
162
+ const statusResponse = await fetch(`https://api.cloud.llamaindex.ai/api/v1/parsing/job/${jobId}`, {
163
+ method: 'GET',
164
+ headers: {
165
+ Accept: 'application/json',
166
+ Authorization: `Bearer ${this.llamaCloudApiKey}`,
167
+ },
168
+ });
169
+
170
+ if (!statusResponse.ok) {
171
+ throw new Error(`Failed to check job status: ${statusResponse.status}`);
172
+ }
173
+
174
+ const statusResult = await statusResponse.json();
175
+ const status = statusResult.status || statusResult.job_status;
176
+
177
+ if (status === 'SUCCESS' || status === 'COMPLETED' || status === 'completed') {
178
+ // Step 3: Retrieve results in Markdown
179
+
180
+ // Create an AbortController for timeout
181
+ const controller = new AbortController();
182
+ const timeout = setTimeout(() => controller.abort(), 20000); // 20 second timeout
183
+
184
+ let resultResponse;
185
+ try {
186
+ resultResponse = await fetch(`https://api.cloud.llamaindex.ai/api/v1/parsing/job/${jobId}/result/markdown`, {
187
+ method: 'GET',
188
+ headers: {
189
+ Accept: 'application/json',
190
+ Authorization: `Bearer ${this.llamaCloudApiKey}`,
191
+ },
192
+ signal: controller.signal,
193
+ });
194
+ } catch (fetchError) {
195
+ clearTimeout(timeout);
196
+ if (fetchError instanceof Error && fetchError.name === 'AbortError') {
197
+ throw new Error('Timeout fetching results from LlamaCloud after 20 seconds');
198
+ }
199
+ throw fetchError;
200
+ }
201
+
202
+ clearTimeout(timeout);
203
+
204
+ if (!resultResponse.ok) {
205
+ const errorText = await resultResponse.text();
206
+ throw new Error(`Failed to retrieve results: ${resultResponse.status} - ${errorText}`);
207
+ }
208
+
209
+ let resultData: any;
210
+ try {
211
+ // Read response using manual stream reading (more reliable than text())
212
+ let responseText;
213
+ if (resultResponse.body) {
214
+ const reader = resultResponse.body.getReader();
215
+ const chunks: Uint8Array[] = [];
216
+ let totalLength = 0;
217
+
218
+ try {
219
+ while (true) {
220
+ const { done, value } = await reader.read();
221
+ if (done) break;
222
+ if (value) {
223
+ chunks.push(value);
224
+ totalLength += value.length;
225
+ }
226
+ }
227
+
228
+ // Combine chunks
229
+ const combined = new Uint8Array(totalLength);
230
+ let offset = 0;
231
+ for (const chunk of chunks) {
232
+ combined.set(chunk, offset);
233
+ offset += chunk.length;
234
+ }
235
+
236
+ responseText = new TextDecoder().decode(combined);
237
+ } finally {
238
+ reader.releaseLock();
239
+ }
240
+ } else {
241
+ responseText = await resultResponse.text();
242
+ }
243
+
244
+ // Try to parse as JSON, but if it fails, use the text directly
245
+ try {
246
+ resultData = JSON.parse(responseText);
247
+ } catch {
248
+ // If it's not JSON, assume it's the markdown content directly
249
+ resultData = responseText;
250
+ }
251
+ } catch (textError) {
252
+ logger.error({
253
+ msg: '[DocumentProcessor] Failed to read response text',
254
+ jobId,
255
+ error: textError instanceof Error ? textError.message : String(textError),
256
+ stack: textError instanceof Error ? textError.stack : undefined,
257
+ });
258
+ throw new Error('Failed to read response from LlamaCloud');
259
+ }
260
+
261
+ logger.debug({
262
+ msg: '[DocumentProcessor] Result data structure',
263
+ jobId,
264
+ dataType: typeof resultData,
265
+ keys: typeof resultData === 'object' && resultData !== null ? Object.keys(resultData) : [],
266
+ hasMarkdown: typeof resultData === 'object' && 'markdown' in resultData,
267
+ hasContent: typeof resultData === 'object' && 'content' in resultData,
268
+ hasText: typeof resultData === 'object' && 'text' in resultData,
269
+ });
270
+
271
+ // The API might return the markdown directly as a string or nested in an object
272
+ let markdownContent: string;
273
+ if (typeof resultData === 'string') {
274
+ markdownContent = resultData;
275
+ } else {
276
+ markdownContent = resultData.markdown || resultData.content || resultData.text || '';
277
+ }
278
+
279
+ if (!markdownContent) {
280
+ logger.error({
281
+ msg: '[DocumentProcessor] No content in result',
282
+ jobId,
283
+ resultData: JSON.stringify(resultData).substring(0, 500),
284
+ });
285
+ throw new Error('No content returned from parsing');
286
+ }
287
+
288
+ logger.info({
289
+ msg: '[DocumentProcessor] Successfully parsed document with LlamaCloud',
290
+ jobId,
291
+ contentLength: markdownContent.length,
292
+ preview: markdownContent.substring(0, 100),
293
+ });
294
+
295
+ logger.debug({
296
+ msg: '[DocumentProcessor] About to return markdown content',
297
+ jobId,
298
+ });
299
+
300
+ return markdownContent;
301
+ } else if (status === 'FAILED' || status === 'ERROR' || status === 'failed') {
302
+ throw new Error(`Parsing job failed: ${statusResult.error || 'Unknown error'}`);
303
+ }
304
+
305
+ // Wait before next attempt
306
+ await new Promise((resolve) => setTimeout(resolve, pollDelay));
307
+ attempts++;
308
+ }
309
+
310
+ throw new Error('Parsing job timed out after 2 minutes');
311
+ } catch (err) {
312
+ logger.warn({
313
+ message: '[DocumentProcessor] LlamaCloud parsing failed',
314
+ err,
315
+ });
316
+ return null;
317
+ } finally {
318
+ logger.debug({
319
+ msg: '[DocumentProcessor] parseWithLlamaCloud finished',
320
+ filePath,
321
+ });
322
+ }
323
+ }
324
+
325
+ /**
326
+ * Get MIME type for file extension
327
+ */
328
+ private getMimeType(fileExtension: string): string {
329
+ const mimeTypes: { [key: string]: string } = {
330
+ '.pdf': 'application/pdf',
331
+ '.doc': 'application/msword',
332
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
333
+ '.txt': 'text/plain',
334
+ '.rtf': 'application/rtf',
335
+ '.jpg': 'image/jpeg',
336
+ '.jpeg': 'image/jpeg',
337
+ '.png': 'image/png',
338
+ '.gif': 'image/gif',
339
+ '.bmp': 'image/bmp',
340
+ '.webp': 'image/webp',
341
+ '.tiff': 'image/tiff',
342
+ '.xls': 'application/vnd.ms-excel',
343
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
344
+ '.csv': 'text/csv',
345
+ '.html': 'text/html',
346
+ '.htm': 'text/html',
347
+ '.xml': 'application/xml',
348
+ '.md': 'text/markdown',
349
+ };
350
+
351
+ return mimeTypes[fileExtension.toLowerCase()] || 'application/octet-stream';
352
+ }
353
+
354
+ /**
355
+ * Extract data from a document - either structured data using AI or raw text
356
+ */
357
+ async extractFromDocument<T = string>(options: DocumentExtractionOptions): Promise<DocumentProcessingResult<T>> {
358
+ logger.debug({
359
+ msg: '[DocumentProcessor] extractFromDocument called',
360
+ hasDocumentPath: !!options.documentPath,
361
+ hasDocumentUrl: !!options.documentUrl,
362
+ hasDocumentContent: !!options.documentContent,
363
+ hasLLM: !!this.llm,
364
+ hasSchema: !!options.schema,
365
+ });
366
+
367
+ const startTime = Date.now();
368
+
369
+ try {
370
+ logger.debug({
371
+ msg: '[DocumentProcessor] Getting document content',
372
+ });
373
+
374
+ // Determine document source and content
375
+ const { content, fileType, fileSize } = await this.getDocumentContent(options);
376
+
377
+ // Process document content based on type
378
+ let processedContent: string;
379
+
380
+ if (this.isImageFile(fileType)) {
381
+ processedContent = await this.processImageDocument(content as Buffer, fileType, options.documentPath);
382
+ } else {
383
+ processedContent = await this.processTextDocument(content, options.documentPath, fileType);
384
+ }
385
+
386
+ logger.info({
387
+ msg: '[DocumentProcessor] Document content processed',
388
+ fileType,
389
+ contentLength: processedContent.length,
390
+ });
391
+
392
+ const processingTime = Date.now() - startTime;
393
+
394
+ // If no LLM is provided, return the raw text content
395
+ if (!this.llm) {
396
+ return {
397
+ data: processedContent as T,
398
+ metadata: {
399
+ fileSize,
400
+ fileType,
401
+ processingTime,
402
+ contentLength: processedContent.length,
403
+ },
404
+ };
405
+ }
406
+
407
+ // If LLM is provided, extract data (structured or unstructured)
408
+ const extractedData = await this.extractStructuredData<T>(processedContent, options.schema, options.llmConfig, options.systemPrompt);
409
+
410
+ return {
411
+ data: extractedData,
412
+ metadata: {
413
+ fileSize,
414
+ fileType,
415
+ processingTime,
416
+ contentLength: processedContent.length,
417
+ },
418
+ };
419
+ } catch (err) {
420
+ logger.error({
421
+ message: '[DocumentProcessor] Document processing failed',
422
+ err,
423
+ });
424
+ throw new Error(`Document processing failed: ${err instanceof Error ? err.message : String(err)}`);
425
+ }
426
+ }
427
+
428
+ /**
429
+ * Get document content from various sources
430
+ */
431
+ private async getDocumentContent(options: DocumentExtractionOptions): Promise<{
432
+ content: Buffer | string;
433
+ fileType: string;
434
+ fileSize?: number;
435
+ }> {
436
+ logger.debug({
437
+ msg: '[DocumentProcessor] getDocumentContent called',
438
+ hasPath: !!options.documentPath,
439
+ hasContent: !!options.documentContent,
440
+ hasUrl: !!options.documentUrl,
441
+ });
442
+
443
+ // From file path
444
+ if (options.documentPath) {
445
+ if (!fs.existsSync(options.documentPath)) {
446
+ throw new Error(`Document not found: ${options.documentPath}`);
447
+ }
448
+
449
+ const content = fs.readFileSync(options.documentPath);
450
+ const fileType = path.extname(options.documentPath).toLowerCase();
451
+
452
+ return {
453
+ content,
454
+ fileType,
455
+ fileSize: content.length,
456
+ };
457
+ }
458
+
459
+ // From provided content
460
+ if (options.documentContent) {
461
+ // Try to infer file type from content if it's a buffer
462
+ let fileType = '.unknown';
463
+ if (Buffer.isBuffer(options.documentContent)) {
464
+ fileType = this.inferFileTypeFromBuffer(options.documentContent);
465
+ } else if (typeof options.documentContent === 'string') {
466
+ fileType = '.txt'; // Assume text content
467
+ }
468
+
469
+ return {
470
+ content: options.documentContent,
471
+ fileType,
472
+ fileSize: Buffer.isBuffer(options.documentContent) ? options.documentContent.length : Buffer.byteLength(options.documentContent),
473
+ };
474
+ }
475
+
476
+ // From URL
477
+ if (options.documentUrl) {
478
+ logger.debug({
479
+ msg: '[DocumentProcessor] Fetching document from URL',
480
+ url: options.documentUrl,
481
+ });
482
+
483
+ const response = await fetch(options.documentUrl);
484
+
485
+ logger.debug({
486
+ msg: '[DocumentProcessor] URL fetch response',
487
+ status: response.status,
488
+ ok: response.ok,
489
+ });
490
+
491
+ if (!response.ok) {
492
+ throw new Error(`Failed to fetch document from URL: ${response.statusText}`);
493
+ }
494
+
495
+ const arrayBuffer = await response.arrayBuffer();
496
+ const content = Buffer.from(arrayBuffer);
497
+ const fileType = this.inferFileTypeFromUrl(options.documentUrl) || this.inferFileTypeFromBuffer(content);
498
+
499
+ logger.debug({
500
+ msg: '[DocumentProcessor] Document fetched from URL',
501
+ contentSize: content.length,
502
+ fileType,
503
+ });
504
+
505
+ return {
506
+ content,
507
+ fileType,
508
+ fileSize: content.length,
509
+ };
510
+ }
511
+
512
+ throw new Error('No document source provided. Specify documentPath, documentContent, or documentUrl.');
513
+ }
514
+
515
+ /**
516
+ * Process image documents by converting them to a standardized format
517
+ */
518
+ private async processImageDocument(content: Buffer, fileType: string, filePath?: string): Promise<string> {
519
+ try {
520
+ // First, try to use LlamaParser if available for text extraction
521
+ if (filePath && this.llamaCloudApiKey) {
522
+ logger.debug({
523
+ msg: '[DocumentProcessor] Calling parseWithLlamaCloud for image',
524
+ filePath,
525
+ });
526
+ const parsedContent = await this.parseWithLlamaCloud(filePath);
527
+ logger.debug({
528
+ msg: '[DocumentProcessor] parseWithLlamaCloud returned for image',
529
+ hasContent: !!parsedContent,
530
+ contentLength: parsedContent?.length,
531
+ });
532
+ if (parsedContent) {
533
+ return parsedContent;
534
+ }
535
+ }
536
+
537
+ // If no file path, create a temporary file for LlamaCloud parsing
538
+ if (!filePath && this.llamaCloudApiKey) {
539
+ const tempDir = os.tmpdir();
540
+ const tempFileName = `temp_${Date.now()}${fileType}`;
541
+ const tempFilePath = path.join(tempDir, tempFileName);
542
+
543
+ logger.debug({
544
+ msg: '[DocumentProcessor] Creating temp file for image',
545
+ tempFilePath,
546
+ contentSize: content.length,
547
+ });
548
+
549
+ try {
550
+ fs.writeFileSync(tempFilePath, content);
551
+ logger.debug({
552
+ msg: '[DocumentProcessor] Calling parseWithLlamaCloud for temp image',
553
+ tempFilePath,
554
+ });
555
+ const parsedContent = await this.parseWithLlamaCloud(tempFilePath);
556
+ logger.debug({
557
+ msg: '[DocumentProcessor] parseWithLlamaCloud returned for temp image',
558
+ hasContent: !!parsedContent,
559
+ contentLength: parsedContent?.length,
560
+ });
561
+ fs.unlinkSync(tempFilePath);
562
+
563
+ if (parsedContent) {
564
+ return parsedContent;
565
+ }
566
+ } catch (err) {
567
+ // Clean up temp file on error
568
+ if (fs.existsSync(tempFilePath)) {
569
+ fs.unlinkSync(tempFilePath);
570
+ }
571
+ logger.warn({ msg: '[DocumentProcessor] Failed to parse image with LlamaCloud', err });
572
+ }
573
+ }
574
+
575
+ // Fallback: Convert to image format for LLM processing
576
+ // For PDFs, convert first page to image
577
+ if (fileType === '.pdf') {
578
+ throw new Error('Failed to convert PDF to image');
579
+ }
580
+
581
+ logger.warn({
582
+ msg: '[DocumentProcessor] Sharp module not available. Using original image without optimization.',
583
+ fileType,
584
+ contentSize: content.length,
585
+ });
586
+
587
+ // If sharp is not available, use the original image
588
+ if (this.config.useBase64) {
589
+ // Return original image as base64
590
+ const base64Image = content.toString('base64');
591
+ const mimeType = this.getMimeType(fileType);
592
+ return `data:${mimeType};base64,${base64Image}`;
593
+ } else {
594
+ // Without sharp and without base64, we cannot process the image
595
+ return `[IMAGE CONTENT - ${fileType.toUpperCase()} file. Size: ${
596
+ content.length
597
+ } bytes. Consider using LLAMA_CLOUD_API_KEY for text extraction or set useBase64: true]`;
598
+ }
599
+ } catch (err) {
600
+ throw new Error(`Failed to process image document: ${err instanceof Error ? err.message : String(err)}`);
601
+ }
602
+ }
603
+
604
+ /**
605
+ * Process text-based documents using LlamaParser or fallback methods
606
+ */
607
+ private async processTextDocument(content: Buffer | string, filePath?: string, fileType?: string): Promise<string> {
608
+ // Try LlamaCloud parsing if we have a file path
609
+ if (filePath && this.llamaCloudApiKey) {
610
+ const parsedContent = await this.parseWithLlamaCloud(filePath);
611
+ if (parsedContent) {
612
+ return parsedContent;
613
+ }
614
+ }
615
+
616
+ // If no file path but we have content and LlamaCloud API key, create a temp file
617
+ if (!filePath && this.llamaCloudApiKey && Buffer.isBuffer(content)) {
618
+ const tempDir = os.tmpdir();
619
+ const tempFileName = `temp_${Date.now()}${fileType || '.txt'}`;
620
+ const tempFilePath = path.join(tempDir, tempFileName);
621
+
622
+ try {
623
+ fs.writeFileSync(tempFilePath, content);
624
+ const parsedContent = await this.parseWithLlamaCloud(tempFilePath);
625
+ fs.unlinkSync(tempFilePath);
626
+
627
+ if (parsedContent) {
628
+ return parsedContent;
629
+ }
630
+ } catch (err) {
631
+ // Clean up temp file on error
632
+ if (fs.existsSync(tempFilePath)) {
633
+ fs.unlinkSync(tempFilePath);
634
+ }
635
+ logger.warn({ msg: '[DocumentProcessor] Failed to parse text document with LlamaCloud', err });
636
+ }
637
+ }
638
+
639
+ // Fallback: handle based on file type
640
+ if (typeof content === 'string') {
641
+ return content;
642
+ }
643
+
644
+ // For binary content, convert to text
645
+ if (fileType === '.pdf' && !this.llamaCloudApiKey) {
646
+ throw new Error('PDF processing requires LLAMA_CLOUD_API_KEY environment variable for LlamaParser');
647
+ }
648
+
649
+ // Basic text extraction for simple formats
650
+ if (['.txt', '.md', '.html', '.htm', '.xml', '.csv'].includes(fileType || '')) {
651
+ return content.toString('utf-8');
652
+ }
653
+
654
+ // For unsupported binary formats without LlamaParser
655
+ throw new Error(`Unsupported document type ${fileType}. Please provide LLAMA_CLOUD_API_KEY for advanced document processing.`);
656
+ }
657
+
658
+ /**
659
+ * Extract data using LLM - either structured with schema or unstructured with prompt
660
+ */
661
+ private async extractStructuredData<T>(
662
+ content: string,
663
+ schema?: ZodSchema<T> | ZodTypeAny,
664
+ llmConfig?: { model?: string; temperature?: number },
665
+ systemPrompt?: string,
666
+ ): Promise<T> {
667
+ if (!this.llm) {
668
+ throw new Error('LLM instance is required for data extraction. Please provide an LLM when creating the DocumentProcessor.');
669
+ }
670
+
671
+ // Note: llmConfig is ignored when using the provided LLM instance
672
+ // The LLM should already be configured with the desired model and temperature
673
+
674
+ const defaultSystemPrompt =
675
+ 'You are an expert data-extraction assistant. ' +
676
+ 'Extract the requested information from the provided document content. ' +
677
+ 'If you cannot find a value for a required field, use "N/A" or a descriptive placeholder. ' +
678
+ 'Be accurate and thorough in your extraction.';
679
+
680
+ const finalSystemPrompt = systemPrompt || defaultSystemPrompt;
681
+
682
+ try {
683
+ // If schema is provided, use structured output
684
+ if (schema) {
685
+ // Check if the LLM supports withStructuredOutput
686
+ if (!('withStructuredOutput' in this.llm)) {
687
+ throw new Error('The provided LLM does not support structured output. Please use a compatible LLM instance.');
688
+ }
689
+
690
+ const structuredLlm = (this.llm as any).withStructuredOutput(schema as any);
691
+
692
+ const result = await structuredLlm.invoke([
693
+ {
694
+ role: 'system',
695
+ content: finalSystemPrompt,
696
+ },
697
+ {
698
+ role: 'user',
699
+ content: `Please extract the following information from this document:\n\n${content}`,
700
+ },
701
+ ]);
702
+
703
+ logger.debug({
704
+ msg: '[DocumentProcessor] Structured data extraction completed',
705
+ extractedData: JSON.stringify(result, null, 2),
706
+ });
707
+
708
+ return result as T;
709
+ } else {
710
+ // Without schema, return the LLM's text response
711
+ const response = await this.llm.invoke([
712
+ {
713
+ role: 'system',
714
+ content: finalSystemPrompt,
715
+ },
716
+ {
717
+ role: 'user',
718
+ content: `Please analyze and extract information from this document:\n\n${content}`,
719
+ },
720
+ ]);
721
+
722
+ // Extract the text content from the response
723
+ let textContent: string;
724
+ if (typeof response.content === 'string') {
725
+ textContent = response.content;
726
+ } else if (Array.isArray(response.content) && response.content.length > 0) {
727
+ // Handle array of content blocks
728
+ textContent = response.content.map((block: any) => (typeof block === 'string' ? block : block.text || '')).join('\n');
729
+ } else {
730
+ textContent = String(response.content);
731
+ }
732
+
733
+ logger.debug({
734
+ msg: '[DocumentProcessor] Unstructured data extraction completed',
735
+ contentLength: textContent.length,
736
+ });
737
+
738
+ return textContent as T;
739
+ }
740
+ } catch (err) {
741
+ throw new Error(`LLM extraction failed: ${err instanceof Error ? err.message : String(err)}`);
742
+ }
743
+ }
744
+
745
+ /**
746
+ * Check if file is an image type
747
+ */
748
+ private isImageFile(fileType: string): boolean {
749
+ const imageTypes = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.tiff'];
750
+ return imageTypes.includes(fileType.toLowerCase());
751
+ }
752
+
753
+ /**
754
+ * Infer file type from buffer content
755
+ */
756
+ private inferFileTypeFromBuffer(buffer: Buffer): string {
757
+ // Check common file signatures
758
+ const signatures: { [key: string]: string } = {
759
+ '89504E47': '.png',
760
+ FFD8FF: '.jpg',
761
+ '47494638': '.gif',
762
+ '25504446': '.pdf',
763
+ '504B0304': '.zip', // Also used by docx, xlsx, pptx
764
+ D0CF11E0: '.doc', // Also xls, ppt
765
+ };
766
+
767
+ const hex = buffer.toString('hex', 0, 4).toUpperCase();
768
+
769
+ for (const [signature, type] of Object.entries(signatures)) {
770
+ if (hex.startsWith(signature)) {
771
+ return type;
772
+ }
773
+ }
774
+
775
+ return '.unknown';
776
+ }
777
+
778
+ /**
779
+ * Infer file type from URL
780
+ */
781
+ private inferFileTypeFromUrl(url: string): string | null {
782
+ try {
783
+ const pathname = new URL(url).pathname;
784
+ const extension = path.extname(pathname).toLowerCase();
785
+ return extension || null;
786
+ } catch {
787
+ return null;
788
+ }
789
+ }
790
+
791
+ /**
792
+ * Get list of supported document types
793
+ */
794
+ static getSupportedDocumentTypes(): string[] {
795
+ return [...SUPPORTED_DOCUMENT_TYPES];
796
+ }
797
+
798
+ /**
799
+ * Check if a file type is supported
800
+ */
801
+ static isDocumentTypeSupported(fileType: string): boolean {
802
+ return SUPPORTED_DOCUMENT_TYPES.includes(fileType.toLowerCase());
803
+ }
804
+ }