@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.
- package/README.md +6 -0
- package/dist/agent.d.ts +256 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +896 -0
- package/dist/agent.js.map +1 -0
- package/dist/browserTask/README.md +419 -0
- package/dist/browserTask/browserAgent.py +632 -0
- package/dist/browserTask/captcha_isolated.png +0 -0
- package/dist/browserTask/executeBrowserTask.d.ts +14 -0
- package/dist/browserTask/executeBrowserTask.d.ts.map +1 -0
- package/dist/browserTask/executeBrowserTask.js +195 -0
- package/dist/browserTask/executeBrowserTask.js.map +1 -0
- package/dist/browserTask/executeBrowserTask.py +153 -0
- package/dist/browserTask/executeBrowserTask.ts +79 -0
- package/dist/browserTask/localBrowserTask.d.ts +49 -0
- package/dist/browserTask/localBrowserTask.d.ts.map +1 -0
- package/dist/browserTask/localBrowserTask.js +284 -0
- package/dist/browserTask/localBrowserTask.js.map +1 -0
- package/dist/browserTask/requirements.txt +8 -0
- package/dist/browserTask/setup.sh +144 -0
- package/dist/browserTask/types.d.ts +35 -0
- package/dist/browserTask/types.d.ts.map +1 -0
- package/dist/browserTask/types.js +10 -0
- package/dist/browserTask/types.js.map +1 -0
- package/dist/checkpointer/checkpointSaverFactory.d.ts +7 -0
- package/dist/checkpointer/checkpointSaverFactory.d.ts.map +1 -0
- package/dist/checkpointer/checkpointSaverFactory.js +53 -0
- package/dist/checkpointer/checkpointSaverFactory.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +209 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lambdaHandlerTemplate.d.ts +10 -0
- package/dist/cli/lambdaHandlerTemplate.d.ts.map +1 -0
- package/dist/cli/lambdaHandlerTemplate.js +76 -0
- package/dist/cli/lambdaHandlerTemplate.js.map +1 -0
- package/dist/cli/lambdaHandlerTemplate.ts +78 -0
- package/dist/cli/localOperatorSetup.d.ts +6 -0
- package/dist/cli/localOperatorSetup.d.ts.map +1 -0
- package/dist/cli/localOperatorSetup.js +310 -0
- package/dist/cli/localOperatorSetup.js.map +1 -0
- package/dist/debugging/index.d.ts +2 -0
- package/dist/debugging/index.d.ts.map +1 -0
- package/dist/debugging/index.js +6 -0
- package/dist/debugging/index.js.map +1 -0
- package/dist/debugging/llmCallbackHandler.d.ts +36 -0
- package/dist/debugging/llmCallbackHandler.d.ts.map +1 -0
- package/dist/debugging/llmCallbackHandler.js +101 -0
- package/dist/debugging/llmCallbackHandler.js.map +1 -0
- package/dist/edges/createDirectEdge.d.ts +4 -0
- package/dist/edges/createDirectEdge.d.ts.map +1 -0
- package/dist/edges/createDirectEdge.js +24 -0
- package/dist/edges/createDirectEdge.js.map +1 -0
- package/dist/edges/createLogicalRouter.d.ts +8 -0
- package/dist/edges/createLogicalRouter.d.ts.map +1 -0
- package/dist/edges/createLogicalRouter.js +194 -0
- package/dist/edges/createLogicalRouter.js.map +1 -0
- package/dist/edges/createPromptRouter.d.ts +12 -0
- package/dist/edges/createPromptRouter.d.ts.map +1 -0
- package/dist/edges/createPromptRouter.js +176 -0
- package/dist/edges/createPromptRouter.js.map +1 -0
- package/dist/edges/edgeFactory.d.ts +14 -0
- package/dist/edges/edgeFactory.d.ts.map +1 -0
- package/dist/edges/edgeFactory.js +125 -0
- package/dist/edges/edgeFactory.js.map +1 -0
- package/dist/events/AgentEvents.d.ts +56 -0
- package/dist/events/AgentEvents.d.ts.map +1 -0
- package/dist/events/AgentEvents.js +13 -0
- package/dist/events/AgentEvents.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +5 -0
- package/dist/events/index.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/zendesk.d.ts +35 -0
- package/dist/interfaces/zendesk.d.ts.map +1 -0
- package/dist/interfaces/zendesk.js +219 -0
- package/dist/interfaces/zendesk.js.map +1 -0
- package/dist/internalTools/appActionRunnerTool.d.ts +5 -0
- package/dist/internalTools/appActionRunnerTool.d.ts.map +1 -0
- package/dist/internalTools/appActionRunnerTool.js +88 -0
- package/dist/internalTools/appActionRunnerTool.js.map +1 -0
- package/dist/internalTools/documentExtraction/documentExtraction.d.ts +129 -0
- package/dist/internalTools/documentExtraction/documentExtraction.d.ts.map +1 -0
- package/dist/internalTools/documentExtraction/documentExtraction.js +736 -0
- package/dist/internalTools/documentExtraction/documentExtraction.js.map +1 -0
- package/dist/internalTools/documentExtraction/types.d.ts +29 -0
- package/dist/internalTools/documentExtraction/types.d.ts.map +1 -0
- package/dist/internalTools/documentExtraction/types.js +35 -0
- package/dist/internalTools/documentExtraction/types.js.map +1 -0
- package/dist/internalTools/libraryActionRunnerTool.d.ts +4 -0
- package/dist/internalTools/libraryActionRunnerTool.d.ts.map +1 -0
- package/dist/internalTools/libraryActionRunnerTool.js +53 -0
- package/dist/internalTools/libraryActionRunnerTool.js.map +1 -0
- package/dist/internalTools/retell.d.ts +12 -0
- package/dist/internalTools/retell.d.ts.map +1 -0
- package/dist/internalTools/retell.js +54 -0
- package/dist/internalTools/retell.js.map +1 -0
- package/dist/internalTools/sendPlaceholderMessage.d.ts +14 -0
- package/dist/internalTools/sendPlaceholderMessage.d.ts.map +1 -0
- package/dist/internalTools/sendPlaceholderMessage.js +61 -0
- package/dist/internalTools/sendPlaceholderMessage.js.map +1 -0
- package/dist/internalTools/timer.d.ts +99 -0
- package/dist/internalTools/timer.d.ts.map +1 -0
- package/dist/internalTools/timer.js +139 -0
- package/dist/internalTools/timer.js.map +1 -0
- package/dist/internalTools/voice/escalateVoiceCall.d.ts +2 -0
- package/dist/internalTools/voice/escalateVoiceCall.d.ts.map +1 -0
- package/dist/internalTools/voice/escalateVoiceCall.js +52 -0
- package/dist/internalTools/voice/escalateVoiceCall.js.map +1 -0
- package/dist/internalTools/voice/retell.d.ts +12 -0
- package/dist/internalTools/voice/retell.d.ts.map +1 -0
- package/dist/internalTools/voice/retell.js +54 -0
- package/dist/internalTools/voice/retell.js.map +1 -0
- package/dist/internalTools/voice/sendPlaceholderMessage.d.ts +14 -0
- package/dist/internalTools/voice/sendPlaceholderMessage.d.ts.map +1 -0
- package/dist/internalTools/voice/sendPlaceholderMessage.js +61 -0
- package/dist/internalTools/voice/sendPlaceholderMessage.js.map +1 -0
- package/dist/interrupts/BaseInterruptSessionManager.d.ts +49 -0
- package/dist/interrupts/BaseInterruptSessionManager.d.ts.map +1 -0
- package/dist/interrupts/BaseInterruptSessionManager.js +34 -0
- package/dist/interrupts/BaseInterruptSessionManager.js.map +1 -0
- package/dist/interrupts/MemoryInterruptSessionManager.d.ts +14 -0
- package/dist/interrupts/MemoryInterruptSessionManager.d.ts.map +1 -0
- package/dist/interrupts/MemoryInterruptSessionManager.js +60 -0
- package/dist/interrupts/MemoryInterruptSessionManager.js.map +1 -0
- package/dist/interrupts/MindedInterruptSessionManager.d.ts +13 -0
- package/dist/interrupts/MindedInterruptSessionManager.d.ts.map +1 -0
- package/dist/interrupts/MindedInterruptSessionManager.js +162 -0
- package/dist/interrupts/MindedInterruptSessionManager.js.map +1 -0
- package/dist/interrupts/interruptSessionManagerFactory.d.ts +3 -0
- package/dist/interrupts/interruptSessionManagerFactory.d.ts.map +1 -0
- package/dist/interrupts/interruptSessionManagerFactory.js +56 -0
- package/dist/interrupts/interruptSessionManagerFactory.js.map +1 -0
- package/dist/llm/createLlmInstance.d.ts +3 -0
- package/dist/llm/createLlmInstance.d.ts.map +1 -0
- package/dist/llm/createLlmInstance.js +31 -0
- package/dist/llm/createLlmInstance.js.map +1 -0
- package/dist/nodes/addAppToolNode.d.ts +13 -0
- package/dist/nodes/addAppToolNode.d.ts.map +1 -0
- package/dist/nodes/addAppToolNode.js +87 -0
- package/dist/nodes/addAppToolNode.js.map +1 -0
- package/dist/nodes/addBrowserTaskNode.d.ts +13 -0
- package/dist/nodes/addBrowserTaskNode.d.ts.map +1 -0
- package/dist/nodes/addBrowserTaskNode.js +167 -0
- package/dist/nodes/addBrowserTaskNode.js.map +1 -0
- package/dist/nodes/addBrowserTaskRunNode.d.ts +13 -0
- package/dist/nodes/addBrowserTaskRunNode.d.ts.map +1 -0
- package/dist/nodes/addBrowserTaskRunNode.js +167 -0
- package/dist/nodes/addBrowserTaskRunNode.js.map +1 -0
- package/dist/nodes/addHumanInTheLoopNode.d.ts +9 -0
- package/dist/nodes/addHumanInTheLoopNode.d.ts.map +1 -0
- package/dist/nodes/addHumanInTheLoopNode.js +22 -0
- package/dist/nodes/addHumanInTheLoopNode.js.map +1 -0
- package/dist/nodes/addJumpToNode.d.ts +7 -0
- package/dist/nodes/addJumpToNode.d.ts.map +1 -0
- package/dist/nodes/addJumpToNode.js +24 -0
- package/dist/nodes/addJumpToNode.js.map +1 -0
- package/dist/nodes/addJunctionNode.d.ts +7 -0
- package/dist/nodes/addJunctionNode.d.ts.map +1 -0
- package/dist/nodes/addJunctionNode.js +20 -0
- package/dist/nodes/addJunctionNode.js.map +1 -0
- package/dist/nodes/addPromptNode.d.ts +18 -0
- package/dist/nodes/addPromptNode.d.ts.map +1 -0
- package/dist/nodes/addPromptNode.js +253 -0
- package/dist/nodes/addPromptNode.js.map +1 -0
- package/dist/nodes/addRpaNode.d.ts +18 -0
- package/dist/nodes/addRpaNode.d.ts.map +1 -0
- package/dist/nodes/addRpaNode.js +180 -0
- package/dist/nodes/addRpaNode.js.map +1 -0
- package/dist/nodes/addToolNode.d.ts +13 -0
- package/dist/nodes/addToolNode.d.ts.map +1 -0
- package/dist/nodes/addToolNode.js +67 -0
- package/dist/nodes/addToolNode.js.map +1 -0
- package/dist/nodes/addToolRunNode.d.ts +17 -0
- package/dist/nodes/addToolRunNode.d.ts.map +1 -0
- package/dist/nodes/addToolRunNode.js +59 -0
- package/dist/nodes/addToolRunNode.js.map +1 -0
- package/dist/nodes/addTriggerNode.d.ts +7 -0
- package/dist/nodes/addTriggerNode.d.ts.map +1 -0
- package/dist/nodes/addTriggerNode.js +25 -0
- package/dist/nodes/addTriggerNode.js.map +1 -0
- package/dist/nodes/compilePrompt.d.ts +5 -0
- package/dist/nodes/compilePrompt.d.ts.map +1 -0
- package/dist/nodes/compilePrompt.js +76 -0
- package/dist/nodes/compilePrompt.js.map +1 -0
- package/dist/nodes/nodeFactory.d.ts +16 -0
- package/dist/nodes/nodeFactory.d.ts.map +1 -0
- package/dist/nodes/nodeFactory.js +45 -0
- package/dist/nodes/nodeFactory.js.map +1 -0
- package/dist/nodes/rpaStepsExecutor.d.ts +5 -0
- package/dist/nodes/rpaStepsExecutor.d.ts.map +1 -0
- package/dist/nodes/rpaStepsExecutor.js +156 -0
- package/dist/nodes/rpaStepsExecutor.js.map +1 -0
- package/dist/platform/config.d.ts +16 -0
- package/dist/platform/config.d.ts.map +1 -0
- package/dist/platform/config.js +80 -0
- package/dist/platform/config.js.map +1 -0
- package/dist/platform/mindedCheckpointSaver.d.ts +10 -0
- package/dist/platform/mindedCheckpointSaver.d.ts.map +1 -0
- package/dist/platform/mindedCheckpointSaver.js +137 -0
- package/dist/platform/mindedCheckpointSaver.js.map +1 -0
- package/dist/platform/mindedConnection.d.ts +15 -0
- package/dist/platform/mindedConnection.d.ts.map +1 -0
- package/dist/platform/mindedConnection.js +254 -0
- package/dist/platform/mindedConnection.js.map +1 -0
- package/dist/platform/mindedConnectionTypes.d.ts +404 -0
- package/dist/platform/mindedConnectionTypes.d.ts.map +1 -0
- package/dist/platform/mindedConnectionTypes.js +51 -0
- package/dist/platform/mindedConnectionTypes.js.map +1 -0
- package/dist/platform/models/mindedChatOpenAI.d.ts +20 -0
- package/dist/platform/models/mindedChatOpenAI.d.ts.map +1 -0
- package/dist/platform/models/mindedChatOpenAI.js +32 -0
- package/dist/platform/models/mindedChatOpenAI.js.map +1 -0
- package/dist/platform/models/parallelWrapper.d.ts +17 -0
- package/dist/platform/models/parallelWrapper.d.ts.map +1 -0
- package/dist/platform/models/parallelWrapper.js +105 -0
- package/dist/platform/models/parallelWrapper.js.map +1 -0
- package/dist/platform/piiGateway/gateway.d.ts +14 -0
- package/dist/platform/piiGateway/gateway.d.ts.map +1 -0
- package/dist/platform/piiGateway/gateway.js +117 -0
- package/dist/platform/piiGateway/gateway.js.map +1 -0
- package/dist/platform/piiGateway/index.d.ts +3 -0
- package/dist/platform/piiGateway/index.d.ts.map +1 -0
- package/dist/platform/piiGateway/index.js +7 -0
- package/dist/platform/piiGateway/index.js.map +1 -0
- package/dist/platform/piiGateway/types.d.ts +27 -0
- package/dist/platform/piiGateway/types.d.ts.map +1 -0
- package/dist/platform/piiGateway/types.js +3 -0
- package/dist/platform/piiGateway/types.js.map +1 -0
- package/dist/platform/toolExecutor.d.ts +29 -0
- package/dist/platform/toolExecutor.d.ts.map +1 -0
- package/dist/platform/toolExecutor.js +84 -0
- package/dist/platform/toolExecutor.js.map +1 -0
- package/dist/platform/utils/parseAttachments.d.ts +14 -0
- package/dist/platform/utils/parseAttachments.d.ts.map +1 -0
- package/dist/platform/utils/parseAttachments.js +53 -0
- package/dist/platform/utils/parseAttachments.js.map +1 -0
- package/dist/platform/utils/tools.d.ts +6 -0
- package/dist/platform/utils/tools.d.ts.map +1 -0
- package/dist/platform/utils/tools.js +57 -0
- package/dist/platform/utils/tools.js.map +1 -0
- package/dist/playbooks/playbooks.d.ts +15 -0
- package/dist/playbooks/playbooks.d.ts.map +1 -0
- package/dist/playbooks/playbooks.js +208 -0
- package/dist/playbooks/playbooks.js.map +1 -0
- package/dist/toolsLibrary/classifier.d.ts +74 -0
- package/dist/toolsLibrary/classifier.d.ts.map +1 -0
- package/dist/toolsLibrary/classifier.js +256 -0
- package/dist/toolsLibrary/classifier.js.map +1 -0
- package/dist/toolsLibrary/extraction.d.ts +83 -0
- package/dist/toolsLibrary/extraction.d.ts.map +1 -0
- package/dist/toolsLibrary/extraction.js +328 -0
- package/dist/toolsLibrary/extraction.js.map +1 -0
- package/dist/toolsLibrary/index.d.ts +9 -0
- package/dist/toolsLibrary/index.d.ts.map +1 -0
- package/dist/toolsLibrary/index.js +46 -0
- package/dist/toolsLibrary/index.js.map +1 -0
- package/dist/toolsLibrary/parseDocument.d.ts +30 -0
- package/dist/toolsLibrary/parseDocument.d.ts.map +1 -0
- package/dist/toolsLibrary/parseDocument.js +119 -0
- package/dist/toolsLibrary/parseDocument.js.map +1 -0
- package/dist/triggers/triggerTypeToDefaultMessage.d.ts +4 -0
- package/dist/triggers/triggerTypeToDefaultMessage.d.ts.map +1 -0
- package/dist/triggers/triggerTypeToDefaultMessage.js +10 -0
- package/dist/triggers/triggerTypeToDefaultMessage.js.map +1 -0
- package/dist/types/Agent.types.d.ts +60 -0
- package/dist/types/Agent.types.d.ts.map +1 -0
- package/dist/types/Agent.types.js +9 -0
- package/dist/types/Agent.types.js.map +1 -0
- package/dist/types/Flows.types.d.ts +232 -0
- package/dist/types/Flows.types.d.ts.map +1 -0
- package/dist/types/Flows.types.js +65 -0
- package/dist/types/Flows.types.js.map +1 -0
- package/dist/types/LLM.types.d.ts +7 -0
- package/dist/types/LLM.types.d.ts.map +1 -0
- package/dist/types/LLM.types.js +11 -0
- package/dist/types/LLM.types.js.map +1 -0
- package/dist/types/LangGraph.types.d.ts +45 -0
- package/dist/types/LangGraph.types.d.ts.map +1 -0
- package/dist/types/LangGraph.types.js +77 -0
- package/dist/types/LangGraph.types.js.map +1 -0
- package/dist/types/Platform.types.d.ts +7 -0
- package/dist/types/Platform.types.d.ts.map +1 -0
- package/dist/types/Platform.types.js +11 -0
- package/dist/types/Platform.types.js.map +1 -0
- package/dist/types/Tools.types.d.ts +26 -0
- package/dist/types/Tools.types.d.ts.map +1 -0
- package/dist/types/Tools.types.js +3 -0
- package/dist/types/Tools.types.js.map +1 -0
- package/dist/types/Voice.types.d.ts +5 -0
- package/dist/types/Voice.types.d.ts.map +1 -0
- package/dist/types/Voice.types.js +3 -0
- package/dist/types/Voice.types.js.map +1 -0
- package/dist/utils/agentUtils.d.ts +5 -0
- package/dist/utils/agentUtils.d.ts.map +1 -0
- package/dist/utils/agentUtils.js +97 -0
- package/dist/utils/agentUtils.js.map +1 -0
- package/dist/utils/extractStateMemoryResponse.d.ts +5 -0
- package/dist/utils/extractStateMemoryResponse.d.ts.map +1 -0
- package/dist/utils/extractStateMemoryResponse.js +91 -0
- package/dist/utils/extractStateMemoryResponse.js.map +1 -0
- package/dist/utils/history.d.ts +4 -0
- package/dist/utils/history.d.ts.map +1 -0
- package/dist/utils/history.js +33 -0
- package/dist/utils/history.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +39 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/schemaUtils.d.ts +15 -0
- package/dist/utils/schemaUtils.d.ts.map +1 -0
- package/dist/utils/schemaUtils.js +56 -0
- package/dist/utils/schemaUtils.js.map +1 -0
- package/dist/utils/wait.d.ts +2 -0
- package/dist/utils/wait.d.ts.map +1 -0
- package/dist/utils/wait.js +6 -0
- package/dist/utils/wait.js.map +1 -0
- package/dist/voice/elevenLabsUtils.d.ts +65 -0
- package/dist/voice/elevenLabsUtils.d.ts.map +1 -0
- package/dist/voice/elevenLabsUtils.js +4 -0
- package/dist/voice/elevenLabsUtils.js.map +1 -0
- package/dist/voice/voiceSession.d.ts +37 -0
- package/dist/voice/voiceSession.d.ts.map +1 -0
- package/dist/voice/voiceSession.js +306 -0
- package/dist/voice/voiceSession.js.map +1 -0
- package/docs/.gitbook/assets/ADLC.png +0 -0
- package/docs/.gitbook/assets/PII-masking.png +0 -0
- package/docs/.gitbook/assets/image.png +0 -0
- package/docs/.gitbook/assets/on-prem.svg +4 -0
- package/docs/README.md +54 -0
- package/docs/SUMMARY.md +56 -0
- package/docs/examples/order-refund-flow.md +566 -0
- package/docs/getting-started/environment-configuration.md +158 -0
- package/docs/getting-started/installation.md +44 -0
- package/docs/getting-started/project-configuration.md +206 -0
- package/docs/getting-started/quick-start.md +262 -0
- package/docs/integrations/zendesk.md +554 -0
- package/docs/low-code-editor/edges.md +396 -0
- package/docs/low-code-editor/flows.md +74 -0
- package/docs/low-code-editor/nodes.md +367 -0
- package/docs/low-code-editor/playbooks.md +280 -0
- package/docs/low-code-editor/tools.md +358 -0
- package/docs/low-code-editor/triggers.md +182 -0
- package/docs/platform/on-prem.md +182 -0
- package/docs/platform/operator.md +89 -0
- package/docs/platform/pii-masking.md +221 -0
- package/docs/platform/scenarios.md +43 -0
- package/docs/platform/secrets.md +99 -0
- package/docs/platform/sso.md +27 -0
- package/docs/resources/your-first-eval.md +108 -0
- package/docs/sdk/agent-api.md +540 -0
- package/docs/sdk/debugging.md +80 -0
- package/docs/sdk/events.md +595 -0
- package/docs/sdk/logging.md +72 -0
- package/docs/sdk/memory.md +271 -0
- package/docs/sdk/parallel-llm.md +242 -0
- package/docs/sdk/vectorstore-query.md +60 -0
- package/docs/tooling/classifier.md +217 -0
- package/docs/tooling/document-processing.md +389 -0
- package/docs/tooling/extraction.md +78 -0
- package/docs/tooling/timers.md +61 -0
- package/package.json +73 -0
- package/src/agent.ts +1019 -0
- package/src/browserTask/executeBrowserTask.py +153 -0
- package/src/browserTask/executeBrowserTask.ts +253 -0
- package/src/browserTask/localBrowserTask.ts +300 -0
- package/src/browserTask/profile/Default/Extension Rules/000003.log +0 -0
- package/src/browserTask/profile/Default/Extension Scripts/000003.log +0 -0
- package/src/browserTask/profile/Default/Extension State/000003.log +0 -0
- package/src/browserTask/profile/Default/GCM Store/000003.log +0 -0
- package/src/browserTask/profile/Default/Local Storage/leveldb/000004.log +0 -0
- package/src/browserTask/profile/Default/Session Storage/000003.log +0 -0
- package/src/browserTask/profile/Default/Site Characteristics Database/000003.log +0 -0
- package/src/browserTask/profile/Default/Sync Data/LevelDB/000003.log +0 -0
- package/src/browserTask/profile/Default/shared_proto_db/000003.log +0 -0
- package/src/browserTask/profile/Default/shared_proto_db/metadata/000003.log +0 -0
- package/src/browserTask/types.ts +37 -0
- package/src/checkpointer/checkpointSaverFactory.ts +18 -0
- package/src/cli/index.ts +188 -0
- package/src/cli/lambdaHandlerTemplate.ts +78 -0
- package/src/cli/localOperatorSetup.ts +308 -0
- package/src/debugging/index.ts +1 -0
- package/src/debugging/llmCallbackHandler.ts +125 -0
- package/src/edges/createDirectEdge.ts +22 -0
- package/src/edges/createLogicalRouter.ts +182 -0
- package/src/edges/createPromptRouter.ts +213 -0
- package/src/edges/edgeFactory.ts +167 -0
- package/src/events/AgentEvents.ts +58 -0
- package/src/events/index.ts +3 -0
- package/src/index.ts +105 -0
- package/src/interfaces/zendesk.ts +212 -0
- package/src/internalTools/appActionRunnerTool.ts +68 -0
- package/src/internalTools/documentExtraction/documentExtraction.ts +804 -0
- package/src/internalTools/documentExtraction/types.ts +59 -0
- package/src/internalTools/libraryActionRunnerTool.ts +62 -0
- package/src/internalTools/timer.ts +125 -0
- package/src/internalTools/voice/escalateVoiceCall.ts +15 -0
- package/src/internalTools/voice/retell.ts +28 -0
- package/src/internalTools/voice/sendPlaceholderMessage.ts +27 -0
- package/src/interrupts/BaseInterruptSessionManager.ts +80 -0
- package/src/interrupts/MemoryInterruptSessionManager.ts +63 -0
- package/src/interrupts/MindedInterruptSessionManager.ts +163 -0
- package/src/interrupts/interruptSessionManagerFactory.ts +20 -0
- package/src/llm/createLlmInstance.ts +33 -0
- package/src/nodes/addAppToolNode.ts +111 -0
- package/src/nodes/addBrowserTaskNode.ts +191 -0
- package/src/nodes/addBrowserTaskRunNode.ts +190 -0
- package/src/nodes/addHumanInTheLoopNode.ts +26 -0
- package/src/nodes/addJumpToNode.ts +26 -0
- package/src/nodes/addJunctionNode.ts +21 -0
- package/src/nodes/addPromptNode.ts +305 -0
- package/src/nodes/addRpaNode.ts +217 -0
- package/src/nodes/addToolNode.ts +84 -0
- package/src/nodes/addToolRunNode.ts +80 -0
- package/src/nodes/addTriggerNode.ts +27 -0
- package/src/nodes/compilePrompt.ts +44 -0
- package/src/nodes/nodeFactory.ts +61 -0
- package/src/nodes/rpaStepsExecutor.ts +175 -0
- package/src/platform/config.ts +89 -0
- package/src/platform/mindedCheckpointSaver.ts +146 -0
- package/src/platform/mindedConnection.ts +250 -0
- package/src/platform/mindedConnectionTypes.ts +495 -0
- package/src/platform/models/mindedChatOpenAI.ts +49 -0
- package/src/platform/models/parallelWrapper.ts +141 -0
- package/src/platform/piiGateway/gateway.ts +103 -0
- package/src/platform/piiGateway/index.ts +5 -0
- package/src/platform/piiGateway/types.ts +29 -0
- package/src/platform/toolExecutor.ts +106 -0
- package/src/platform/utils/parseAttachments.ts +56 -0
- package/src/platform/utils/tools.ts +55 -0
- package/src/playbooks/playbooks.ts +200 -0
- package/src/toolsLibrary/classifier.ts +326 -0
- package/src/toolsLibrary/extraction.ts +393 -0
- package/src/toolsLibrary/index.ts +10 -0
- package/src/toolsLibrary/parseDocument.ts +129 -0
- package/src/triggers/triggerTypeToDefaultMessage.ts +9 -0
- package/src/types/Agent.types.ts +73 -0
- package/src/types/Flows.types.ts +262 -0
- package/src/types/LLM.types.ts +15 -0
- package/src/types/LangGraph.types.ts +86 -0
- package/src/types/Platform.types.ts +6 -0
- package/src/types/Tools.types.ts +28 -0
- package/src/types/Voice.types.ts +4 -0
- package/src/utils/agentUtils.ts +69 -0
- package/src/utils/history.ts +38 -0
- package/src/utils/logger.ts +38 -0
- package/src/utils/schemaUtils.ts +68 -0
- package/src/utils/wait.ts +1 -0
- package/src/voice/elevenLabsUtils.ts +81 -0
- package/src/voice/voiceSession.ts +309 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# **Minded On-prem Deployment**
|
|
2
|
+
|
|
3
|
+
Minded supports on-prem deployment of the Operator, allowing AI Agents to run against your internal tools and APIs while ensuring that sensitive data such as PII never leaves your cloud.
|
|
4
|
+
|
|
5
|
+
# **Architecture**
|
|
6
|
+
|
|
7
|
+
Minded is designed to democratize agent development while maintaining enterprise-grade security. You can keep sensitive data such as PII in your VPC, while Minded manages the orchestration and tooling.
|
|
8
|
+
|
|
9
|
+
The architecture is split into two planes:
|
|
10
|
+
|
|
11
|
+
- **Control Plane**: the Minded platform where agents are built, orchestrated, and monitored.
|
|
12
|
+
- **Agentic Plane**: where the agent’s compute and data live, ensuring tasks run securely next to your systems, and can be safely deployed on your cloud.
|
|
13
|
+
|
|
14
|
+
The following diagram describes the overall Minded architecture.
|
|
15
|
+
|
|
16
|
+
<figure><img src="../.gitbook/assets/on-prem.svg" alt="Minded On-prem Architecture Diagram"></figure>
|
|
17
|
+
|
|
18
|
+
## Control Plane
|
|
19
|
+
|
|
20
|
+
### Overview
|
|
21
|
+
|
|
22
|
+
The control plane forms the backbone of the Minded Platform. It runs entirely in Minded’s VPC and includes the key services that power agent development and orchestration:
|
|
23
|
+
|
|
24
|
+
- **Minded Studio** – a web application for building agents in both code and no-code.
|
|
25
|
+
|
|
26
|
+
- **Code (GitHub integration)** – source repository where agent logic is versioned and managed.
|
|
27
|
+
|
|
28
|
+
- **Copilot** – an AI assistant for agent creation and improvement.
|
|
29
|
+
|
|
30
|
+
- **Operator** – a lightweight service that executes instructions using LLMs inside a browser that is triggered by the Agent Runner.
|
|
31
|
+
|
|
32
|
+
- **PII Masker** – an inline service that redacts sensitive data before any payload leaves the VPC, as well as unmask the data when there is a business need such as responding to a customer request.
|
|
33
|
+
|
|
34
|
+
The control plane communicates with the Agentic Plane in a PII-redacted manner, ensuring that sensitive data never leaves the customer’s environment.
|
|
35
|
+
|
|
36
|
+
### Deployment and Security
|
|
37
|
+
|
|
38
|
+
The control plane is operated by Minded in AWS, within Minded’s managed VPC. It orchestrates the Agentic Plane using **least-privilege IAM roles** and scoped API endpoints. No customer PII is transmitted or stored in the control plane.
|
|
39
|
+
|
|
40
|
+
### Observability and Monitoring
|
|
41
|
+
|
|
42
|
+
Customers monitor and troubleshoot their agents through **Minded Studio**, which provides execution traces, logs, and performance analytics. Data exposed in Studio is always scrubbed of PII, with sensitive context available only inside the Agentic Plane.
|
|
43
|
+
|
|
44
|
+
## Agentic Plane
|
|
45
|
+
|
|
46
|
+
### **Overview**
|
|
47
|
+
|
|
48
|
+
The Agentic Plane runs in the customer’s VPC and contains both the **compute** and the **data** for agents. This ensures that sensitive operations, such as accessing internal systems or handling PII, remain under the customer’s control. The control plane orchestrates tasks but does not directly access data.
|
|
49
|
+
|
|
50
|
+
### **Components of the Agentic Plane**
|
|
51
|
+
|
|
52
|
+
The Agentic Plane includes the following components:
|
|
53
|
+
|
|
54
|
+
- **Agent Runner** – a containerized service responsible for executing agent logic and coordinating with the Agentic Plane.
|
|
55
|
+
|
|
56
|
+
- **Browser (Chromium)** – a session-scoped Chromium instance for interacting with websites and applications.
|
|
57
|
+
|
|
58
|
+
- **AI Agent (ECS)** – a containerized compute layer on Amazon ECS that connects to the LLM and the browser to complete tasks.
|
|
59
|
+
|
|
60
|
+
- **Storage (Amazon S3)** – local bucket for logs, screenshots, and artifacts. Additionally Minded supports Postgres and Redis instances that store metadata, configuration, and state.
|
|
61
|
+
|
|
62
|
+
### **Deployment and Security**
|
|
63
|
+
|
|
64
|
+
The Agentic Plane is deployed inside the customer’s VPC using **Terraform bundles** or **CloudFormation templates**. Resources run with **least-privilege IAM roles**, and no inbound traffic is enabled. Sensitive artifacts (logs, screenshots) remain in S3 within the customer’s environment.
|
|
65
|
+
|
|
66
|
+
All communication between the control plane and Agentic Plane is encrypted (TLS) and PII-masked. This ensures the control plane has the orchestration context it needs without accessing sensitive information.
|
|
67
|
+
|
|
68
|
+
# **Deployment**
|
|
69
|
+
|
|
70
|
+
Minded’s on-premises deployment model is designed to be simple for your DevOps team while keeping security controls in your hands. To achieve this, resources are split into two categories:
|
|
71
|
+
|
|
72
|
+
## Glacier Resources
|
|
73
|
+
|
|
74
|
+
Glacier resources are provisioned once and remain static. These include foundational infrastructure such as:
|
|
75
|
+
|
|
76
|
+
- **Amazon S3 buckets** for storing logs, screenshots, and artifacts.
|
|
77
|
+
|
|
78
|
+
- **Amazon ECR repositories** for hosting operator images.
|
|
79
|
+
|
|
80
|
+
- **VPC networking resources** required for isolation and connectivity.
|
|
81
|
+
|
|
82
|
+
Glacier resources are created during the initial deployment and generally do not require further changes.
|
|
83
|
+
|
|
84
|
+
## Dynamic Resources
|
|
85
|
+
|
|
86
|
+
Dynamic resources are permissions and roles that are granted to Minded in a **least-privileged** fashion. These enable Minded to safely manage, troubleshoot, and update the **Operator** inside your VPC without your DevOps team needing to intervene. Examples include:
|
|
87
|
+
|
|
88
|
+
- IAM roles with scoped permissions for ECS task updates.
|
|
89
|
+
|
|
90
|
+
- Limited access policies for pulling container images from ECR.
|
|
91
|
+
|
|
92
|
+
- Runtime orchestration permissions for launching new tasks.
|
|
93
|
+
|
|
94
|
+
## Terraform Plan
|
|
95
|
+
|
|
96
|
+
Minded provides a [Terraform Plan](https://github.com/minded-ai/onprem-terraform) to automate setup, with minimal effort from DevOps teams and virtually no required maintenance from your side . The plan performs two steps:
|
|
97
|
+
|
|
98
|
+
1. **Provision glacier resources** – S3, ECR, and networking resources required for the operator.
|
|
99
|
+
|
|
100
|
+
2. **Delegate minimal access** – IAM roles and policies that allow Minded to deploy updates securely.
|
|
101
|
+
|
|
102
|
+
## Ongoing On-Prem Operator Updates
|
|
103
|
+
|
|
104
|
+
Operator updates are fully managed by Minded with no involvement required from your DevOps or security team. Updates follow this process:
|
|
105
|
+
|
|
106
|
+
1. Minded uploads a new operator image to **Amazon ECR**.
|
|
107
|
+
|
|
108
|
+
2. Using the pre-granted IAM role, Minded creates a new **Amazon ECS Task** inside your VPC.
|
|
109
|
+
|
|
110
|
+
3. The ECS task replaces the running operator, ensuring you are always up to date with the latest version.
|
|
111
|
+
|
|
112
|
+
## Ongoing Agent Updates
|
|
113
|
+
|
|
114
|
+
Agents themselves can be updated in two ways:
|
|
115
|
+
|
|
116
|
+
- **Code updates** – by pushing directly to the GitHub repository that stores agent logic.
|
|
117
|
+
|
|
118
|
+
- **No-code updates** – via the Minded Studio platform.
|
|
119
|
+
|
|
120
|
+
After changes are applied, agents are explicitly deployed to production from the platform. A new version of the **Agent Runner** is rolled out in the Agentic Plane, which then communicates with your Operator at runtime.
|
|
121
|
+
|
|
122
|
+
# **Security**
|
|
123
|
+
|
|
124
|
+
Minded’s architecture is built around strict security controls, with clear separation of responsibilities between infrastructure that Minded manages and resources that remain fully within your VPC.
|
|
125
|
+
|
|
126
|
+
## Separation of Duties
|
|
127
|
+
|
|
128
|
+
- **Glacier infrastructure** (for example, S3 buckets and ECR repositories) is provisioned once and managed by your DevOps team.
|
|
129
|
+
|
|
130
|
+
- **Dynamic deployment access** is delegated to Minded through scoped IAM roles, allowing us to update the operator without requiring ongoing involvement from your team.
|
|
131
|
+
|
|
132
|
+
## Least Privilege Enforcement
|
|
133
|
+
|
|
134
|
+
- **Scoped IAM policies** limit Minded’s access to only the resources needed for deployment and updates.
|
|
135
|
+
|
|
136
|
+
- **Explicit role ARNs** define trust boundaries for cross-account operations.
|
|
137
|
+
|
|
138
|
+
- **IP restrictions on S3 buckets** ensure that only traffic from your environment is accepted.
|
|
139
|
+
|
|
140
|
+
## Auditability
|
|
141
|
+
|
|
142
|
+
- All cross-account actions performed by Minded are logged in **AWS CloudTrail** under the assumed role.
|
|
143
|
+
|
|
144
|
+
- Customers can review and audit these logs at any time.
|
|
145
|
+
|
|
146
|
+
## No Public Exposure
|
|
147
|
+
|
|
148
|
+
- No resources in the Agentic Plane are publicly accessible.
|
|
149
|
+
|
|
150
|
+
- Access is tied to your private networking controls such as **VPNs** or specific **AWS principals**.
|
|
151
|
+
|
|
152
|
+
## How Minded Keeps Operator PII Secure
|
|
153
|
+
|
|
154
|
+
Minded ensures that sensitive information, such as PII, never leaves your environment:
|
|
155
|
+
|
|
156
|
+
- **Logs and Screenshots** – All operator logs and browser screenshots are stored in your **Amazon S3 bucket**, within your VPC boundary.
|
|
157
|
+
|
|
158
|
+
- **LLM Calls** – Decisions and browser actions are governed by an LLM, but all calls are routed to your selected LLM deployment (for example, **Amazon Bedrock**, **Azure OpenAI**, or **Anthropic in VPC**). This ensures that model inference runs entirely in your environment, not in Minded’s.
|
|
159
|
+
|
|
160
|
+
- **Redaction** – The **PII Masker** enforces data minimization before any metadata leaves your VPC, ensuring observability without exposure.
|
|
161
|
+
|
|
162
|
+
# **High Availability and Disaster Recovery**
|
|
163
|
+
|
|
164
|
+
Minded’s architecture is designed for resilience across both the control plane and the Agentic Plane.
|
|
165
|
+
|
|
166
|
+
## High Availability
|
|
167
|
+
|
|
168
|
+
- The **control plane** runs in Minded’s managed VPC with multi-zone deployments across AWS regions. Services such as **Postgres**, **Redis**, and **Agent Worker** are deployed with failover to ensure continuity.
|
|
169
|
+
|
|
170
|
+
- The **Agentic Plane** runs inside your VPC using **Amazon ECS** for compute and **Amazon S3** for storage. ECS tasks are distributed across availability zones to reduce the risk of single-zone outages.
|
|
171
|
+
|
|
172
|
+
## Disaster Recovery
|
|
173
|
+
|
|
174
|
+
- **State Restoration** – Agent run state, metadata, and orchestration traces are stored in **Postgres** and **S3**, enabling Minded to restore the state of ongoing or historical agent runs.
|
|
175
|
+
|
|
176
|
+
- **Step-Level Troubleshooting** – Execution traces are logged to **S3** in your VPC, allowing you to replay or inspect each step of an agent run without exposing PII.
|
|
177
|
+
|
|
178
|
+
- **Minimal Recovery Time** – New ECS tasks can be provisioned quickly from **ECR images**, ensuring rapid recovery in the event of a failure.
|
|
179
|
+
|
|
180
|
+
Together, these mechanisms ensure that agent execution can continue with minimal disruption, while preserving full observability and auditability of every step.
|
|
181
|
+
|
|
182
|
+
[image1]: data:image/png;base64,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
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
## Operator (AI Browser)
|
|
2
|
+
|
|
3
|
+
The Operator lets an agent run autonomous web actions using a live Chromium, guided by an LLM of choice. It supports structured inputs/outputs, live view previews, optional country proxying, and an on-prem mode.
|
|
4
|
+
|
|
5
|
+
### What it does
|
|
6
|
+
- **Plans + Executes**: The node first asks the LLM to propose parameters (based on your input schema) and compiles your prompt. It then starts a browser session and runs the task to completion.
|
|
7
|
+
- **Live session**: Shows a live view preview of the browser session.
|
|
8
|
+
- **Structured I/O**: Define `inputSchema` to guide the LLM’s tool-call arguments and `outputSchema` to hint desired output structure.
|
|
9
|
+
- **Tool access**: Exposes agent tools that allow execution requests to the browser agent.
|
|
10
|
+
|
|
11
|
+
### Configuration fields (node)
|
|
12
|
+
- **prompt (required)**: Natural-language instructions for the browser agent. Supports variables from the state object.
|
|
13
|
+
- **model (optional)**: Preferred LLM (UI defaults to `gpt-4o`).
|
|
14
|
+
- **inputSchema (optional)**: Array of fields `{ name, type: 'string'|'number', description?, required? }`.
|
|
15
|
+
- **outputSchema (optional)**: Array of fields `{ name, type: 'string'|'number', description?, required? }`. Sent to the browser agent to shape outputs.
|
|
16
|
+
- **proxy (optional)**: Two‑letter country code (e.g., `IL`, `US`). Disabled when running on‑prem.
|
|
17
|
+
- **hooks (optional)**: Array of `{ name }`. Passed to the browser agent.
|
|
18
|
+
|
|
19
|
+
### On‑prem mode
|
|
20
|
+
|
|
21
|
+
By default, the browser agent runs on the cloud. For customers who want to run the browser agent on their own infrastructure & network, on-prem mode is supported out of the box by running the on-prem kit on a PC / cloud VM.
|
|
22
|
+
|
|
23
|
+
Please contact us to assist you with on-prem setup at support@minded.com.
|
|
24
|
+
|
|
25
|
+
#### How it works
|
|
26
|
+
|
|
27
|
+
The on-prem kit acts as a CDP server that launches chromium locally and exposes the protocol via websocket to the Minded backend service thus while the browser agent runs on the cloud, the browser is running locally inside the customer's network allowing it to access internet services without whitelisting.
|
|
28
|
+
|
|
29
|
+
#### Installation
|
|
30
|
+
|
|
31
|
+
1. Enable on-prem mode in the node configuration (onPrem: true)
|
|
32
|
+
2. Run the docker image with the agent ID and environment variables
|
|
33
|
+
Production:
|
|
34
|
+
```
|
|
35
|
+
docker run --name --pull minded-browser-onprem -e AGENT_ID=[Agent ID] public.ecr.aws/o9t8x5z4/browser-use-onprem-kit:latest
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Proxy
|
|
39
|
+
|
|
40
|
+
The browser agent can be configured to use a proxy server. This is useful when the browser agent needs to access the internet through a proxy server. Enable the proxy in the node configuration (proxy: 'UK').
|
|
41
|
+
|
|
42
|
+
### MFA
|
|
43
|
+
|
|
44
|
+
The browser agent can be configured to use MFA. Currently TOTP is supported out of the box for MFA login flow.
|
|
45
|
+
|
|
46
|
+
### Tools
|
|
47
|
+
|
|
48
|
+
Operators can leverage **tools**—reusable functions that the agent can call during a browser session to perform specific actions (e.g., extract data, interact with APIs, update memory, etc.). Tools are defined using the platform’s [Tool interface](../low-code-editor/tools.md), and can be made available to the browser agent for use within your browser task flows.
|
|
49
|
+
|
|
50
|
+
#### How tools work in operators
|
|
51
|
+
|
|
52
|
+
- **Tool calls**: During a browser task, the LLM can decide to call any tool that is registered and exposed to the agent. The tool receives validated input, the current state, and the agent instance.
|
|
53
|
+
- **Structured input/output**: Tools use Zod schemas for input validation and can return structured results, which are sent back to the LLM and/or merged into agent memory.
|
|
54
|
+
- **Tools available to browser tasks**: Tools marked as `allowExecutionRequests: true` are available to all nodes, including browser tasks.
|
|
55
|
+
|
|
56
|
+
#### Tool execution in operators
|
|
57
|
+
You can mention tool names in your browser task prompt to encourage the LLM to use them, or let the LLM decide when to call them based on context.
|
|
58
|
+
|
|
59
|
+
When the LLM calls a tool during a browser task:
|
|
60
|
+
|
|
61
|
+
- The tool’s `execute` function runs with the provided input and current state.
|
|
62
|
+
- Any returned `state` is merged into the agent’s memory/state.
|
|
63
|
+
- The `result` is sent back to the LLM and can be used in subsequent reasoning or actions.
|
|
64
|
+
|
|
65
|
+
For more on tool structure and best practices, see [Tools documentation](../low-code-editor/tools.md).
|
|
66
|
+
|
|
67
|
+
#### Browser manipulation inside tool
|
|
68
|
+
|
|
69
|
+
You can manipulate the browser using a package of choice (e.g. puppeteer, playwright, etc.) by using the CDP URL that is passed to the tool in the state object.
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
### Operator node example
|
|
73
|
+
```yaml
|
|
74
|
+
# Flow YAML snippet illustrating a browserTask node
|
|
75
|
+
- name: 444f2347-dcc0-4c4e-b0af-3743033c8f5e
|
|
76
|
+
type: browserTask
|
|
77
|
+
displayName: Search product price in Amazon
|
|
78
|
+
prompt: |
|
|
79
|
+
Your task is to search for a product in Amazon and return the price of the product.
|
|
80
|
+
|
|
81
|
+
1. Navigate to amazon.com
|
|
82
|
+
2. Search for "iphone 15"
|
|
83
|
+
3. Return the price of the product
|
|
84
|
+
model: gpt-4o
|
|
85
|
+
inputSchema: []
|
|
86
|
+
outputSchema: []
|
|
87
|
+
proxy: ''
|
|
88
|
+
onPrem: false
|
|
89
|
+
```
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# PII Masking
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Minded platform provides built-in protection for Personally Identifiable Information (PII) through an advanced masking mechanism. This feature ensures that sensitive data remains secure throughout your application's lifecycle while preserving the contextual integrity of your business logic.
|
|
6
|
+
|
|
7
|
+
<figure><img src="../.gitbook/assets/PII-masking.png" alt="PII Masking Flow Diagram"></figure>
|
|
8
|
+
|
|
9
|
+
## How to Use PII Masking
|
|
10
|
+
|
|
11
|
+
### Step 1: Configure PII Masking in the Minded Platform
|
|
12
|
+
|
|
13
|
+
To enable PII masking, go to the agent configuration panel and toggle **"Enable PII Masking"**. Then, configure the masking behavior according to your needs by specifying:
|
|
14
|
+
|
|
15
|
+
- **Entity Types**: Define which data entities should be treated as PII. Any entity that requires masking must be explicitly listed.
|
|
16
|
+
- **Detection Model**: By default, Minded uses OpenAI's GPT-4.1-mini for PII detection. Optionally, you can provide a custom Azure OpenAI deployment. Be sure to include the corresponding API key in the environment's secrets.
|
|
17
|
+
- **TTL Settings**: TTL (Time-to-Live) determines how long masked data is stored for a specific `sessionId`. The default TTL is 14 hours.
|
|
18
|
+
- **Trigger SessionId Field**: Specify the property name in your incoming webhook payload that contains the session ID. This field is used to identify and group PII data per session. It must be a single word with no special characters (only letters, numbers, and underscores allowed).
|
|
19
|
+
|
|
20
|
+
Once enabled, PII masking is automatically applied at critical points within the platform:
|
|
21
|
+
|
|
22
|
+
- All webhook payloads are masked upon receipt.
|
|
23
|
+
- App integrations undergo automatic unmasking before requests and re-masking after responses.
|
|
24
|
+
|
|
25
|
+
### Step 2: Use PII Masking via the Minded SDK
|
|
26
|
+
|
|
27
|
+
Minded provides automatic PII masking capabilities for HTTP requests within your agent workflows. When a trigger is received with a sessionId, the PII masking functionality is automatically initialized and made available to your custom code through the agent's PII gateway.
|
|
28
|
+
|
|
29
|
+
#### PII Gateway for HTTP Requests
|
|
30
|
+
|
|
31
|
+
The PII gateway enables secure HTTP communication by automatically handling PII masking/unmasking for your API calls. It provides a complete HTTP client interface similar to popular libraries like Axios, supporting all common HTTP methods.
|
|
32
|
+
|
|
33
|
+
The PII masking gateway ensures:
|
|
34
|
+
|
|
35
|
+
- **Automatic Unmasking**: Requests are automatically unmasked before being sent to external APIs
|
|
36
|
+
- **Secure Routing**: All requests are routed through Minded's secure gateway infrastructure
|
|
37
|
+
- **Response Masking**: API responses are automatically masked before being returned to your agent
|
|
38
|
+
- **Session Isolation**: PII data is properly isolated per session using the sessionId
|
|
39
|
+
- **Error Handling**: Comprehensive error handling for network issues and API failures
|
|
40
|
+
|
|
41
|
+
> **Note:** API error responses are **not** masked. The PII gateway requires a valid sessionId to function properly.
|
|
42
|
+
|
|
43
|
+
#### Available HTTP Methods
|
|
44
|
+
|
|
45
|
+
The PII gateway supports all standard HTTP methods:
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
// GET request
|
|
49
|
+
const userData = await agent.piiGateway.get(sessionId, 'https://api.example.com/user/123');
|
|
50
|
+
|
|
51
|
+
// POST request
|
|
52
|
+
const createResult = await agent.piiGateway.post(sessionId, 'https://api.example.com/users', {
|
|
53
|
+
name: 'John Doe',
|
|
54
|
+
email: 'john@example.com',
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// PUT request
|
|
58
|
+
const updateResult = await agent.piiGateway.put(sessionId, 'https://api.example.com/user/123', {
|
|
59
|
+
email: 'newemail@example.com',
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// DELETE request
|
|
63
|
+
const deleteResult = await agent.piiGateway.delete(sessionId, 'https://api.example.com/user/123');
|
|
64
|
+
|
|
65
|
+
// PATCH request
|
|
66
|
+
const patchResult = await agent.piiGateway.patch(sessionId, 'https://api.example.com/user/123', {
|
|
67
|
+
email: 'updated@example.com',
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
#### Example Usage in Tools
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
// POST request example - within a custom tool
|
|
75
|
+
import { Tool } from '@minded-ai/mindedjs';
|
|
76
|
+
import { logger } from '@minded-ai/mindedjs';
|
|
77
|
+
|
|
78
|
+
const modelParams = z.object({
|
|
79
|
+
prev: z.string().describe('The email to update'),
|
|
80
|
+
new: z.string().describe('The new email address'),
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const updateEmailTool: Tool<any, any> = {
|
|
84
|
+
name: 'updateEmail',
|
|
85
|
+
description: 'Update the email',
|
|
86
|
+
input: modelParams,
|
|
87
|
+
execute: async ({ input, state, agent }) => {
|
|
88
|
+
try {
|
|
89
|
+
logger.info('Updating email via PII gateway', {
|
|
90
|
+
sessionId: state.sessionId,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const response = await agent.piiGateway.post(state.sessionId, 'https://www.acme.com/update_email', {
|
|
94
|
+
oldEmail: input.prev,
|
|
95
|
+
newEmail: input.new,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
logger.info('Email update successful', {
|
|
99
|
+
sessionId: state.sessionId,
|
|
100
|
+
status: response.status,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
result: 'Email updated successfully',
|
|
105
|
+
state: {
|
|
106
|
+
memory: {
|
|
107
|
+
emailUpdated: true,
|
|
108
|
+
lastEmailUpdate: new Date().toISOString(),
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
} catch (err) {
|
|
113
|
+
logger.error({
|
|
114
|
+
message: 'Email update failed',
|
|
115
|
+
sessionId: state.sessionId,
|
|
116
|
+
err,
|
|
117
|
+
});
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### Request Configuration
|
|
125
|
+
|
|
126
|
+
You can also pass additional configuration options:
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
const response = await agent.piiGateway.post(
|
|
130
|
+
sessionId,
|
|
131
|
+
'https://api.example.com/data',
|
|
132
|
+
{ data: 'example' },
|
|
133
|
+
{
|
|
134
|
+
headers: {
|
|
135
|
+
Authorization: 'Bearer token',
|
|
136
|
+
'Content-Type': 'application/json',
|
|
137
|
+
},
|
|
138
|
+
params: {
|
|
139
|
+
version: 'v1',
|
|
140
|
+
format: 'json',
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
);
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### How It Works
|
|
147
|
+
|
|
148
|
+
1. **Trigger Received**: When your agent receives a trigger with a sessionId, the PII masking gateway is automatically initialized and available via `agent.piiGateway`
|
|
149
|
+
2. **Session Binding**: The PII gateway is bound to the specific session context, ensuring proper PII isolation
|
|
150
|
+
3. **Request Processing**: When you make HTTP requests through the gateway:
|
|
151
|
+
- Request data is automatically unmasked using session-specific mappings
|
|
152
|
+
- The request is sent to the target API with real, unmasked data
|
|
153
|
+
- The response is received and automatically masked before being returned
|
|
154
|
+
4. **Error Handling**: Network errors and API errors are properly handled and logged
|
|
155
|
+
|
|
156
|
+
## How PII Masking Works
|
|
157
|
+
|
|
158
|
+
### Input Processing
|
|
159
|
+
|
|
160
|
+
The masking workflow begins as data enters the Minded platform:
|
|
161
|
+
|
|
162
|
+
1. The platform receives input (e.g. JSON object or string) tagged with a unique `sessionId`.
|
|
163
|
+
|
|
164
|
+
2. PII entities are identified using the configured detection model.
|
|
165
|
+
|
|
166
|
+
3. Detected entities are replaced with structured placeholders such as:
|
|
167
|
+
|
|
168
|
+
- `<PERSON1>`, `<PERSON2>` for names
|
|
169
|
+
- `<PHONE1>` for phone numbers
|
|
170
|
+
- `<ADDRESS1>`, `<ADDRESS2>` for addresses
|
|
171
|
+
- Other entity types as defined in your configuration
|
|
172
|
+
|
|
173
|
+
4. A secure internal PII database (PII-DB) manages the mapping:
|
|
174
|
+
|
|
175
|
+
- Each `sessionId` has its own isolated mapping store
|
|
176
|
+
- Example mapping:
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
"Kate" → <PERSON1>
|
|
180
|
+
"Josh Wildon" → <PERSON2>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
- Consistent masking/unmasking is maintained throughout the session
|
|
184
|
+
- Data is automatically purged from the PII-DB based on TTL settings
|
|
185
|
+
|
|
186
|
+
### Session ID Configuration
|
|
187
|
+
|
|
188
|
+
The **Trigger SessionId Field** setting in the UI specifies which field in your webhook payload contains the session identifier:
|
|
189
|
+
|
|
190
|
+
- **Field Name**: Must be a valid property name (letters, numbers, underscores only)
|
|
191
|
+
- **Examples**: `sessionId`, `session_id`, `conversationId`, `userId`
|
|
192
|
+
- **Purpose**: Groups all PII data for a specific user session together
|
|
193
|
+
- **Requirements**:
|
|
194
|
+
- Single word identifier
|
|
195
|
+
- No special characters except underscores
|
|
196
|
+
- Must exist in every webhook payload
|
|
197
|
+
|
|
198
|
+
Example webhook payload where we set **Trigger SessionId Field** to **webhookId**:
|
|
199
|
+
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"webhookId": "user_12345_conversation_67890",
|
|
203
|
+
"customerName": "John Doe",
|
|
204
|
+
"email": "john.doe@example.com",
|
|
205
|
+
"orderDetails": "Need help with order #ABC123"
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Mask Consistency
|
|
210
|
+
|
|
211
|
+
The platform guarantees deterministic masking within a session:
|
|
212
|
+
|
|
213
|
+
- Each unique entity always receives the same placeholder
|
|
214
|
+
- New placeholders are generated only for previously unseen entities
|
|
215
|
+
- Cross-reference logic maintains consistent relationships between data
|
|
216
|
+
- TTL should be aligned with your agent's session lifecycle for optimal performance
|
|
217
|
+
|
|
218
|
+
### Logging and Storage
|
|
219
|
+
|
|
220
|
+
- All logs within the platform are written **only with masked data**
|
|
221
|
+
- Raw, unmasked data is **never** logged
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Scenarios
|
|
2
|
+
|
|
3
|
+
Scenarios are configurable contexts that modify agent behavior during conversations. They allow you to define custom properties and settings that influence how your agent responds in different situations.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
A scenario consists of:
|
|
8
|
+
- **Name**: A descriptive identifier for the scenario
|
|
9
|
+
- **Properties**: Key-value pairs that can be strings or booleans
|
|
10
|
+
|
|
11
|
+
## Use Cases
|
|
12
|
+
|
|
13
|
+
Scenarios are useful for:
|
|
14
|
+
- **Testing**: Create different conversation contexts for agent testing
|
|
15
|
+
- **A/B Testing**: Compare agent behavior under different configurations
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
### Platform
|
|
20
|
+
|
|
21
|
+
Create a new playground session and select "Scenarios" from the dropdown menu. You can create a new scenario, rename, duplicate, or delete a scenario. Add one or more properties to the scenario and click "Save".
|
|
22
|
+
|
|
23
|
+
### SDK
|
|
24
|
+
|
|
25
|
+
When you clicked "Save" in the platform, the scenario's properties have been saved to the session state. It is now accessible through hooks or tools' `state` object in `state.scenario`.
|
|
26
|
+
|
|
27
|
+
## Example
|
|
28
|
+
|
|
29
|
+
A simple `userId` scenario property in the UI of type `string` and value `123` would be accessed in the agent's state as `state.scenario.userId` in the following way:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
const printScenarioTool: Tool<typeof schema, Memory> = {
|
|
33
|
+
name: 'print_scenario_user_id',
|
|
34
|
+
description: 'Prints the user id from the scenario',
|
|
35
|
+
input: z.object({}),
|
|
36
|
+
execute: async ({ input, state, agent }) => {
|
|
37
|
+
console.log('*Action: print_scenario_user_id*', state.scenario.userId);
|
|
38
|
+
return {
|
|
39
|
+
state: {},
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
```
|