agent-orcha 0.0.2 → 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 +777 -100
- 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/sample-data/example-document.txt +0 -15
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
|
|
2
|
+
import { Component } from '../utils/Component.js';
|
|
3
|
+
import { api } from '../services/ApiService.js';
|
|
4
|
+
|
|
5
|
+
export class WorkflowsView extends Component {
|
|
6
|
+
constructor() {
|
|
7
|
+
super();
|
|
8
|
+
this.isLoading = false;
|
|
9
|
+
this.selectedWorkflow = null;
|
|
10
|
+
this.chartInterval = null;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async connectedCallback() {
|
|
14
|
+
super.connectedCallback();
|
|
15
|
+
this.loadWorkflows();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
disconnectedCallback() {
|
|
19
|
+
this.stopChartUpdate();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async loadWorkflows() {
|
|
23
|
+
try {
|
|
24
|
+
const workflows = await api.getWorkflows();
|
|
25
|
+
const select = this.querySelector('#workflowSelect');
|
|
26
|
+
select.innerHTML = '<option value="">-- Select Workflow --</option>' +
|
|
27
|
+
workflows.map(wf => `<option value="${wf.name}">${wf.name} - ${wf.description}</option>`).join('');
|
|
28
|
+
} catch (e) {
|
|
29
|
+
console.error('Failed to load workflows', e);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async onWorkflowSelected(name) {
|
|
34
|
+
if (!name) {
|
|
35
|
+
this.selectedWorkflow = null;
|
|
36
|
+
this.renderDiagram([]);
|
|
37
|
+
this.querySelector('#workflowInputs').innerHTML = '';
|
|
38
|
+
this.querySelector('#runWorkflow').disabled = true;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
const workflow = await api.getWorkflow(name);
|
|
44
|
+
this.selectedWorkflow = workflow;
|
|
45
|
+
this.renderInputs(workflow.input?.schema || {});
|
|
46
|
+
this.renderDiagram(workflow.steps || []);
|
|
47
|
+
this.querySelector('#runWorkflow').disabled = false;
|
|
48
|
+
} catch (e) {
|
|
49
|
+
console.error('Failed to load workflow details', e);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
renderInputs(schema) {
|
|
54
|
+
const container = this.querySelector('#workflowInputs');
|
|
55
|
+
container.innerHTML = '';
|
|
56
|
+
|
|
57
|
+
if (Object.keys(schema).length === 0) return;
|
|
58
|
+
|
|
59
|
+
container.innerHTML = `
|
|
60
|
+
<label class="block text-sm font-medium text-gray-300 mb-2">Workflow Inputs</label>
|
|
61
|
+
<div class="space-y-2">
|
|
62
|
+
${Object.entries(schema).map(([key, field]) => `
|
|
63
|
+
<input type="text" id="wf-${key}"
|
|
64
|
+
placeholder="${key}${field.required ? ' *' : ''}${field.default ? ` (default: ${field.default})` : ''}"
|
|
65
|
+
value="${field.default || ''}"
|
|
66
|
+
class="w-full bg-dark-surface border border-dark-border rounded-lg px-4 py-2.5 text-gray-100 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent">
|
|
67
|
+
`).join('')}
|
|
68
|
+
</div>
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
renderDiagram(steps) {
|
|
73
|
+
const container = this.querySelector('#flowDiagram');
|
|
74
|
+
if (!steps.length) {
|
|
75
|
+
container.innerHTML = '<div class="text-gray-500 italic text-center py-8">No steps defined</div>';
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
container.innerHTML = `
|
|
80
|
+
<div class="flex items-center gap-3 flex-nowrap min-w-max">
|
|
81
|
+
<div class="flex flex-col items-center px-5 py-3 bg-green-500/10 border border-green-500/30 rounded-lg min-w-[100px] text-center">
|
|
82
|
+
<span class="font-semibold text-green-400 text-sm">Input</span>
|
|
83
|
+
</div>
|
|
84
|
+
${steps.map(step => `
|
|
85
|
+
<span class="text-gray-600 text-xl flex-shrink-0">→</span>
|
|
86
|
+
<div id="step-${step.id}" class="step-node flex flex-col items-center px-4 py-3 bg-blue-500/10 border border-blue-500/30 rounded-lg min-w-[120px] text-center transition-all">
|
|
87
|
+
<span class="font-semibold text-blue-300 text-sm">${step.id}</span>
|
|
88
|
+
<span class="text-xs text-gray-400 mt-0.5">${step.agent}</span>
|
|
89
|
+
</div>
|
|
90
|
+
`).join('')}
|
|
91
|
+
<span class="text-gray-600 text-xl flex-shrink-0">→</span>
|
|
92
|
+
<div class="flex flex-col items-center px-5 py-3 bg-green-500/10 border border-green-500/30 rounded-lg min-w-[100px] text-center">
|
|
93
|
+
<span class="font-semibold text-green-400 text-sm">Output</span>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async runWorkflow() {
|
|
100
|
+
if (!this.selectedWorkflow) return;
|
|
101
|
+
|
|
102
|
+
const inputs = {};
|
|
103
|
+
this.querySelectorAll('input[id^="wf-"]').forEach(input => {
|
|
104
|
+
const key = input.id.replace('wf-', '');
|
|
105
|
+
if (input.value) inputs[key] = input.value;
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const outputEl = this.querySelector('#workflowOutput');
|
|
109
|
+
const statusEl = this.querySelector('#workflowStatus');
|
|
110
|
+
const runBtn = this.querySelector('#runWorkflow');
|
|
111
|
+
|
|
112
|
+
statusEl.classList.remove('hidden');
|
|
113
|
+
outputEl.textContent = 'Starting workflow...';
|
|
114
|
+
runBtn.disabled = true;
|
|
115
|
+
|
|
116
|
+
this.startChartUpdate();
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
const res = await api.startWorkflowStream(this.selectedWorkflow.name, inputs);
|
|
120
|
+
const reader = res.body.getReader();
|
|
121
|
+
const decoder = new TextDecoder();
|
|
122
|
+
|
|
123
|
+
while (true) {
|
|
124
|
+
const { done, value } = await reader.read();
|
|
125
|
+
if (done) break;
|
|
126
|
+
|
|
127
|
+
const chunk = decoder.decode(value);
|
|
128
|
+
const lines = chunk.split('\n');
|
|
129
|
+
|
|
130
|
+
for (const line of lines) {
|
|
131
|
+
if (line.startsWith('data: ')) {
|
|
132
|
+
const data = line.slice(6);
|
|
133
|
+
if (data === '[DONE]') continue;
|
|
134
|
+
try {
|
|
135
|
+
const update = JSON.parse(data);
|
|
136
|
+
this.handleStatusUpdate(update);
|
|
137
|
+
} catch (e) { }
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
} catch (e) {
|
|
142
|
+
outputEl.textContent = 'Error: ' + e.message;
|
|
143
|
+
} finally {
|
|
144
|
+
runBtn.disabled = false;
|
|
145
|
+
this.stopChartUpdate();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
handleStatusUpdate(update) {
|
|
150
|
+
if (update.type === 'status') {
|
|
151
|
+
const { message, type, stepId } = update.data;
|
|
152
|
+
this.querySelector('#statusMessage').textContent = message;
|
|
153
|
+
this.addLog(message, type);
|
|
154
|
+
|
|
155
|
+
if (stepId) {
|
|
156
|
+
const stepEl = this.querySelector(`#step-${stepId}`);
|
|
157
|
+
if (stepEl) {
|
|
158
|
+
if (type === 'step_start') stepEl.className = stepEl.className.replace('bg-blue-500/10', 'bg-yellow-500/10 animate-pulse').replace('border-blue-500/30', 'border-yellow-500/30');
|
|
159
|
+
if (type === 'step_complete') stepEl.className = stepEl.className.replace('bg-yellow-500/10 animate-pulse', 'bg-green-500/10').replace('border-yellow-500/30', 'border-green-500/30');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
} else if (update.type === 'result') {
|
|
163
|
+
const outputEl = this.querySelector('#workflowOutput');
|
|
164
|
+
outputEl.textContent = JSON.stringify(update.data.output, null, 2);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
addLog(msg, type) {
|
|
169
|
+
const log = this.querySelector('#statusLog');
|
|
170
|
+
const div = document.createElement('div');
|
|
171
|
+
div.className = 'text-xs font-mono';
|
|
172
|
+
if (type === 'step_error') div.classList.add('text-red-400');
|
|
173
|
+
else if (type === 'step_complete') div.classList.add('text-green-400');
|
|
174
|
+
else div.classList.add('text-gray-400');
|
|
175
|
+
|
|
176
|
+
div.textContent = `[${new Date().toLocaleTimeString()}] ${msg}`;
|
|
177
|
+
log.appendChild(div);
|
|
178
|
+
log.scrollTop = log.scrollHeight;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
startChartUpdate() {
|
|
182
|
+
const start = Date.now();
|
|
183
|
+
const timeEl = this.querySelector('#statusTime');
|
|
184
|
+
this.chartInterval = setInterval(() => {
|
|
185
|
+
const seconds = Math.floor((Date.now() - start) / 1000);
|
|
186
|
+
timeEl.textContent = `${seconds}s`;
|
|
187
|
+
}, 1000);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
stopChartUpdate() {
|
|
191
|
+
if (this.chartInterval) clearInterval(this.chartInterval);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
postRender() {
|
|
195
|
+
this.querySelector('#workflowSelect').addEventListener('change', (e) => {
|
|
196
|
+
this.onWorkflowSelected(e.target.value);
|
|
197
|
+
});
|
|
198
|
+
this.querySelector('#runWorkflow').addEventListener('click', () => {
|
|
199
|
+
this.runWorkflow();
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
template() {
|
|
204
|
+
return `
|
|
205
|
+
<div class="space-y-6 h-full overflow-y-auto pb-8 custom-scrollbar">
|
|
206
|
+
<div>
|
|
207
|
+
<label class="block text-sm font-medium text-gray-300 mb-2">Select Workflow</label>
|
|
208
|
+
<select id="workflowSelect"
|
|
209
|
+
class="w-full bg-dark-surface border border-dark-border rounded-lg px-4 py-2.5 text-gray-100 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent">
|
|
210
|
+
<option value="">Loading...</option>
|
|
211
|
+
</select>
|
|
212
|
+
</div>
|
|
213
|
+
|
|
214
|
+
<div id="flowDiagram" class="bg-dark-surface border border-dark-border rounded-lg p-6 overflow-x-auto min-h-[120px] flex items-center justify-center">
|
|
215
|
+
<div class="text-gray-500 italic">Select a workflow</div>
|
|
216
|
+
</div>
|
|
217
|
+
|
|
218
|
+
<div id="workflowInputs" class="space-y-3"></div>
|
|
219
|
+
|
|
220
|
+
<div id="workflowStatus" class="bg-dark-surface border border-dark-border rounded-lg p-5 hidden">
|
|
221
|
+
<div class="flex justify-between items-center mb-3">
|
|
222
|
+
<div id="statusMessage" class="font-medium text-gray-200">Ready</div>
|
|
223
|
+
<div id="statusTime" class="text-sm text-gray-400">0s</div>
|
|
224
|
+
</div>
|
|
225
|
+
<div id="statusLog" class="bg-dark-bg rounded-lg p-3 h-32 overflow-y-auto space-y-1 border border-dark-border"></div>
|
|
226
|
+
</div>
|
|
227
|
+
|
|
228
|
+
<button id="runWorkflow" disabled
|
|
229
|
+
class="bg-purple-600 hover:bg-purple-700 disabled:bg-gray-700 disabled:cursor-not-allowed text-white font-medium px-6 py-2.5 rounded-lg transition-colors w-full sm:w-auto">
|
|
230
|
+
Run Workflow
|
|
231
|
+
</button>
|
|
232
|
+
|
|
233
|
+
<div>
|
|
234
|
+
<label class="block text-sm font-medium text-gray-300 mb-2">Output</label>
|
|
235
|
+
<div id="workflowOutput"
|
|
236
|
+
class="bg-dark-surface border border-dark-border rounded-lg p-4 min-h-[200px] font-mono text-sm text-gray-300 whitespace-pre-wrap overflow-x-auto"></div>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
`;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
customElements.define('workflows-view', WorkflowsView);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
|
|
2
|
+
import './components/AppRoot.js';
|
|
3
|
+
|
|
4
|
+
// Global error handler for unhandled promise rejections
|
|
5
|
+
window.addEventListener('unhandledrejection', event => {
|
|
6
|
+
console.error('Unhandled rejection:', event.reason);
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
console.log('Agent Orcha Client Initialized');
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
|
|
2
|
+
export class ApiService {
|
|
3
|
+
async getAgents() {
|
|
4
|
+
const res = await fetch('/api/agents');
|
|
5
|
+
return res.json();
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
async invokeAgent(name, input, sessionId) {
|
|
9
|
+
// Kept for backward compatibility if needed, but UI now uses stream
|
|
10
|
+
const res = await fetch(`/api/agents/${name}/invoke`, {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: { 'Content-Type': 'application/json' },
|
|
13
|
+
body: JSON.stringify({ input, sessionId })
|
|
14
|
+
});
|
|
15
|
+
return res.json();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async streamAgent(name, input, sessionId) {
|
|
19
|
+
return fetch(`/api/agents/${name}/stream`, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
body: JSON.stringify({ input, sessionId })
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async getWorkflows() {
|
|
27
|
+
const res = await fetch('/api/workflows');
|
|
28
|
+
return res.json();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async getWorkflow(name) {
|
|
32
|
+
const res = await fetch(`/api/workflows/${name}`);
|
|
33
|
+
return res.json();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async startWorkflowStream(name, input) {
|
|
37
|
+
return fetch(`/api/workflows/${name}/stream`, {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: { 'Content-Type': 'application/json' },
|
|
40
|
+
body: JSON.stringify({ input })
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async getKnowledgeStores() {
|
|
45
|
+
const res = await fetch('/api/knowledge');
|
|
46
|
+
return res.json();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async getKnowledgeStore(name) {
|
|
50
|
+
const res = await fetch(`/api/knowledge/${name}`);
|
|
51
|
+
return res.json();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async searchKnowledgeStore(name, query, k) {
|
|
55
|
+
const res = await fetch(`/api/knowledge/${name}/search`, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: { 'Content-Type': 'application/json' },
|
|
58
|
+
body: JSON.stringify({ query, k })
|
|
59
|
+
});
|
|
60
|
+
return res.json();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async getLLMs() {
|
|
64
|
+
const res = await fetch('/api/llm');
|
|
65
|
+
return res.json();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async chatLLM(name, message) {
|
|
69
|
+
const res = await fetch(`/api/llm/${name}/chat`, {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers: { 'Content-Type': 'application/json' },
|
|
72
|
+
body: JSON.stringify({ message })
|
|
73
|
+
});
|
|
74
|
+
return res.json();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async streamLLM(name, message) {
|
|
78
|
+
return fetch(`/api/llm/${name}/stream`, {
|
|
79
|
+
method: 'POST',
|
|
80
|
+
headers: { 'Content-Type': 'application/json' },
|
|
81
|
+
body: JSON.stringify({ message })
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async getMCPServers() {
|
|
86
|
+
const res = await fetch('/api/mcp');
|
|
87
|
+
return res.json();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async getMCPTools(serverName) {
|
|
91
|
+
const res = await fetch(`/api/mcp/${serverName}/tools`);
|
|
92
|
+
return res.json();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async executeMcpTool(serverName, toolName, args) {
|
|
96
|
+
const res = await fetch(`/api/mcp/${serverName}/call`, {
|
|
97
|
+
method: 'POST',
|
|
98
|
+
headers: { 'Content-Type': 'application/json' },
|
|
99
|
+
body: JSON.stringify({ tool: toolName, arguments: args })
|
|
100
|
+
});
|
|
101
|
+
return res.json();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async getFunctions() {
|
|
105
|
+
const res = await fetch('/api/functions');
|
|
106
|
+
return res.json();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async getFunction(name) {
|
|
110
|
+
const res = await fetch(`/api/functions/${name}`);
|
|
111
|
+
return res.json();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async executeFunction(name, args) {
|
|
115
|
+
const res = await fetch(`/api/functions/${name}/call`, {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
headers: { 'Content-Type': 'application/json' },
|
|
118
|
+
body: JSON.stringify({ arguments: args })
|
|
119
|
+
});
|
|
120
|
+
return res.json();
|
|
121
|
+
}
|
|
122
|
+
async getFileTree() {
|
|
123
|
+
const res = await fetch('/api/files/tree');
|
|
124
|
+
return res.json();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async readFile(filePath) {
|
|
128
|
+
const res = await fetch(`/api/files/read?path=${encodeURIComponent(filePath)}`);
|
|
129
|
+
return res.json();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
async writeFile(filePath, content) {
|
|
133
|
+
const res = await fetch('/api/files/write', {
|
|
134
|
+
method: 'PUT',
|
|
135
|
+
headers: { 'Content-Type': 'application/json' },
|
|
136
|
+
body: JSON.stringify({ path: filePath, content })
|
|
137
|
+
});
|
|
138
|
+
return res.json();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export const api = new ApiService();
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
|
|
2
|
+
class Store extends EventTarget {
|
|
3
|
+
constructor() {
|
|
4
|
+
super();
|
|
5
|
+
const validTabs = ['agents', 'workflows', 'knowledge', 'mcp', 'ide'];
|
|
6
|
+
const hashTab = window.location.hash.replace('#', '');
|
|
7
|
+
const initialTab = validTabs.includes(hashTab) ? hashTab : 'agents';
|
|
8
|
+
|
|
9
|
+
this.data = {
|
|
10
|
+
activeTab: initialTab,
|
|
11
|
+
agents: [],
|
|
12
|
+
selectedAgent: null,
|
|
13
|
+
chatHistory: [],
|
|
14
|
+
sessionId: 'session-' + Date.now() + '-' + Math.random().toString(36).substring(2, 9),
|
|
15
|
+
workflows: [],
|
|
16
|
+
knowledgeStores: [],
|
|
17
|
+
llms: [],
|
|
18
|
+
mcpServers: [],
|
|
19
|
+
functions: []
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
get(key) {
|
|
24
|
+
return this.data[key];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
set(key, value) {
|
|
28
|
+
this.data[key] = value;
|
|
29
|
+
this.dispatchEvent(new CustomEvent('state-change', { detail: { key, value } }));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Helper to update partial state
|
|
33
|
+
update(updates) {
|
|
34
|
+
Object.entries(updates).forEach(([key, value]) => {
|
|
35
|
+
this.data[key] = value;
|
|
36
|
+
this.dispatchEvent(new CustomEvent('state-change', { detail: { key, value } }));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const store = new Store();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
export class Component extends HTMLElement {
|
|
3
|
+
constructor() {
|
|
4
|
+
super();
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
connectedCallback() {
|
|
8
|
+
this.render();
|
|
9
|
+
this.postRender();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
render() {
|
|
13
|
+
this.innerHTML = this.template();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
postRender() {
|
|
17
|
+
// Override for event listeners etc.
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
template() {
|
|
21
|
+
return '<div></div>';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders markdown to sanitized HTML with syntax highlighting
|
|
3
|
+
*/
|
|
4
|
+
export class MarkdownRenderer {
|
|
5
|
+
constructor() {
|
|
6
|
+
// Configure marked for streaming-friendly rendering
|
|
7
|
+
if (typeof marked !== 'undefined') {
|
|
8
|
+
marked.setOptions({
|
|
9
|
+
gfm: true, // GitHub Flavored Markdown
|
|
10
|
+
breaks: true, // Convert \n to <br>
|
|
11
|
+
headerIds: false, // Disable header IDs (not needed for chat)
|
|
12
|
+
mangle: false, // Don't mangle email addresses
|
|
13
|
+
sanitize: false, // We'll use DOMPurify instead
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Render markdown string to sanitized HTML
|
|
20
|
+
* @param {string} markdown - Raw markdown text
|
|
21
|
+
* @returns {string} Sanitized HTML string
|
|
22
|
+
*/
|
|
23
|
+
render(markdown) {
|
|
24
|
+
if (!markdown) return '';
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
// Step 1: Parse markdown to HTML
|
|
28
|
+
const rawHtml = marked.parse(markdown);
|
|
29
|
+
|
|
30
|
+
// Step 2: Sanitize HTML with DOMPurify
|
|
31
|
+
const cleanHtml = DOMPurify.sanitize(rawHtml, {
|
|
32
|
+
ALLOWED_TAGS: [
|
|
33
|
+
'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
|
|
34
|
+
'p', 'br', 'strong', 'em', 'u', 's', 'del',
|
|
35
|
+
'ul', 'ol', 'li',
|
|
36
|
+
'a', 'code', 'pre',
|
|
37
|
+
'blockquote', 'hr',
|
|
38
|
+
'table', 'thead', 'tbody', 'tr', 'th', 'td',
|
|
39
|
+
'span', 'div'
|
|
40
|
+
],
|
|
41
|
+
ALLOWED_ATTR: ['href', 'class', 'id', 'target', 'rel'],
|
|
42
|
+
ALLOW_DATA_ATTR: false,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return cleanHtml;
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error('Markdown rendering error:', error);
|
|
48
|
+
// Fallback to plain text on error
|
|
49
|
+
return this.escapeHtml(markdown);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Apply syntax highlighting to rendered markdown HTML
|
|
55
|
+
* @param {HTMLElement} element - DOM element containing rendered markdown
|
|
56
|
+
*/
|
|
57
|
+
highlightCode(element) {
|
|
58
|
+
if (typeof hljs === 'undefined') return;
|
|
59
|
+
|
|
60
|
+
const codeBlocks = element.querySelectorAll('pre code');
|
|
61
|
+
codeBlocks.forEach(block => {
|
|
62
|
+
// Remove existing highlighting
|
|
63
|
+
block.removeAttribute('data-highlighted');
|
|
64
|
+
// Apply syntax highlighting
|
|
65
|
+
hljs.highlightElement(block);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Escape HTML for fallback rendering
|
|
71
|
+
* @param {string} text
|
|
72
|
+
* @returns {string}
|
|
73
|
+
*/
|
|
74
|
+
escapeHtml(text) {
|
|
75
|
+
const div = document.createElement('div');
|
|
76
|
+
div.textContent = text;
|
|
77
|
+
return div.innerHTML;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Create singleton instance
|
|
82
|
+
export const markdownRenderer = new MarkdownRenderer();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,CAAC;AAyDvB,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,CAAC;AAyDvB,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEjE"}
|
|
@@ -14,7 +14,7 @@ async function directoryExists(dirPath) {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
async function validateProjectStructure(projectRoot) {
|
|
17
|
-
const requiredDirs = ['agents', 'functions', '
|
|
17
|
+
const requiredDirs = ['agents', 'functions', 'knowledge', 'workflows'];
|
|
18
18
|
const missingDirs = [];
|
|
19
19
|
for (const dir of requiredDirs) {
|
|
20
20
|
const dirPath = path.join(projectRoot, dir);
|
|
@@ -72,6 +72,7 @@ export async function startCommand(_args) {
|
|
|
72
72
|
╔═══════════════════════════════════════════════════════════╗
|
|
73
73
|
║ AGENT ORCHA ║
|
|
74
74
|
║ Declare the system. Orcha handles the REST. ║
|
|
75
|
+
║ Knowledge, Agent, Action ║
|
|
75
76
|
╚═══════════════════════════════════════════════════════════╝
|
|
76
77
|
`);
|
|
77
78
|
console.log(`Project root: ${projectRoot}\n`);
|
|
@@ -91,7 +92,7 @@ export async function startCommand(_args) {
|
|
|
91
92
|
await orchestrator.initialize();
|
|
92
93
|
logger.info(`Loaded ${orchestrator.agents.names().length} agents`);
|
|
93
94
|
logger.info(`Loaded ${orchestrator.workflows.names().length} workflows`);
|
|
94
|
-
logger.info(`Loaded ${orchestrator.
|
|
95
|
+
logger.info(`Loaded ${orchestrator.knowledge.listConfigs().length} knowledge configs`);
|
|
95
96
|
const server = await createServer(orchestrator);
|
|
96
97
|
const shutdown = async () => {
|
|
97
98
|
logger.info('\nShutting down...');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,WAAmB;IACzD,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,WAAmB;IACzD,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,EAAE,CAAC;IAEvB,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACtC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,EAAE,CAAC;IAE1B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAe;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBb,CAAC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,IAAI,CAAC,CAAC;IAE9C,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;IAE9C,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;QACpC,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,SAAS,CAAC,CAAC;IACnE,MAAM,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,YAAY,CAAC,CAAC;IACzE,MAAM,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAEvF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;QACzC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,kBAAkB,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -6,28 +6,62 @@ import { Orchestrator } from '../lib/index.js';
|
|
|
6
6
|
import { createServer } from './server.js';
|
|
7
7
|
import { logger } from '../lib/logger.js';
|
|
8
8
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
-
|
|
9
|
+
// Add environment variable configuration
|
|
10
|
+
const baseDir = process.env.ORCHA_BASE_DIR
|
|
11
|
+
? path.resolve(process.env.ORCHA_BASE_DIR)
|
|
12
|
+
: path.resolve(__dirname, '..');
|
|
10
13
|
function resolveResource(name) {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
const resourcePath = path.join(baseDir, name);
|
|
15
|
+
return resourcePath;
|
|
16
|
+
}
|
|
17
|
+
function validateConfiguration() {
|
|
18
|
+
const criticalFiles = [
|
|
19
|
+
{ path: resolveResource('llm.json'), name: 'LLM configuration' },
|
|
20
|
+
{ path: resolveResource('mcp.json'), name: 'MCP configuration' },
|
|
21
|
+
];
|
|
22
|
+
const criticalDirs = [
|
|
23
|
+
{ path: resolveResource('agents'), name: 'agents directory' },
|
|
24
|
+
{ path: resolveResource('workflows'), name: 'workflows directory' },
|
|
25
|
+
{ path: resolveResource('knowledge'), name: 'knowledge directory' },
|
|
26
|
+
{ path: resolveResource('functions'), name: 'functions directory' },
|
|
27
|
+
];
|
|
28
|
+
const missingFiles = [];
|
|
29
|
+
// Check critical files
|
|
30
|
+
for (const { path, name } of criticalFiles) {
|
|
31
|
+
if (!fs.existsSync(path)) {
|
|
32
|
+
missingFiles.push(`${name} (${path})`);
|
|
33
|
+
logger.error(`Missing required file: ${path}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Check critical directories
|
|
37
|
+
for (const { path, name } of criticalDirs) {
|
|
38
|
+
if (!fs.existsSync(path)) {
|
|
39
|
+
missingFiles.push(`${name} (${path})`);
|
|
40
|
+
logger.error(`Missing required directory: ${path}`);
|
|
41
|
+
}
|
|
15
42
|
}
|
|
16
|
-
if (
|
|
17
|
-
|
|
18
|
-
|
|
43
|
+
if (missingFiles.length > 0) {
|
|
44
|
+
const errorMsg = `Configuration validation failed. Missing ${missingFiles.length} required resource(s):\n` +
|
|
45
|
+
missingFiles.map(f => ` - ${f}`).join('\n') +
|
|
46
|
+
`\n\nBase directory: ${baseDir}\n` +
|
|
47
|
+
`Set ORCHA_BASE_DIR environment variable to specify a different configuration directory.`;
|
|
48
|
+
logger.error(errorMsg);
|
|
49
|
+
throw new Error(errorMsg);
|
|
19
50
|
}
|
|
20
|
-
|
|
51
|
+
logger.info('Configuration validation passed');
|
|
21
52
|
}
|
|
22
53
|
async function main() {
|
|
23
54
|
const port = parseInt(process.env['PORT'] ?? '3000', 10);
|
|
24
55
|
const host = process.env['HOST'] ?? '0.0.0.0';
|
|
25
56
|
logger.info('Initializing Agent Orchestrator...');
|
|
57
|
+
logger.info(`Base directory: ${baseDir}`);
|
|
58
|
+
// Validate configuration exists before proceeding
|
|
59
|
+
validateConfiguration();
|
|
26
60
|
const orchestrator = new Orchestrator({
|
|
27
|
-
projectRoot,
|
|
61
|
+
projectRoot: baseDir,
|
|
28
62
|
agentsDir: resolveResource('agents'),
|
|
29
63
|
workflowsDir: resolveResource('workflows'),
|
|
30
|
-
|
|
64
|
+
knowledgeDir: resolveResource('knowledge'),
|
|
31
65
|
functionsDir: resolveResource('functions'),
|
|
32
66
|
mcpConfigPath: resolveResource('mcp.json'),
|
|
33
67
|
llmConfigPath: resolveResource('llm.json'),
|
|
@@ -35,7 +69,7 @@ async function main() {
|
|
|
35
69
|
await orchestrator.initialize();
|
|
36
70
|
logger.info(`Loaded ${orchestrator.agents.names().length} agents`);
|
|
37
71
|
logger.info(`Loaded ${orchestrator.workflows.names().length} workflows`);
|
|
38
|
-
logger.info(`Loaded ${orchestrator.
|
|
72
|
+
logger.info(`Loaded ${orchestrator.knowledge.listConfigs().length} knowledge configs`);
|
|
39
73
|
const server = await createServer(orchestrator);
|
|
40
74
|
const shutdown = async () => {
|
|
41
75
|
logger.info('\nShutting down...');
|