agent-orcha 0.0.1 → 0.0.3
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 +792 -125
- package/dist/lib/agents/agent-executor.d.ts +6 -1
- package/dist/lib/agents/agent-executor.d.ts.map +1 -1
- package/dist/lib/agents/agent-executor.js +241 -45
- package/dist/lib/agents/agent-executor.js.map +1 -1
- package/dist/lib/agents/agent-loader.d.ts.map +1 -1
- package/dist/lib/agents/agent-loader.js +3 -1
- package/dist/lib/agents/agent-loader.js.map +1 -1
- package/dist/lib/agents/index.d.ts +2 -1
- package/dist/lib/agents/index.d.ts.map +1 -1
- package/dist/lib/agents/index.js +1 -0
- package/dist/lib/agents/index.js.map +1 -1
- package/dist/lib/agents/structured-output-wrapper.d.ts +19 -0
- package/dist/lib/agents/structured-output-wrapper.d.ts.map +1 -0
- package/dist/lib/agents/structured-output-wrapper.js +104 -0
- package/dist/lib/agents/structured-output-wrapper.js.map +1 -0
- package/dist/lib/agents/types.d.ts +17 -10
- package/dist/lib/agents/types.d.ts.map +1 -1
- package/dist/lib/agents/types.js +1 -1
- package/dist/lib/agents/types.js.map +1 -1
- package/dist/lib/index.d.ts +9 -7
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +7 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/knowledge/graph-rag/community-detector.d.ts +16 -0
- package/dist/lib/knowledge/graph-rag/community-detector.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/community-detector.js +81 -0
- package/dist/lib/knowledge/graph-rag/community-detector.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts +17 -0
- package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/community-summarizer.js +87 -0
- package/dist/lib/knowledge/graph-rag/community-summarizer.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts +36 -0
- package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/entity-extractor.js +192 -0
- package/dist/lib/knowledge/graph-rag/entity-extractor.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts +30 -0
- package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/extraction-cache.js +88 -0
- package/dist/lib/knowledge/graph-rag/extraction-cache.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/global-search.d.ts +19 -0
- package/dist/lib/knowledge/graph-rag/global-search.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/global-search.js +96 -0
- package/dist/lib/knowledge/graph-rag/global-search.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts +24 -0
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.js +239 -0
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/index.d.ts +14 -0
- package/dist/lib/knowledge/graph-rag/index.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/index.js +12 -0
- package/dist/lib/knowledge/graph-rag/index.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/local-search.d.ts +20 -0
- package/dist/lib/knowledge/graph-rag/local-search.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/local-search.js +110 -0
- package/dist/lib/knowledge/graph-rag/local-search.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts +31 -0
- package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/memory-graph-store.js +165 -0
- package/dist/lib/knowledge/graph-rag/memory-graph-store.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts +38 -0
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js +190 -0
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts +11 -0
- package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/search-mode-detector.js +50 -0
- package/dist/lib/knowledge/graph-rag/search-mode-detector.js.map +1 -0
- package/dist/lib/knowledge/graph-rag/types.d.ts +368 -0
- package/dist/lib/knowledge/graph-rag/types.d.ts.map +1 -0
- package/dist/lib/knowledge/graph-rag/types.js +48 -0
- package/dist/lib/knowledge/graph-rag/types.js.map +1 -0
- package/dist/lib/knowledge/index.d.ts +9 -0
- package/dist/lib/knowledge/index.d.ts.map +1 -0
- package/dist/lib/knowledge/index.js +8 -0
- package/dist/lib/knowledge/index.js.map +1 -0
- package/dist/lib/knowledge/knowledge-store-factory.d.ts +16 -0
- package/dist/lib/knowledge/knowledge-store-factory.d.ts.map +1 -0
- package/dist/lib/{vectors/vector-store-factory.js → knowledge/knowledge-store-factory.js} +36 -10
- package/dist/lib/knowledge/knowledge-store-factory.js.map +1 -0
- package/dist/lib/knowledge/knowledge-store-manager.d.ts +18 -0
- package/dist/lib/knowledge/knowledge-store-manager.d.ts.map +1 -0
- package/dist/lib/knowledge/knowledge-store-manager.js +98 -0
- package/dist/lib/knowledge/knowledge-store-manager.js.map +1 -0
- package/dist/lib/knowledge/loaders/database-loader.d.ts +18 -0
- package/dist/lib/knowledge/loaders/database-loader.d.ts.map +1 -0
- package/dist/lib/knowledge/loaders/database-loader.js +115 -0
- package/dist/lib/knowledge/loaders/database-loader.js.map +1 -0
- package/dist/lib/knowledge/loaders/index.d.ts +4 -0
- package/dist/lib/knowledge/loaders/index.d.ts.map +1 -0
- package/dist/lib/knowledge/loaders/index.js +4 -0
- package/dist/lib/knowledge/loaders/index.js.map +1 -0
- package/dist/lib/knowledge/loaders/s3-loader.d.ts +17 -0
- package/dist/lib/knowledge/loaders/s3-loader.d.ts.map +1 -0
- package/dist/lib/knowledge/loaders/s3-loader.js +185 -0
- package/dist/lib/knowledge/loaders/s3-loader.js.map +1 -0
- package/dist/lib/knowledge/loaders/web-loader.d.ts +12 -0
- package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -0
- package/dist/lib/knowledge/loaders/web-loader.js +56 -0
- package/dist/lib/knowledge/loaders/web-loader.js.map +1 -0
- package/dist/lib/knowledge/types.d.ts +1839 -0
- package/dist/lib/knowledge/types.d.ts.map +1 -0
- package/dist/lib/knowledge/types.js +111 -0
- package/dist/lib/knowledge/types.js.map +1 -0
- package/dist/lib/knowledge/utils/connection-pool.d.ts +18 -0
- package/dist/lib/knowledge/utils/connection-pool.d.ts.map +1 -0
- package/dist/lib/knowledge/utils/connection-pool.js +77 -0
- package/dist/lib/knowledge/utils/connection-pool.js.map +1 -0
- package/dist/lib/knowledge/utils/file-type-detector.d.ts +10 -0
- package/dist/lib/knowledge/utils/file-type-detector.d.ts.map +1 -0
- package/dist/lib/knowledge/utils/file-type-detector.js +32 -0
- package/dist/lib/knowledge/utils/file-type-detector.js.map +1 -0
- package/dist/lib/knowledge/utils/index.d.ts +3 -0
- package/dist/lib/knowledge/utils/index.d.ts.map +1 -0
- package/dist/lib/knowledge/utils/index.js +3 -0
- package/dist/lib/knowledge/utils/index.js.map +1 -0
- package/dist/lib/mcp/mcp-client.d.ts +9 -1
- package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
- package/dist/lib/mcp/mcp-client.js +33 -0
- package/dist/lib/mcp/mcp-client.js.map +1 -1
- package/dist/lib/memory/conversation-store.d.ts +43 -0
- package/dist/lib/memory/conversation-store.d.ts.map +1 -0
- package/dist/lib/memory/conversation-store.js +109 -0
- package/dist/lib/memory/conversation-store.js.map +1 -0
- package/dist/lib/memory/index.d.ts +3 -0
- package/dist/lib/memory/index.d.ts.map +1 -0
- package/dist/lib/memory/index.js +3 -0
- package/dist/lib/memory/index.js.map +1 -0
- package/dist/lib/memory/types.d.ts +19 -0
- package/dist/lib/memory/types.d.ts.map +1 -0
- package/dist/lib/memory/types.js +6 -0
- package/dist/lib/memory/types.js.map +1 -0
- package/dist/lib/orchestrator.d.ts +56 -14
- package/dist/lib/orchestrator.d.ts.map +1 -1
- package/dist/lib/orchestrator.js +182 -25
- package/dist/lib/orchestrator.js.map +1 -1
- package/dist/lib/tools/agent-tool-wrapper.d.ts +22 -0
- package/dist/lib/tools/agent-tool-wrapper.d.ts.map +1 -0
- package/dist/lib/tools/agent-tool-wrapper.js +56 -0
- package/dist/lib/tools/agent-tool-wrapper.js.map +1 -0
- package/dist/lib/tools/built-in/ask-user.tool.d.ts +7 -0
- package/dist/lib/tools/built-in/ask-user.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/ask-user.tool.js +23 -0
- package/dist/lib/tools/built-in/ask-user.tool.js.map +1 -0
- package/dist/lib/tools/built-in/index.d.ts +2 -1
- package/dist/lib/tools/built-in/index.d.ts.map +1 -1
- package/dist/lib/tools/built-in/index.js +2 -1
- package/dist/lib/tools/built-in/index.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-search.tool.d.ts +4 -0
- package/dist/lib/tools/built-in/knowledge-search.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/{vector-search.tool.js → knowledge-search.tool.js} +4 -4
- package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -0
- package/dist/lib/tools/index.d.ts +3 -1
- package/dist/lib/tools/index.d.ts.map +1 -1
- package/dist/lib/tools/index.js +3 -1
- package/dist/lib/tools/index.js.map +1 -1
- package/dist/lib/tools/tool-discovery.d.ts +50 -0
- package/dist/lib/tools/tool-discovery.d.ts.map +1 -0
- package/dist/lib/tools/tool-discovery.js +178 -0
- package/dist/lib/tools/tool-discovery.js.map +1 -0
- package/dist/lib/tools/tool-registry.d.ts +19 -3
- package/dist/lib/tools/tool-registry.d.ts.map +1 -1
- package/dist/lib/tools/tool-registry.js +63 -10
- package/dist/lib/tools/tool-registry.js.map +1 -1
- package/dist/lib/workflows/index.d.ts +4 -2
- package/dist/lib/workflows/index.d.ts.map +1 -1
- package/dist/lib/workflows/index.js +3 -1
- package/dist/lib/workflows/index.js.map +1 -1
- package/dist/lib/workflows/interrupt-manager.d.ts +42 -0
- package/dist/lib/workflows/interrupt-manager.d.ts.map +1 -0
- package/dist/lib/workflows/interrupt-manager.js +102 -0
- package/dist/lib/workflows/interrupt-manager.js.map +1 -0
- package/dist/lib/workflows/langgraph-executor.d.ts +51 -0
- package/dist/lib/workflows/langgraph-executor.d.ts.map +1 -0
- package/dist/lib/workflows/langgraph-executor.js +297 -0
- package/dist/lib/workflows/langgraph-executor.js.map +1 -0
- package/dist/lib/workflows/types.d.ts +911 -34
- package/dist/lib/workflows/types.d.ts.map +1 -1
- package/dist/lib/workflows/types.js +51 -2
- package/dist/lib/workflows/types.js.map +1 -1
- package/dist/lib/workflows/workflow-executor.d.ts.map +1 -1
- package/dist/lib/workflows/workflow-executor.js +4 -0
- package/dist/lib/workflows/workflow-executor.js.map +1 -1
- package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
- package/dist/lib/workflows/workflow-loader.js +3 -1
- package/dist/lib/workflows/workflow-loader.js.map +1 -1
- package/dist/public/index.html +133 -700
- package/dist/public/src/components/AgentsView.js +763 -0
- package/dist/public/src/components/AppRoot.js +76 -0
- package/dist/public/src/components/IdeView.js +330 -0
- package/dist/public/src/components/KnowledgeView.js +133 -0
- package/dist/public/src/components/LlmView.js +127 -0
- package/dist/public/src/components/McpView.js +387 -0
- package/dist/public/src/components/NavBar.js +71 -0
- package/dist/public/src/components/WorkflowsView.js +243 -0
- package/dist/public/src/main.js +9 -0
- package/dist/public/src/services/ApiService.js +142 -0
- package/dist/public/src/store.js +41 -0
- package/dist/public/src/utils/Component.js +23 -0
- package/dist/public/src/utils/markdown.js +82 -0
- package/dist/src/cli/commands/start.d.ts.map +1 -1
- package/dist/src/cli/commands/start.js +3 -2
- package/dist/src/cli/commands/start.js.map +1 -1
- package/dist/src/index.js +46 -12
- package/dist/src/index.js.map +1 -1
- package/dist/src/routes/agents.route.d.ts.map +1 -1
- package/dist/src/routes/agents.route.js +38 -5
- package/dist/src/routes/agents.route.js.map +1 -1
- package/dist/src/routes/files.route.d.ts +3 -0
- package/dist/src/routes/files.route.d.ts.map +1 -0
- package/dist/src/routes/files.route.js +160 -0
- package/dist/src/routes/files.route.js.map +1 -0
- package/dist/src/routes/functions.route.d.ts +3 -0
- package/dist/src/routes/functions.route.d.ts.map +1 -0
- package/dist/src/routes/functions.route.js +83 -0
- package/dist/src/routes/functions.route.js.map +1 -0
- package/dist/src/routes/knowledge.route.d.ts +3 -0
- package/dist/src/routes/knowledge.route.d.ts.map +1 -0
- package/dist/src/routes/knowledge.route.js +153 -0
- package/dist/src/routes/knowledge.route.js.map +1 -0
- package/dist/src/routes/mcp.route.d.ts +3 -0
- package/dist/src/routes/mcp.route.d.ts.map +1 -0
- package/dist/src/routes/mcp.route.js +79 -0
- package/dist/src/routes/mcp.route.js.map +1 -0
- package/dist/src/routes/workflows.route.d.ts.map +1 -1
- package/dist/src/routes/workflows.route.js +2 -1
- package/dist/src/routes/workflows.route.js.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +8 -2
- package/dist/src/server.js.map +1 -1
- package/dist/templates/.env.example +21 -0
- package/dist/templates/README.md +43 -152
- package/dist/templates/agents/call-center-analyst-simple.agent.yaml +36 -0
- package/dist/templates/agents/math.agent.yaml +4 -14
- package/dist/templates/agents/sentiment-structured.agent.yaml +42 -0
- package/dist/templates/functions/calculator.function.js +69 -0
- package/dist/templates/functions/text-formatter.function.js +66 -0
- package/dist/templates/{vectors/example.vector.yaml → knowledge/example.knowledge.yaml} +1 -1
- package/dist/templates/knowledge/transcripts/call-001.txt +40 -0
- package/dist/templates/knowledge/transcripts/call-002.txt +36 -0
- package/dist/templates/knowledge/transcripts/call-003.txt +42 -0
- package/dist/templates/llm.md +1195 -0
- package/dist/templates/workflows/example.workflow.yaml +8 -19
- package/dist/templates/workflows/langgraph-example.workflow.yaml +84 -0
- package/package.json +19 -10
- package/dist/lib/tools/built-in/vector-search.tool.d.ts +0 -4
- package/dist/lib/tools/built-in/vector-search.tool.d.ts.map +0 -1
- package/dist/lib/tools/built-in/vector-search.tool.js.map +0 -1
- package/dist/lib/vectors/index.d.ts +0 -5
- package/dist/lib/vectors/index.d.ts.map +0 -1
- package/dist/lib/vectors/index.js +0 -4
- package/dist/lib/vectors/index.js.map +0 -1
- package/dist/lib/vectors/types.d.ts +0 -212
- package/dist/lib/vectors/types.d.ts.map +0 -1
- package/dist/lib/vectors/types.js +0 -39
- package/dist/lib/vectors/types.js.map +0 -1
- package/dist/lib/vectors/vector-store-factory.d.ts +0 -14
- package/dist/lib/vectors/vector-store-factory.d.ts.map +0 -1
- package/dist/lib/vectors/vector-store-factory.js.map +0 -1
- package/dist/lib/vectors/vector-store-manager.d.ts +0 -18
- package/dist/lib/vectors/vector-store-manager.d.ts.map +0 -1
- package/dist/lib/vectors/vector-store-manager.js +0 -79
- package/dist/lib/vectors/vector-store-manager.js.map +0 -1
- package/dist/src/routes/vectors.route.d.ts +0 -3
- package/dist/src/routes/vectors.route.d.ts.map +0 -1
- package/dist/src/routes/vectors.route.js +0 -74
- package/dist/src/routes/vectors.route.js.map +0 -1
- package/dist/templates/agents/example.agent.yaml +0 -32
- package/dist/templates/agents/knowledge.agent.yaml +0 -36
- package/dist/templates/agents/time.agent.yaml +0 -42
- package/dist/templates/functions/README.md +0 -195
- package/dist/templates/functions/fibonacci.function.js +0 -55
- package/dist/templates/vectors/example-chroma.vector.yaml +0 -43
- package/dist/templates/vectors/sample-data/example-document.txt +0 -15
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { logger } from '../logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Manages workflow interrupts for human-in-the-loop interactions.
|
|
4
|
+
* Interrupts are stored in-memory and expire after 1 hour.
|
|
5
|
+
*/
|
|
6
|
+
export class InterruptManager {
|
|
7
|
+
interrupts = new Map();
|
|
8
|
+
INTERRUPT_TTL = 3600000; // 1 hour in milliseconds
|
|
9
|
+
/**
|
|
10
|
+
* Adds a new interrupt.
|
|
11
|
+
*/
|
|
12
|
+
addInterrupt(interrupt) {
|
|
13
|
+
this.interrupts.set(interrupt.threadId, interrupt);
|
|
14
|
+
logger.info(`Added interrupt for thread ${interrupt.threadId}: ${interrupt.question}`);
|
|
15
|
+
// Clean up expired interrupts
|
|
16
|
+
this.cleanupExpired();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Gets an interrupt by thread ID.
|
|
20
|
+
*/
|
|
21
|
+
getInterrupt(threadId) {
|
|
22
|
+
const interrupt = this.interrupts.get(threadId);
|
|
23
|
+
// Check if expired
|
|
24
|
+
if (interrupt && Date.now() - interrupt.timestamp > this.INTERRUPT_TTL) {
|
|
25
|
+
this.interrupts.delete(threadId);
|
|
26
|
+
logger.info(`Interrupt expired for thread ${threadId}`);
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return interrupt;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Gets all interrupts for a workflow.
|
|
33
|
+
*/
|
|
34
|
+
getInterruptsByWorkflow(workflowName) {
|
|
35
|
+
const interrupts = [];
|
|
36
|
+
for (const interrupt of this.interrupts.values()) {
|
|
37
|
+
if (interrupt.workflowName === workflowName && !interrupt.resolved) {
|
|
38
|
+
// Check if expired
|
|
39
|
+
if (Date.now() - interrupt.timestamp <= this.INTERRUPT_TTL) {
|
|
40
|
+
interrupts.push(interrupt);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return interrupts;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolves an interrupt with the user's answer.
|
|
48
|
+
*/
|
|
49
|
+
resolveInterrupt(threadId, answer) {
|
|
50
|
+
const interrupt = this.getInterrupt(threadId);
|
|
51
|
+
if (!interrupt) {
|
|
52
|
+
logger.warn(`No interrupt found for thread ${threadId}`);
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
interrupt.resolved = true;
|
|
56
|
+
interrupt.answer = answer;
|
|
57
|
+
this.interrupts.set(threadId, interrupt);
|
|
58
|
+
logger.info(`Resolved interrupt for thread ${threadId} with answer: ${answer}`);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Removes an interrupt.
|
|
63
|
+
*/
|
|
64
|
+
removeInterrupt(threadId) {
|
|
65
|
+
const deleted = this.interrupts.delete(threadId);
|
|
66
|
+
if (deleted) {
|
|
67
|
+
logger.info(`Removed interrupt for thread ${threadId}`);
|
|
68
|
+
}
|
|
69
|
+
return deleted;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Cleans up expired interrupts.
|
|
73
|
+
*/
|
|
74
|
+
cleanupExpired() {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
const expiredThreadIds = [];
|
|
77
|
+
for (const [threadId, interrupt] of this.interrupts.entries()) {
|
|
78
|
+
if (now - interrupt.timestamp > this.INTERRUPT_TTL) {
|
|
79
|
+
expiredThreadIds.push(threadId);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (const threadId of expiredThreadIds) {
|
|
83
|
+
this.interrupts.delete(threadId);
|
|
84
|
+
logger.info(`Cleaned up expired interrupt for thread ${threadId}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Gets the total number of active interrupts.
|
|
89
|
+
*/
|
|
90
|
+
getInterruptCount() {
|
|
91
|
+
this.cleanupExpired();
|
|
92
|
+
return this.interrupts.size;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Clears all interrupts (useful for testing).
|
|
96
|
+
*/
|
|
97
|
+
clear() {
|
|
98
|
+
this.interrupts.clear();
|
|
99
|
+
logger.info('Cleared all interrupts');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=interrupt-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interrupt-manager.js","sourceRoot":"","sources":["../../../lib/workflows/interrupt-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { LangGraphWorkflowDefinition, WorkflowResult, WorkflowStatus } from './types.js';
|
|
2
|
+
import type { InterruptManager } from './interrupt-manager.js';
|
|
3
|
+
import { ToolDiscovery } from '../tools/tool-discovery.js';
|
|
4
|
+
/**
|
|
5
|
+
* Executes LangGraph workflows using ReAct pattern (Reasoning + Acting).
|
|
6
|
+
* Supports autonomous tool/agent discovery and human-in-the-loop via ask_user tool.
|
|
7
|
+
*/
|
|
8
|
+
export declare class LangGraphExecutor {
|
|
9
|
+
private toolDiscovery;
|
|
10
|
+
private interruptManager;
|
|
11
|
+
private checkpointer;
|
|
12
|
+
constructor(toolDiscovery: ToolDiscovery, interruptManager: InterruptManager);
|
|
13
|
+
/**
|
|
14
|
+
* Executes a LangGraph workflow.
|
|
15
|
+
* @param definition - The LangGraph workflow definition
|
|
16
|
+
* @param input - Input values for the workflow
|
|
17
|
+
* @param threadId - Optional thread ID for resuming interrupted workflows
|
|
18
|
+
* @param onStatus - Optional callback for status updates
|
|
19
|
+
* @returns Workflow result
|
|
20
|
+
*/
|
|
21
|
+
execute(definition: LangGraphWorkflowDefinition, input: Record<string, unknown>, threadId?: string, onStatus?: (status: WorkflowStatus) => void): Promise<WorkflowResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Resumes a workflow that was interrupted by ask_user.
|
|
24
|
+
*/
|
|
25
|
+
resumeWithAnswer(definition: LangGraphWorkflowDefinition, threadId: string, answer: string, onStatus?: (status: WorkflowStatus) => void): Promise<WorkflowResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Handles workflow interrupts (ask_user).
|
|
28
|
+
*/
|
|
29
|
+
private handleInterrupt;
|
|
30
|
+
/**
|
|
31
|
+
* Builds a ReAct graph with the given LLM and tools.
|
|
32
|
+
*/
|
|
33
|
+
private buildReActGraph;
|
|
34
|
+
/**
|
|
35
|
+
* Decides whether to continue to tools or end.
|
|
36
|
+
*/
|
|
37
|
+
private shouldContinue;
|
|
38
|
+
/**
|
|
39
|
+
* Interpolates template variables in the goal.
|
|
40
|
+
*/
|
|
41
|
+
private interpolateGoal;
|
|
42
|
+
/**
|
|
43
|
+
* Extracts output from graph state.
|
|
44
|
+
*/
|
|
45
|
+
private extractOutput;
|
|
46
|
+
/**
|
|
47
|
+
* Generates a unique thread ID.
|
|
48
|
+
*/
|
|
49
|
+
private generateThreadId;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=langgraph-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langgraph-executor.d.ts","sourceRoot":"","sources":["../../../lib/workflows/langgraph-executor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,2BAA2B,EAC3B,cAAc,EACd,cAAc,EAEf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAI3D;;;GAGG;AACH,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,gBAAgB;IAJ1B,OAAO,CAAC,YAAY,CAAqB;gBAG/B,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB;IAG5C;;;;;;;OAOG;IACG,OAAO,CACX,UAAU,EAAE,2BAA2B,EACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAC1C,OAAO,CAAC,cAAc,CAAC;IA8F1B;;OAEG;IACG,gBAAgB,CACpB,UAAU,EAAE,2BAA2B,EACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAC1C,OAAO,CAAC,cAAc,CAAC;IAsF1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAmDvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA8CvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiCtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAwBrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAGzB"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { StateGraph, MessagesAnnotation, MemorySaver } from '@langchain/langgraph';
|
|
2
|
+
import { ToolNode } from '@langchain/langgraph/prebuilt';
|
|
3
|
+
import { NodeInterrupt } from '@langchain/langgraph';
|
|
4
|
+
import { LLMFactory } from '../llm/llm-factory.js';
|
|
5
|
+
import { logger } from '../logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Executes LangGraph workflows using ReAct pattern (Reasoning + Acting).
|
|
8
|
+
* Supports autonomous tool/agent discovery and human-in-the-loop via ask_user tool.
|
|
9
|
+
*/
|
|
10
|
+
export class LangGraphExecutor {
|
|
11
|
+
toolDiscovery;
|
|
12
|
+
interruptManager;
|
|
13
|
+
checkpointer = new MemorySaver();
|
|
14
|
+
constructor(toolDiscovery, interruptManager) {
|
|
15
|
+
this.toolDiscovery = toolDiscovery;
|
|
16
|
+
this.interruptManager = interruptManager;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Executes a LangGraph workflow.
|
|
20
|
+
* @param definition - The LangGraph workflow definition
|
|
21
|
+
* @param input - Input values for the workflow
|
|
22
|
+
* @param threadId - Optional thread ID for resuming interrupted workflows
|
|
23
|
+
* @param onStatus - Optional callback for status updates
|
|
24
|
+
* @returns Workflow result
|
|
25
|
+
*/
|
|
26
|
+
async execute(definition, input, threadId, onStatus) {
|
|
27
|
+
const startTime = Date.now();
|
|
28
|
+
const actualThreadId = threadId || this.generateThreadId();
|
|
29
|
+
onStatus?.({
|
|
30
|
+
type: 'workflow_start',
|
|
31
|
+
message: `Starting LangGraph workflow: ${definition.name}`,
|
|
32
|
+
elapsed: 0,
|
|
33
|
+
});
|
|
34
|
+
try {
|
|
35
|
+
// 1. Discover tools
|
|
36
|
+
logger.info(`[LangGraph] Discovering tools for workflow "${definition.name}"...`);
|
|
37
|
+
const tools = await this.toolDiscovery.discoverAll(definition.graph.tools);
|
|
38
|
+
logger.info(`[LangGraph] Discovered ${tools.length} tools`);
|
|
39
|
+
// 2. Discover agents
|
|
40
|
+
logger.info(`[LangGraph] Discovering agents for workflow "${definition.name}"...`);
|
|
41
|
+
const agentTools = await this.toolDiscovery.discoverAgents(definition.graph.agents);
|
|
42
|
+
logger.info(`[LangGraph] Discovered ${agentTools.length} agent tools`);
|
|
43
|
+
// 3. Combine all tools
|
|
44
|
+
const allTools = [...tools, ...agentTools];
|
|
45
|
+
logger.info(`[LangGraph] Total tools available: ${allTools.length}`);
|
|
46
|
+
// 4. Get LLM
|
|
47
|
+
const llm = LLMFactory.create(definition.graph.model);
|
|
48
|
+
// 5. Build and compile graph
|
|
49
|
+
const app = this.buildReActGraph(llm, allTools, definition);
|
|
50
|
+
// 6. Execute
|
|
51
|
+
const goal = this.interpolateGoal(definition.prompt.goal, input);
|
|
52
|
+
const config = {
|
|
53
|
+
recursionLimit: definition.graph.maxIterations,
|
|
54
|
+
configurable: { thread_id: actualThreadId },
|
|
55
|
+
};
|
|
56
|
+
logger.info(`[LangGraph] Executing workflow with goal: ${goal}`);
|
|
57
|
+
const result = await app.invoke({ messages: [{ role: 'user', content: goal }] }, config);
|
|
58
|
+
// 7. Extract output
|
|
59
|
+
const output = this.extractOutput(definition.output, result);
|
|
60
|
+
const duration = Date.now() - startTime;
|
|
61
|
+
onStatus?.({
|
|
62
|
+
type: 'workflow_complete',
|
|
63
|
+
message: 'LangGraph workflow completed',
|
|
64
|
+
elapsed: duration,
|
|
65
|
+
});
|
|
66
|
+
logger.info(`[LangGraph] Workflow completed in ${duration}ms`);
|
|
67
|
+
return {
|
|
68
|
+
output,
|
|
69
|
+
metadata: {
|
|
70
|
+
duration,
|
|
71
|
+
stepsExecuted: result.messages?.length || 0,
|
|
72
|
+
success: true,
|
|
73
|
+
},
|
|
74
|
+
stepResults: {}, // No explicit steps in LangGraph
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
// Check if it's an interrupt
|
|
79
|
+
if (error instanceof NodeInterrupt) {
|
|
80
|
+
return this.handleInterrupt(error, definition, actualThreadId, startTime, onStatus);
|
|
81
|
+
}
|
|
82
|
+
const duration = Date.now() - startTime;
|
|
83
|
+
onStatus?.({
|
|
84
|
+
type: 'workflow_error',
|
|
85
|
+
message: error instanceof Error ? error.message : String(error),
|
|
86
|
+
elapsed: duration,
|
|
87
|
+
error: String(error),
|
|
88
|
+
});
|
|
89
|
+
logger.error(`[LangGraph] Workflow error:`, error);
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resumes a workflow that was interrupted by ask_user.
|
|
95
|
+
*/
|
|
96
|
+
async resumeWithAnswer(definition, threadId, answer, onStatus) {
|
|
97
|
+
const startTime = Date.now();
|
|
98
|
+
logger.info(`[LangGraph] Resuming workflow "${definition.name}" with thread ${threadId}`);
|
|
99
|
+
// Resolve the interrupt
|
|
100
|
+
const resolved = this.interruptManager.resolveInterrupt(threadId, answer);
|
|
101
|
+
if (!resolved) {
|
|
102
|
+
throw new Error(`No active interrupt found for thread ${threadId}`);
|
|
103
|
+
}
|
|
104
|
+
onStatus?.({
|
|
105
|
+
type: 'workflow_start',
|
|
106
|
+
message: `Resuming LangGraph workflow: ${definition.name}`,
|
|
107
|
+
elapsed: 0,
|
|
108
|
+
});
|
|
109
|
+
try {
|
|
110
|
+
// 1. Discover tools (same as before)
|
|
111
|
+
const tools = await this.toolDiscovery.discoverAll(definition.graph.tools);
|
|
112
|
+
const agentTools = await this.toolDiscovery.discoverAgents(definition.graph.agents);
|
|
113
|
+
const allTools = [...tools, ...agentTools];
|
|
114
|
+
// 2. Get LLM
|
|
115
|
+
const llm = LLMFactory.create(definition.graph.model);
|
|
116
|
+
// 3. Build and compile graph
|
|
117
|
+
const app = this.buildReActGraph(llm, allTools, definition);
|
|
118
|
+
// 4. Resume with answer
|
|
119
|
+
const config = {
|
|
120
|
+
recursionLimit: definition.graph.maxIterations,
|
|
121
|
+
configurable: { thread_id: threadId },
|
|
122
|
+
};
|
|
123
|
+
// The answer is passed as a command to resume
|
|
124
|
+
const result = await app.invoke(null, config);
|
|
125
|
+
// 5. Extract output
|
|
126
|
+
const output = this.extractOutput(definition.output, result);
|
|
127
|
+
const duration = Date.now() - startTime;
|
|
128
|
+
onStatus?.({
|
|
129
|
+
type: 'workflow_complete',
|
|
130
|
+
message: 'LangGraph workflow resumed and completed',
|
|
131
|
+
elapsed: duration,
|
|
132
|
+
});
|
|
133
|
+
// Clean up interrupt
|
|
134
|
+
this.interruptManager.removeInterrupt(threadId);
|
|
135
|
+
return {
|
|
136
|
+
output,
|
|
137
|
+
metadata: {
|
|
138
|
+
duration,
|
|
139
|
+
stepsExecuted: result.messages?.length || 0,
|
|
140
|
+
success: true,
|
|
141
|
+
},
|
|
142
|
+
stepResults: {},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
// Check if it's another interrupt
|
|
147
|
+
if (error instanceof NodeInterrupt) {
|
|
148
|
+
return this.handleInterrupt(error, definition, threadId, startTime, onStatus);
|
|
149
|
+
}
|
|
150
|
+
const duration = Date.now() - startTime;
|
|
151
|
+
onStatus?.({
|
|
152
|
+
type: 'workflow_error',
|
|
153
|
+
message: error instanceof Error ? error.message : String(error),
|
|
154
|
+
elapsed: duration,
|
|
155
|
+
error: String(error),
|
|
156
|
+
});
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Handles workflow interrupts (ask_user).
|
|
162
|
+
*/
|
|
163
|
+
handleInterrupt(error, definition, threadId, startTime, onStatus) {
|
|
164
|
+
// NodeInterrupt contains the interrupt data passed from the tool
|
|
165
|
+
// Access it via the error's properties
|
|
166
|
+
const interruptData = error.args?.[0] || {};
|
|
167
|
+
const question = interruptData.question || error.message || 'Agent requires input';
|
|
168
|
+
logger.info(`[LangGraph] Workflow interrupted with question: ${question}`);
|
|
169
|
+
// Store interrupt state
|
|
170
|
+
this.interruptManager.addInterrupt({
|
|
171
|
+
threadId,
|
|
172
|
+
workflowName: definition.name,
|
|
173
|
+
question,
|
|
174
|
+
timestamp: Date.now(),
|
|
175
|
+
resolved: false,
|
|
176
|
+
});
|
|
177
|
+
const interrupt = {
|
|
178
|
+
threadId,
|
|
179
|
+
question,
|
|
180
|
+
timestamp: Date.now(),
|
|
181
|
+
};
|
|
182
|
+
const duration = Date.now() - startTime;
|
|
183
|
+
onStatus?.({
|
|
184
|
+
type: 'workflow_interrupt',
|
|
185
|
+
message: `Workflow paused: ${question}`,
|
|
186
|
+
elapsed: duration,
|
|
187
|
+
interrupt,
|
|
188
|
+
});
|
|
189
|
+
// Return partial result with interrupt info
|
|
190
|
+
return {
|
|
191
|
+
output: { interrupted: true, threadId, question },
|
|
192
|
+
metadata: {
|
|
193
|
+
duration,
|
|
194
|
+
stepsExecuted: 0,
|
|
195
|
+
success: false,
|
|
196
|
+
},
|
|
197
|
+
stepResults: {},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Builds a ReAct graph with the given LLM and tools.
|
|
202
|
+
*/
|
|
203
|
+
buildReActGraph(llm, tools, definition) {
|
|
204
|
+
const executionMode = definition.graph.executionMode || 'react';
|
|
205
|
+
let toolExecutionCount = 0;
|
|
206
|
+
const graph = new StateGraph(MessagesAnnotation)
|
|
207
|
+
.addNode('agent', async (state) => {
|
|
208
|
+
// In single-turn mode, after tools have executed once, don't bind tools
|
|
209
|
+
// This forces the agent to generate a final response without more tool calls
|
|
210
|
+
const shouldBindTools = executionMode === 'react' || toolExecutionCount === 0;
|
|
211
|
+
const modelToUse = shouldBindTools ? llm.bindTools(tools) : llm;
|
|
212
|
+
// Add instruction to wrap up if in single-turn mode after tools executed
|
|
213
|
+
const systemPrompt = executionMode === 'single-turn' && toolExecutionCount > 0
|
|
214
|
+
? `${definition.prompt.system}\n\nIMPORTANT: You have received tool results. Provide your final answer now without calling any more tools.`
|
|
215
|
+
: definition.prompt.system;
|
|
216
|
+
const response = await modelToUse.invoke([
|
|
217
|
+
{ role: 'system', content: systemPrompt },
|
|
218
|
+
...state.messages,
|
|
219
|
+
]);
|
|
220
|
+
return { messages: [response] };
|
|
221
|
+
})
|
|
222
|
+
.addNode('tools', async (state) => {
|
|
223
|
+
toolExecutionCount++;
|
|
224
|
+
const toolNode = new ToolNode(tools);
|
|
225
|
+
return toolNode.invoke(state);
|
|
226
|
+
})
|
|
227
|
+
.addEdge('__start__', 'agent')
|
|
228
|
+
.addConditionalEdges('agent', (state) => this.shouldContinue(state, executionMode, toolExecutionCount))
|
|
229
|
+
.addEdge('tools', 'agent');
|
|
230
|
+
// Compile with checkpointer (enables pause/resume)
|
|
231
|
+
return graph.compile({
|
|
232
|
+
checkpointer: this.checkpointer,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Decides whether to continue to tools or end.
|
|
237
|
+
*/
|
|
238
|
+
shouldContinue(state, executionMode, toolExecutionCount) {
|
|
239
|
+
if (!state.messages || state.messages.length === 0) {
|
|
240
|
+
return '__end__';
|
|
241
|
+
}
|
|
242
|
+
const lastMessage = state.messages[state.messages.length - 1];
|
|
243
|
+
// Check if there are tool calls
|
|
244
|
+
const hasToolCalls = lastMessage &&
|
|
245
|
+
'tool_calls' in lastMessage &&
|
|
246
|
+
Array.isArray(lastMessage.tool_calls) &&
|
|
247
|
+
lastMessage.tool_calls.length > 0;
|
|
248
|
+
if (!hasToolCalls) {
|
|
249
|
+
return '__end__';
|
|
250
|
+
}
|
|
251
|
+
// In single-turn mode, only allow one round of tool execution
|
|
252
|
+
if (executionMode === 'single-turn' && toolExecutionCount > 0) {
|
|
253
|
+
logger.info('[LangGraph] Single-turn mode: tools already executed, ending workflow');
|
|
254
|
+
return '__end__';
|
|
255
|
+
}
|
|
256
|
+
return 'tools';
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Interpolates template variables in the goal.
|
|
260
|
+
*/
|
|
261
|
+
interpolateGoal(template, input) {
|
|
262
|
+
return template.replace(/\{\{input\.([^}]+)\}\}/g, (_, key) => {
|
|
263
|
+
const value = input[key];
|
|
264
|
+
return value !== undefined ? String(value) : '';
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Extracts output from graph state.
|
|
269
|
+
*/
|
|
270
|
+
extractOutput(outputMapping, state) {
|
|
271
|
+
const output = {};
|
|
272
|
+
for (const [key, template] of Object.entries(outputMapping)) {
|
|
273
|
+
// Simple extraction: just get the last message content
|
|
274
|
+
if (template.includes('{{state.messages[-1].content}}')) {
|
|
275
|
+
const lastMessage = state.messages?.[state.messages.length - 1];
|
|
276
|
+
if (lastMessage && 'content' in lastMessage) {
|
|
277
|
+
output[key] = lastMessage.content;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
output[key] = '';
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
// For other templates, just use as-is for now
|
|
285
|
+
output[key] = template;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return output;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Generates a unique thread ID.
|
|
292
|
+
*/
|
|
293
|
+
generateThreadId() {
|
|
294
|
+
return `thread_${Date.now()}_${Math.random().toString(36).substring(7)}`;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=langgraph-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langgraph-executor.js","sourceRoot":"","sources":["../../../lib/workflows/langgraph-executor.ts"],"names":[],"mappings":"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"}
|