agent-orcha 0.0.7 → 0.0.8
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 +86 -28
- package/dist/lib/agents/agent-executor.d.ts.map +1 -1
- package/dist/lib/agents/agent-executor.js +23 -7
- package/dist/lib/agents/agent-executor.js.map +1 -1
- package/dist/lib/agents/react-loop.d.ts.map +1 -1
- package/dist/lib/agents/react-loop.js +27 -0
- package/dist/lib/agents/react-loop.js.map +1 -1
- package/dist/lib/functions/simple-function-wrapper.js +3 -3
- package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
- package/dist/lib/knowledge/knowledge-store.d.ts +1 -1
- package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
- package/dist/lib/knowledge/knowledge-store.js +25 -4
- package/dist/lib/knowledge/knowledge-store.js.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.d.ts +0 -1
- package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.js +7 -15
- package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
- package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -1
- package/dist/lib/knowledge/sqlite-store.js +19 -10
- package/dist/lib/knowledge/sqlite-store.js.map +1 -1
- package/dist/lib/knowledge/types.d.ts +13 -13
- package/dist/lib/llm/index.d.ts +1 -1
- package/dist/lib/llm/index.d.ts.map +1 -1
- package/dist/lib/llm/index.js +1 -1
- package/dist/lib/llm/index.js.map +1 -1
- package/dist/lib/llm/llm-config.d.ts +51 -8
- package/dist/lib/llm/llm-config.d.ts.map +1 -1
- package/dist/lib/llm/llm-config.js +161 -17
- package/dist/lib/llm/llm-config.js.map +1 -1
- package/dist/lib/llm/llm-factory.d.ts +1 -2
- package/dist/lib/llm/llm-factory.d.ts.map +1 -1
- package/dist/lib/llm/llm-factory.js +41 -8
- package/dist/lib/llm/llm-factory.js.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.d.ts +10 -0
- package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
- package/dist/lib/llm/providers/openai-chat-model.js +37 -5
- package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
- package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -1
- package/dist/lib/llm/providers/openai-embeddings.js +41 -10
- package/dist/lib/llm/providers/openai-embeddings.js.map +1 -1
- package/dist/lib/local-llm/binary-manager.d.ts +66 -0
- package/dist/lib/local-llm/binary-manager.d.ts.map +1 -0
- package/dist/lib/local-llm/binary-manager.js +441 -0
- package/dist/lib/local-llm/binary-manager.js.map +1 -0
- package/dist/lib/local-llm/engine-interface.d.ts +47 -0
- package/dist/lib/local-llm/engine-interface.d.ts.map +1 -0
- package/dist/lib/local-llm/engine-interface.js +2 -0
- package/dist/lib/local-llm/engine-interface.js.map +1 -0
- package/dist/lib/local-llm/engine-registry.d.ts +20 -0
- package/dist/lib/local-llm/engine-registry.d.ts.map +1 -0
- package/dist/lib/local-llm/engine-registry.js +56 -0
- package/dist/lib/local-llm/engine-registry.js.map +1 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts +31 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts.map +1 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.js +164 -0
- package/dist/lib/local-llm/engines/llama-cpp-engine.js.map +1 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts +31 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts.map +1 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.js +161 -0
- package/dist/lib/local-llm/engines/mlx-serve-engine.js.map +1 -0
- package/dist/lib/local-llm/gguf-reader.d.ts +20 -0
- package/dist/lib/local-llm/gguf-reader.d.ts.map +1 -0
- package/dist/lib/local-llm/gguf-reader.js +190 -0
- package/dist/lib/local-llm/gguf-reader.js.map +1 -0
- package/dist/lib/local-llm/index.d.ts +9 -0
- package/dist/lib/local-llm/index.d.ts.map +1 -0
- package/dist/lib/local-llm/index.js +6 -0
- package/dist/lib/local-llm/index.js.map +1 -0
- package/dist/lib/local-llm/llama-server-process.d.ts +42 -0
- package/dist/lib/local-llm/llama-server-process.d.ts.map +1 -0
- package/dist/lib/local-llm/llama-server-process.js +237 -0
- package/dist/lib/local-llm/llama-server-process.js.map +1 -0
- package/dist/lib/local-llm/mlx-binary-manager.d.ts +33 -0
- package/dist/lib/local-llm/mlx-binary-manager.d.ts.map +1 -0
- package/dist/lib/local-llm/mlx-binary-manager.js +211 -0
- package/dist/lib/local-llm/mlx-binary-manager.js.map +1 -0
- package/dist/lib/local-llm/mlx-server-process.d.ts +26 -0
- package/dist/lib/local-llm/mlx-server-process.d.ts.map +1 -0
- package/dist/lib/local-llm/mlx-server-process.js +210 -0
- package/dist/lib/local-llm/mlx-server-process.js.map +1 -0
- package/dist/lib/local-llm/model-manager.d.ts +33 -0
- package/dist/lib/local-llm/model-manager.d.ts.map +1 -0
- package/dist/lib/local-llm/model-manager.js +591 -0
- package/dist/lib/local-llm/model-manager.js.map +1 -0
- package/dist/lib/local-llm/types.d.ts +51 -0
- package/dist/lib/local-llm/types.d.ts.map +1 -0
- package/dist/lib/local-llm/types.js +2 -0
- package/dist/lib/local-llm/types.js.map +1 -0
- package/dist/lib/logger.d.ts +2 -0
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +68 -5
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/orchestrator.d.ts +9 -0
- package/dist/lib/orchestrator.d.ts.map +1 -1
- package/dist/lib/orchestrator.js +151 -3
- package/dist/lib/orchestrator.js.map +1 -1
- package/dist/lib/sandbox/cdp-client.d.ts +2 -1
- package/dist/lib/sandbox/cdp-client.d.ts.map +1 -1
- package/dist/lib/sandbox/cdp-client.js +33 -7
- package/dist/lib/sandbox/cdp-client.js.map +1 -1
- package/dist/lib/sandbox/index.d.ts +1 -0
- package/dist/lib/sandbox/index.d.ts.map +1 -1
- package/dist/lib/sandbox/index.js +1 -0
- package/dist/lib/sandbox/index.js.map +1 -1
- package/dist/lib/sandbox/page-readiness.d.ts.map +1 -1
- package/dist/lib/sandbox/page-readiness.js +33 -0
- package/dist/lib/sandbox/page-readiness.js.map +1 -1
- package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-browser.js +14 -1
- package/dist/lib/sandbox/sandbox-browser.js.map +1 -1
- package/dist/lib/sandbox/sandbox-container.d.ts +39 -0
- package/dist/lib/sandbox/sandbox-container.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-container.js +176 -0
- package/dist/lib/sandbox/sandbox-container.js.map +1 -0
- package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-file.js +5 -4
- package/dist/lib/sandbox/sandbox-file.js.map +1 -1
- package/dist/lib/sandbox/sandbox-shell.d.ts +2 -1
- package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-shell.js +42 -24
- package/dist/lib/sandbox/sandbox-shell.js.map +1 -1
- package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
- package/dist/lib/sandbox/sandbox-web.js +27 -2
- package/dist/lib/sandbox/sandbox-web.js.map +1 -1
- package/dist/lib/sandbox/vision-browser.d.ts.map +1 -1
- package/dist/lib/sandbox/vision-browser.js +9 -0
- package/dist/lib/sandbox/vision-browser.js.map +1 -1
- package/dist/lib/sea/app-window.d.ts +7 -0
- package/dist/lib/sea/app-window.d.ts.map +1 -0
- package/dist/lib/sea/app-window.js +95 -0
- package/dist/lib/sea/app-window.js.map +1 -0
- package/dist/lib/sea/bootstrap.d.ts +18 -0
- package/dist/lib/sea/bootstrap.d.ts.map +1 -0
- package/dist/lib/sea/bootstrap.js +103 -0
- package/dist/lib/sea/bootstrap.js.map +1 -0
- package/dist/lib/sea/sqlite-vec-shim.d.ts +3 -0
- package/dist/lib/sea/sqlite-vec-shim.d.ts.map +1 -0
- package/dist/lib/sea/sqlite-vec-shim.js +10 -0
- package/dist/lib/sea/sqlite-vec-shim.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +1 -2
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +7 -13
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +2 -4
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-search.tool.js +4 -4
- package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.js +70 -37
- package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-tools-factory.js +2 -2
- package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +1 -2
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js +5 -11
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.js +5 -4
- package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
- package/dist/lib/types/tool-factory.d.ts.map +1 -1
- package/dist/lib/types/tool-factory.js +9 -2
- package/dist/lib/types/tool-factory.js.map +1 -1
- package/dist/lib/utils/document-extract.d.ts +10 -0
- package/dist/lib/utils/document-extract.d.ts.map +1 -0
- package/dist/lib/utils/document-extract.js +149 -0
- package/dist/lib/utils/document-extract.js.map +1 -0
- package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -1
- package/dist/lib/workflows/react-workflow-executor.js +20 -14
- package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
- package/dist/lib/workflows/types.d.ts +71 -45
- package/dist/lib/workflows/types.d.ts.map +1 -1
- package/dist/lib/workflows/types.js +10 -0
- package/dist/lib/workflows/types.js.map +1 -1
- package/dist/public/assets/logo.png +0 -0
- package/dist/public/chat.html +3 -78
- package/dist/public/index.html +3 -330
- package/dist/public/src/components/AgentComposer.js +132 -132
- package/dist/public/src/components/AgentsView.js +1231 -350
- package/dist/public/src/components/AppRoot.js +101 -39
- package/dist/public/src/components/GraphView.js +11 -13
- package/dist/public/src/components/IdeView.js +133 -98
- package/dist/public/src/components/KnowledgeView.js +94 -130
- package/dist/public/src/components/LlmView.js +15 -19
- package/dist/public/src/components/LocalLlmView.js +2440 -0
- package/dist/public/src/components/LogViewer.js +155 -0
- package/dist/public/src/components/McpView.js +41 -49
- package/dist/public/src/components/MonitorView.js +79 -126
- package/dist/public/src/components/NavBar.js +16 -26
- package/dist/public/src/components/StandaloneChat.js +136 -150
- package/dist/public/src/services/ApiService.js +196 -2
- package/dist/public/src/services/SessionStore.js +6 -3
- package/dist/public/src/services/StreamManager.js +183 -0
- package/dist/public/src/store.js +1 -1
- package/dist/public/src/utils/card.js +21 -0
- package/dist/public/src/utils/markdown.js +1 -7
- package/dist/public/styles.css +2777 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +7 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/start.d.ts.map +1 -1
- package/dist/src/cli/commands/start.js +28 -5
- package/dist/src/cli/commands/start.js.map +1 -1
- package/dist/src/cli/index.js +13 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/index.js +7 -1
- 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 +2 -0
- package/dist/src/routes/agents.route.js.map +1 -1
- package/dist/src/routes/chat.route.d.ts.map +1 -1
- package/dist/src/routes/chat.route.js +3 -2
- package/dist/src/routes/chat.route.js.map +1 -1
- package/dist/src/routes/llm.route.d.ts.map +1 -1
- package/dist/src/routes/llm.route.js +227 -7
- package/dist/src/routes/llm.route.js.map +1 -1
- package/dist/src/routes/local-llm.route.d.ts +3 -0
- package/dist/src/routes/local-llm.route.d.ts.map +1 -0
- package/dist/src/routes/local-llm.route.js +688 -0
- package/dist/src/routes/local-llm.route.js.map +1 -0
- package/dist/src/routes/logs.route.d.ts +3 -0
- package/dist/src/routes/logs.route.d.ts.map +1 -0
- package/dist/src/routes/logs.route.js +24 -0
- package/dist/src/routes/logs.route.js.map +1 -0
- package/dist/src/routes/vnc.route.d.ts +10 -1
- package/dist/src/routes/vnc.route.d.ts.map +1 -1
- package/dist/src/routes/vnc.route.js +37 -12
- package/dist/src/routes/vnc.route.js.map +1 -1
- package/dist/src/routes/workflows.route.d.ts.map +1 -1
- package/dist/src/routes/workflows.route.js +24 -0
- package/dist/src/routes/workflows.route.js.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +24 -2
- package/dist/src/server.js.map +1 -1
- package/dist/templates/agents/actor.agent.yaml +34 -0
- package/dist/templates/agents/architect.agent.yaml +0 -1
- package/dist/templates/agents/chatbot.agent.yaml +0 -1
- package/dist/templates/agents/corporate.agent.yaml +0 -1
- package/dist/templates/agents/functions.agent.yaml +29 -0
- package/dist/templates/agents/investment-analyst.agent.yaml +0 -1
- package/dist/templates/agents/music-librarian.agent.yaml +3 -27
- package/dist/templates/agents/network-security.agent.yaml +0 -1
- package/dist/templates/agents/transport-security.agent.yaml +0 -1
- package/dist/templates/agents/web-engineer.agent.yaml +3 -4
- package/dist/templates/agents/web-pilot.agent.yaml +0 -1
- package/dist/templates/knowledge/patient-records.knowledge.yaml +20 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_0.pdf +0 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_1.pdf +0 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_10.pdf +0 -0
- package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_11.pdf +0 -0
- package/dist/templates/knowledge/web-docs.knowledge.yaml +1 -1
- package/dist/templates/llm.json +73 -10
- package/dist/templates/skills/orcha-builder/SKILL.md +56 -3
- package/dist/templates/workflows/example.workflow.yaml +27 -35
- package/dist/templates/workflows/react-example.workflow.yaml +14 -19
- package/dist/templates/workflows/team-chat.workflow.yaml +47 -0
- package/package.json +14 -6
- package/dist/public/src/components/SkillsView.js +0 -137
- package/dist/public/src/components/WorkflowsView.js +0 -568
package/dist/templates/llm.json
CHANGED
|
@@ -1,21 +1,84 @@
|
|
|
1
1
|
{
|
|
2
|
+
"version": "1.0",
|
|
2
3
|
"models": {
|
|
3
|
-
"default":
|
|
4
|
+
"default": "llama-cpp",
|
|
5
|
+
"mlx-serve": {
|
|
6
|
+
"provider": "local",
|
|
7
|
+
"engine": "mlx-serve",
|
|
8
|
+
"model": "Qwen3.5-4B-4bit",
|
|
9
|
+
"contextSize": 32768,
|
|
10
|
+
"reasoningBudget": 0
|
|
11
|
+
},
|
|
12
|
+
"llama-cpp": {
|
|
13
|
+
"provider": "local",
|
|
14
|
+
"engine": "llama-cpp",
|
|
15
|
+
"model": "Qwen3.5-4B-IQ4_NL",
|
|
16
|
+
"contextSize": 32768,
|
|
17
|
+
"reasoningBudget": 0
|
|
18
|
+
},
|
|
19
|
+
"lmstudio": {
|
|
20
|
+
"provider": "local",
|
|
21
|
+
"engine": "lmstudio",
|
|
22
|
+
"baseUrl": "http://localhost:1234/v1",
|
|
23
|
+
"model": "qwen3.5-9b",
|
|
24
|
+
"reasoningBudget": 0
|
|
25
|
+
},
|
|
26
|
+
"ollama": {
|
|
27
|
+
"provider": "local",
|
|
28
|
+
"engine": "ollama",
|
|
29
|
+
"baseUrl": "http://localhost:11434/v1",
|
|
30
|
+
"model": "qwen3.5:latest",
|
|
31
|
+
"reasoningBudget": 0
|
|
32
|
+
},
|
|
33
|
+
"openai": {
|
|
4
34
|
"provider": "openai",
|
|
5
|
-
"baseUrl": "http://host.docker.internal:1234/v1",
|
|
6
35
|
"apiKey": "${OPENAI_API_KEY}",
|
|
7
|
-
"model": "
|
|
8
|
-
|
|
9
|
-
|
|
36
|
+
"model": "gpt-5.4"
|
|
37
|
+
},
|
|
38
|
+
"anthropic": {
|
|
39
|
+
"provider": "anthropic",
|
|
40
|
+
"apiKey": "${ANTHROPIC_API_KEY}",
|
|
41
|
+
"model": "claude-sonnet-4-6"
|
|
42
|
+
},
|
|
43
|
+
"gemini": {
|
|
44
|
+
"provider": "gemini",
|
|
45
|
+
"apiKey": "${GOOGLE_API_KEY}",
|
|
46
|
+
"model": "gemini-3.1-pro-preview"
|
|
10
47
|
}
|
|
11
48
|
},
|
|
12
49
|
"embeddings": {
|
|
13
|
-
"default":
|
|
50
|
+
"default": "llama-cpp",
|
|
51
|
+
"llama-cpp": {
|
|
52
|
+
"provider": "local",
|
|
53
|
+
"engine": "llama-cpp",
|
|
54
|
+
"model": "nomic-embed-text-v1.5.Q4_K_M"
|
|
55
|
+
},
|
|
56
|
+
"mlx-serve": {
|
|
57
|
+
"provider": "local",
|
|
58
|
+
"engine": "mlx-serve",
|
|
59
|
+
"model": "all-MiniLM-L6-v2-4bit"
|
|
60
|
+
},
|
|
61
|
+
"lmstudio": {
|
|
62
|
+
"provider": "local",
|
|
63
|
+
"engine": "lmstudio",
|
|
64
|
+
"baseUrl": "http://192.168.2.61:1234/v1",
|
|
65
|
+
"model": "nomic-ai/text-embedding-nomic-embed-text-v1.5"
|
|
66
|
+
},
|
|
67
|
+
"ollama": {
|
|
68
|
+
"provider": "local",
|
|
69
|
+
"engine": "ollama",
|
|
70
|
+
"baseUrl": "http://localhost:11434/v1",
|
|
71
|
+
"model": "nomic-embed-text:v1.5"
|
|
72
|
+
},
|
|
73
|
+
"openai": {
|
|
14
74
|
"provider": "openai",
|
|
15
|
-
"baseUrl": "http://host.docker.internal:1234/v1",
|
|
16
75
|
"apiKey": "${OPENAI_API_KEY}",
|
|
17
|
-
"model": "text-embedding-
|
|
18
|
-
|
|
76
|
+
"model": "text-embedding-3-small"
|
|
77
|
+
},
|
|
78
|
+
"gemini": {
|
|
79
|
+
"provider": "gemini",
|
|
80
|
+
"apiKey": "${GOOGLE_API_KEY}",
|
|
81
|
+
"model": "gemini-embedding-001"
|
|
19
82
|
}
|
|
20
83
|
}
|
|
21
|
-
}
|
|
84
|
+
}
|
|
@@ -19,9 +19,17 @@ prompt:
|
|
|
19
19
|
inputVariables:
|
|
20
20
|
- query
|
|
21
21
|
tools: # mcp:<server> | knowledge:<store> | function:<name>
|
|
22
|
-
- mcp:server-name # builtin:<name> | sandbox:<tool> |
|
|
23
|
-
- knowledge:store-name #
|
|
24
|
-
- sandbox:browser_navigate #
|
|
22
|
+
- mcp:server-name # builtin:<name> | sandbox:<tool> | workspace:<tool>
|
|
23
|
+
- knowledge:store-name # workspace: read, write, delete, list, list_resources, diagnostics
|
|
24
|
+
- sandbox:browser_navigate # sandbox: exec, shell, web_fetch, web_search
|
|
25
|
+
# sandbox: browser_navigate, browser_observe, browser_screenshot,
|
|
26
|
+
# browser_content, browser_click, browser_type, browser_evaluate
|
|
27
|
+
# sandbox: vision_screenshot, vision_navigate, vision_click,
|
|
28
|
+
# vision_type, vision_scroll, vision_key, vision_drag
|
|
29
|
+
# (requires EXPERIMENTAL_VISION=true)
|
|
30
|
+
# sandbox: file_read, file_write, file_edit, file_insert, file_replace_lines
|
|
31
|
+
# builtin: ask_user, save_memory
|
|
32
|
+
# (conditional: integration_post, integration_context, email_send)
|
|
25
33
|
skills:
|
|
26
34
|
- skill-name # or use mode: all to attach all skills
|
|
27
35
|
output:
|
|
@@ -103,6 +111,9 @@ config:
|
|
|
103
111
|
onError: stop # stop | continue | retry
|
|
104
112
|
output:
|
|
105
113
|
result: "{{step_two_result}}"
|
|
114
|
+
chatOutputFormat: text # text | json
|
|
115
|
+
sampleQuestions:
|
|
116
|
+
- "Run the pipeline"
|
|
106
117
|
```
|
|
107
118
|
|
|
108
119
|
## ReAct Workflows (`workflows/<name>.workflow.yaml`)
|
|
@@ -140,6 +151,9 @@ graph:
|
|
|
140
151
|
timeout: 300000
|
|
141
152
|
output:
|
|
142
153
|
result: "{{result}}"
|
|
154
|
+
chatOutputFormat: text # text | json
|
|
155
|
+
sampleQuestions:
|
|
156
|
+
- "What can you do?"
|
|
143
157
|
```
|
|
144
158
|
|
|
145
159
|
## Knowledge Stores (`knowledge/<name>.knowledge.yaml`)
|
|
@@ -197,6 +211,8 @@ export default async function({ input }) {
|
|
|
197
211
|
}
|
|
198
212
|
```
|
|
199
213
|
|
|
214
|
+
Function parameters support automatic type coercion — if an LLM passes a number as a string, it is auto-coerced to the declared type.
|
|
215
|
+
|
|
200
216
|
## Skills (`skills/<name>/SKILL.md`)
|
|
201
217
|
|
|
202
218
|
Markdown files with YAML frontmatter (`name`, `description`). Content is injected into the agent's system prompt. Add `sandbox: true` if the skill requires sandbox tools.
|
|
@@ -209,6 +225,43 @@ Markdown files with YAML frontmatter (`name`, `description`). Content is injecte
|
|
|
209
225
|
|
|
210
226
|
Remote: `url`. Local: `command` + `args`. Optional: `headers`, `env`, `timeout`, `transport`, `description`. Transport is auto-detected. To add a server: read `mcp.json`, add entry, write back, then reference as `mcp:<name>` in agent tools.
|
|
211
227
|
|
|
228
|
+
## LLM Configuration (`llm.json`)
|
|
229
|
+
|
|
230
|
+
```json
|
|
231
|
+
{
|
|
232
|
+
"default": "llama-cpp",
|
|
233
|
+
"llama-cpp": {
|
|
234
|
+
"engine": "llama-cpp",
|
|
235
|
+
"model": "qwen3-8b",
|
|
236
|
+
"temperature": 0.7,
|
|
237
|
+
"reasoningBudget": 4096,
|
|
238
|
+
"thinkingBudget": 4096
|
|
239
|
+
},
|
|
240
|
+
"ollama-model": {
|
|
241
|
+
"engine": "ollama",
|
|
242
|
+
"model": "llama3",
|
|
243
|
+
"temperature": 0.5
|
|
244
|
+
},
|
|
245
|
+
"embeddings": {
|
|
246
|
+
"engine": "llama-cpp",
|
|
247
|
+
"model": "nomic-embed",
|
|
248
|
+
"type": "embedding"
|
|
249
|
+
},
|
|
250
|
+
"engineUrls": {
|
|
251
|
+
"llama-cpp": "http://localhost:8080",
|
|
252
|
+
"mlx-serve": "http://localhost:8081",
|
|
253
|
+
"ollama": "http://localhost:11434",
|
|
254
|
+
"lmstudio": "http://localhost:1234"
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
The `"default"` key is a string pointer to another config name. Engines: `llama-cpp`, `mlx-serve`, `ollama`, `lmstudio`. Use `reasoningBudget`/`thinkingBudget` for thinking models. Values support `${ENV_VAR}` substitution.
|
|
260
|
+
|
|
261
|
+
## Environment Variable Substitution
|
|
262
|
+
|
|
263
|
+
All YAML and JSON config files support `${ENV_VAR}` and `${ENV_VAR:-default}` syntax. Use this for secrets, URLs, and any values that differ between environments.
|
|
264
|
+
|
|
212
265
|
## Best Practices
|
|
213
266
|
|
|
214
267
|
- Use kebab-case for all resource names
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
name: research-pipeline
|
|
2
|
-
description:
|
|
2
|
+
description: Research pipeline that searches knowledge bases and publishes findings as a live HTML page
|
|
3
3
|
version: "1.0.0"
|
|
4
4
|
type: steps
|
|
5
|
+
chatOutputFormat: text
|
|
5
6
|
|
|
6
7
|
input:
|
|
7
8
|
schema:
|
|
@@ -12,52 +13,43 @@ input:
|
|
|
12
13
|
|
|
13
14
|
steps:
|
|
14
15
|
|
|
15
|
-
# Step 1: Search
|
|
16
|
-
- id:
|
|
17
|
-
agent:
|
|
16
|
+
# Step 1: Search corporate knowledge for relevant info
|
|
17
|
+
- id: research
|
|
18
|
+
agent: corporate
|
|
18
19
|
input:
|
|
19
20
|
query: "Find information about {{input.topic}}"
|
|
20
21
|
output:
|
|
21
|
-
key:
|
|
22
|
+
key: findings
|
|
22
23
|
|
|
23
|
-
# Step 2:
|
|
24
|
-
- id:
|
|
25
|
-
agent:
|
|
26
|
-
input:
|
|
27
|
-
query: "Who in the company has expertise related to {{input.topic}}?"
|
|
28
|
-
output:
|
|
29
|
-
key: expert_findings
|
|
30
|
-
|
|
31
|
-
# Step 3: Summarize everything into a friendly report
|
|
32
|
-
- id: summarize
|
|
33
|
-
agent: chatbot
|
|
24
|
+
# Step 2: Build a minimal HTML report and publish it
|
|
25
|
+
- id: publish
|
|
26
|
+
agent: web-engineer
|
|
34
27
|
input:
|
|
35
28
|
query: |
|
|
36
|
-
|
|
29
|
+
Create a minimalistic, clean HTML page that presents the following research findings about "{{input.topic}}".
|
|
37
30
|
|
|
38
|
-
|
|
39
|
-
{{steps.
|
|
31
|
+
Research findings:
|
|
32
|
+
{{steps.research.output}}
|
|
40
33
|
|
|
41
|
-
|
|
42
|
-
|
|
34
|
+
Requirements:
|
|
35
|
+
- Single-page, clean design with Tailwind CSS
|
|
36
|
+
- Minimal and elegant — white background, good typography, subtle accents
|
|
37
|
+
- Structure the content with clear headings and sections
|
|
38
|
+
- Add a small footer: "Generated by Agent Orcha"
|
|
39
|
+
- Deploy via htmlhost and share the live URL
|
|
43
40
|
|
|
44
|
-
|
|
41
|
+
Do NOT ask the user any questions, just build and deploy it.
|
|
45
42
|
output:
|
|
46
|
-
key:
|
|
43
|
+
key: report
|
|
47
44
|
|
|
48
45
|
config:
|
|
49
46
|
timeout: 300000
|
|
50
|
-
onError:
|
|
47
|
+
onError: continue
|
|
51
48
|
|
|
52
49
|
output:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
tags:
|
|
60
|
-
- demo
|
|
61
|
-
- workflow
|
|
62
|
-
- multi-agent
|
|
63
|
-
- knowledge-search
|
|
50
|
+
report: "{{steps.publish.output}}"
|
|
51
|
+
|
|
52
|
+
sampleQuestions:
|
|
53
|
+
- "Who reports to the VP of Engineering and what are their roles?"
|
|
54
|
+
- "How is Sarah doing in her recent calls? Any coaching opportunities?"
|
|
55
|
+
- "Show me the org structure for the Sales department"
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
name:
|
|
2
|
-
description: Autonomous
|
|
1
|
+
name: tool-explorer
|
|
2
|
+
description: Autonomous ReAct workflow that discovers and uses all available tools and knowledge bases
|
|
3
3
|
version: "1.0.0"
|
|
4
4
|
type: react
|
|
5
|
+
chatOutputFormat: text
|
|
5
6
|
|
|
6
7
|
input:
|
|
7
8
|
schema:
|
|
@@ -12,15 +13,14 @@ input:
|
|
|
12
13
|
|
|
13
14
|
prompt:
|
|
14
15
|
system: |
|
|
15
|
-
You are a research assistant with access to knowledge bases, tools, and
|
|
16
|
-
|
|
17
|
-
Available knowledge bases include company org charts, product inventories, web content, and more.
|
|
18
|
-
You also have access to calculator functions and other utility tools.
|
|
16
|
+
You are a research assistant with access to knowledge bases, tools, and utility functions.
|
|
19
17
|
|
|
20
18
|
Research process:
|
|
21
19
|
1. Identify which knowledge bases and tools are relevant to the topic
|
|
22
|
-
2. Search multiple sources
|
|
23
|
-
3. Synthesize the results into a
|
|
20
|
+
2. Search multiple sources to gather comprehensive information
|
|
21
|
+
3. Synthesize the results into a clear, well-structured answer
|
|
22
|
+
|
|
23
|
+
When searching knowledge bases, use k=5 or fewer to keep results focused.
|
|
24
24
|
|
|
25
25
|
If you need clarification from the user, use the ask_user tool.
|
|
26
26
|
goal: "Research and answer: {{input.topic}}"
|
|
@@ -32,10 +32,8 @@ graph:
|
|
|
32
32
|
mode: all
|
|
33
33
|
sources: [knowledge, function, builtin]
|
|
34
34
|
agents:
|
|
35
|
-
mode:
|
|
36
|
-
|
|
37
|
-
- architect
|
|
38
|
-
maxIterations: 10
|
|
35
|
+
mode: none
|
|
36
|
+
maxIterations: 100
|
|
39
37
|
timeout: 300000
|
|
40
38
|
|
|
41
39
|
output:
|
|
@@ -44,10 +42,7 @@ output:
|
|
|
44
42
|
config:
|
|
45
43
|
onError: stop
|
|
46
44
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- react
|
|
52
|
-
- autonomous
|
|
53
|
-
- tool-discovery
|
|
45
|
+
sampleQuestions:
|
|
46
|
+
- "Do we have any security incidents affecting our transport communication systems?"
|
|
47
|
+
- "Cross-reference our OT infrastructure with recent CVEs and tell me what's at risk"
|
|
48
|
+
- "Who are the top performers in the sales team based on their call transcripts?"
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: team-chat
|
|
2
|
+
description: ReAct workflow that delegates tasks to specialized agents for collaborative problem-solving
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
type: react
|
|
5
|
+
chatOutputFormat: text
|
|
6
|
+
|
|
7
|
+
input:
|
|
8
|
+
schema:
|
|
9
|
+
topic:
|
|
10
|
+
type: string
|
|
11
|
+
required: true
|
|
12
|
+
description: The task or question to solve
|
|
13
|
+
|
|
14
|
+
prompt:
|
|
15
|
+
system: |
|
|
16
|
+
You are a coordinator that delegates tasks to specialized agents.
|
|
17
|
+
|
|
18
|
+
Your role:
|
|
19
|
+
1. Understand the user's request
|
|
20
|
+
2. Identify which agents are best suited for each part of the task
|
|
21
|
+
3. Delegate to agents and combine their responses
|
|
22
|
+
4. Present a unified, coherent answer
|
|
23
|
+
|
|
24
|
+
If you need clarification from the user, use the ask_user tool.
|
|
25
|
+
goal: "Coordinate agents to answer: {{input.topic}}"
|
|
26
|
+
|
|
27
|
+
graph:
|
|
28
|
+
model: default
|
|
29
|
+
executionMode: react
|
|
30
|
+
tools:
|
|
31
|
+
mode: include
|
|
32
|
+
sources: [builtin]
|
|
33
|
+
include: [ask_user]
|
|
34
|
+
agents:
|
|
35
|
+
mode: all
|
|
36
|
+
maxIterations: 100
|
|
37
|
+
timeout: 300000
|
|
38
|
+
|
|
39
|
+
output:
|
|
40
|
+
result: "{{state.messages[-1].content}}"
|
|
41
|
+
|
|
42
|
+
config:
|
|
43
|
+
onError: stop
|
|
44
|
+
|
|
45
|
+
sampleQuestions:
|
|
46
|
+
- "Ask each agent to introduce themselves and their capabilities"
|
|
47
|
+
- "Get a security assessment from the network security agent"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-orcha",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "TypeScript Agentic Orchestration http server and framework for building multi-agent workflows with MCP tools and vector stores",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -34,17 +34,20 @@
|
|
|
34
34
|
"LICENSE"
|
|
35
35
|
],
|
|
36
36
|
"scripts": {
|
|
37
|
-
"dev": "
|
|
37
|
+
"dev": "node --watch src/index.ts",
|
|
38
38
|
"build": "tsc && npm run copy-assets",
|
|
39
|
-
"copy-assets": "
|
|
39
|
+
"copy-assets": "node -e \"const fs=require('fs');fs.cpSync('public','dist/public',{recursive:true});fs.cpSync('templates','dist/templates',{recursive:true})\"",
|
|
40
40
|
"start": "node dist/src/index.js",
|
|
41
41
|
"prepublishOnly": "npm run build",
|
|
42
42
|
"lint": "eslint src lib --ext .ts",
|
|
43
43
|
"typecheck": "tsc --noEmit",
|
|
44
|
-
"test": "node --test --test-force-exit 'test/**/*.test.ts'",
|
|
45
|
-
"test:coverage": "node --test --test-force-exit --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=lcov.info --test-reporter=spec --test-reporter-destination=stdout 'test/**/*.test.ts'",
|
|
44
|
+
"test": "node --experimental-test-module-mocks --test --test-force-exit 'test/**/*.test.ts'",
|
|
45
|
+
"test:coverage": "node --experimental-test-module-mocks --test --test-force-exit --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=lcov.info --test-reporter=spec --test-reporter-destination=stdout 'test/**/*.test.ts'",
|
|
46
46
|
"docker": "docker compose up --build --watch",
|
|
47
|
-
"
|
|
47
|
+
"build:binary": "node scripts/build-sea.mjs",
|
|
48
|
+
"sea": "node scripts/build-sea.mjs && ./dist/sea/agent-orcha",
|
|
49
|
+
"test:e2e": "npx playwright test",
|
|
50
|
+
"prepare": "./scripts/install-hooks.sh"
|
|
48
51
|
},
|
|
49
52
|
"dependencies": {
|
|
50
53
|
"@anthropic-ai/sdk": "^0.76.0",
|
|
@@ -54,15 +57,18 @@
|
|
|
54
57
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
55
58
|
"cheerio": "^1.0.0",
|
|
56
59
|
"dotenv": "^16.4.7",
|
|
60
|
+
"exceljs": "^4.4.0",
|
|
57
61
|
"fastify": "^5.2.0",
|
|
58
62
|
"fastify-plugin": "^5.1.0",
|
|
59
63
|
"glob": "^11.0.0",
|
|
60
64
|
"imapflow": "^1.2.10",
|
|
61
65
|
"jsdom": "^28.1.0",
|
|
66
|
+
"mammoth": "^1.11.0",
|
|
62
67
|
"mysql2": "^3.12.0",
|
|
63
68
|
"node-cron": "^4.2.1",
|
|
64
69
|
"nodemailer": "^8.0.1",
|
|
65
70
|
"openai": "^6.22.0",
|
|
71
|
+
"pdf-parse": "^1.1.4",
|
|
66
72
|
"pg": "^8.13.2",
|
|
67
73
|
"pino": "^10.2.1",
|
|
68
74
|
"pino-pretty": "^13.1.3",
|
|
@@ -73,12 +79,14 @@
|
|
|
73
79
|
"zod-to-json-schema": "^3.25.1"
|
|
74
80
|
},
|
|
75
81
|
"devDependencies": {
|
|
82
|
+
"@playwright/test": "^1.58.2",
|
|
76
83
|
"@types/jsdom": "^27.0.0",
|
|
77
84
|
"@types/node": "^22.10.5",
|
|
78
85
|
"@types/node-cron": "^3.0.11",
|
|
79
86
|
"@types/nodemailer": "^7.0.11",
|
|
80
87
|
"@types/pg": "^8.11.10",
|
|
81
88
|
"@types/ws": "^8.18.1",
|
|
89
|
+
"esbuild": "^0.25.12",
|
|
82
90
|
"eslint": "^9.17.0",
|
|
83
91
|
"typescript": "^5.7.2"
|
|
84
92
|
},
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { Component } from '../utils/Component.js';
|
|
3
|
-
import { api } from '../services/ApiService.js';
|
|
4
|
-
|
|
5
|
-
export class SkillsView extends Component {
|
|
6
|
-
constructor() {
|
|
7
|
-
super();
|
|
8
|
-
this.selectedSkill = null;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
async connectedCallback() {
|
|
12
|
-
super.connectedCallback();
|
|
13
|
-
this.loadSkills();
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
async loadSkills() {
|
|
17
|
-
const container = this.querySelector('#skillsListContainer');
|
|
18
|
-
container.innerHTML = '<div class="text-gray-500 text-center py-8">Loading...</div>';
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
const skills = await api.getSkills();
|
|
22
|
-
this.renderSkillsList(skills);
|
|
23
|
-
} catch (e) {
|
|
24
|
-
container.innerHTML = `<div class="text-red-400 text-center">Error: ${e.message}</div>`;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
renderSkillsList(skills) {
|
|
29
|
-
const container = this.querySelector('#skillsListContainer');
|
|
30
|
-
|
|
31
|
-
if (!skills.length) {
|
|
32
|
-
container.innerHTML = `
|
|
33
|
-
<div class="text-gray-500 text-center py-12">
|
|
34
|
-
<i class="fas fa-wand-magic-sparkles text-4xl mb-4 block text-gray-600"></i>
|
|
35
|
-
<p class="text-lg mb-2">No skills found</p>
|
|
36
|
-
<p class="text-sm">Create a <code class="bg-dark-surface px-2 py-1 rounded">skills/my-skill/SKILL.md</code> file to get started.</p>
|
|
37
|
-
</div>`;
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
container.innerHTML = `
|
|
42
|
-
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
43
|
-
${skills.map(skill => `
|
|
44
|
-
<div class="skill-card bg-dark-surface border border-dark-border hover:border-teal-500 rounded-lg p-4 cursor-pointer transition-colors"
|
|
45
|
-
data-skill-name="${skill.name}">
|
|
46
|
-
<div class="flex items-center gap-2 mb-2">
|
|
47
|
-
<i class="fas fa-wand-magic-sparkles text-teal-400 text-sm"></i>
|
|
48
|
-
<span class="font-medium text-teal-400">${skill.name}</span>
|
|
49
|
-
</div>
|
|
50
|
-
<div class="text-xs text-gray-500 line-clamp-3">${skill.description || 'No description'}</div>
|
|
51
|
-
</div>
|
|
52
|
-
`).join('')}
|
|
53
|
-
</div>`;
|
|
54
|
-
|
|
55
|
-
container.querySelectorAll('.skill-card').forEach(card => {
|
|
56
|
-
card.addEventListener('click', () => {
|
|
57
|
-
this.selectSkill(card.dataset.skillName);
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async selectSkill(name) {
|
|
63
|
-
const detailArea = this.querySelector('#skillDetailArea');
|
|
64
|
-
detailArea.classList.remove('hidden');
|
|
65
|
-
|
|
66
|
-
this.querySelector('#skillDetailName').textContent = name;
|
|
67
|
-
this.querySelector('#skillDetailContent').textContent = 'Loading...';
|
|
68
|
-
|
|
69
|
-
// Highlight selected card
|
|
70
|
-
this.querySelectorAll('.skill-card').forEach(el => {
|
|
71
|
-
el.classList.remove('border-teal-500', 'bg-teal-500/10');
|
|
72
|
-
el.classList.add('border-dark-border');
|
|
73
|
-
});
|
|
74
|
-
const activeCard = this.querySelector(`[data-skill-name="${name}"]`);
|
|
75
|
-
if (activeCard) {
|
|
76
|
-
activeCard.classList.remove('border-dark-border');
|
|
77
|
-
activeCard.classList.add('border-teal-500', 'bg-teal-500/10');
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
try {
|
|
81
|
-
const skill = await api.getSkill(name);
|
|
82
|
-
this.selectedSkill = skill;
|
|
83
|
-
this.querySelector('#skillDetailDesc').textContent = skill.description || 'No description';
|
|
84
|
-
this.querySelector('#skillDetailContent').textContent = skill.content;
|
|
85
|
-
} catch (e) {
|
|
86
|
-
this.querySelector('#skillDetailContent').textContent = 'Error loading skill: ' + e.message;
|
|
87
|
-
this.querySelector('#skillDetailContent').classList.add('text-red-400');
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
postRender() {
|
|
92
|
-
this.querySelector('#closeDetailBtn').addEventListener('click', () => {
|
|
93
|
-
this.querySelector('#skillDetailArea').classList.add('hidden');
|
|
94
|
-
this.querySelectorAll('.skill-card').forEach(el => {
|
|
95
|
-
el.classList.remove('border-teal-500', 'bg-teal-500/10');
|
|
96
|
-
el.classList.add('border-dark-border');
|
|
97
|
-
});
|
|
98
|
-
this.selectedSkill = null;
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
template() {
|
|
103
|
-
return `
|
|
104
|
-
<div class="space-y-6 h-full overflow-y-auto pb-8 custom-scrollbar">
|
|
105
|
-
<div class="flex items-center justify-between border-b border-dark-border pb-4">
|
|
106
|
-
<div>
|
|
107
|
-
<h2 class="text-lg font-semibold text-gray-200">Skills</h2>
|
|
108
|
-
<p class="text-xs text-gray-500 mt-1">Prompt augmentation units that expand agent capabilities</p>
|
|
109
|
-
</div>
|
|
110
|
-
</div>
|
|
111
|
-
|
|
112
|
-
<div id="skillsListContainer"></div>
|
|
113
|
-
|
|
114
|
-
<div id="skillDetailArea" class="hidden border-t border-dark-border pt-6">
|
|
115
|
-
<div class="bg-dark-surface/50 border border-dark-border rounded-lg p-4 mb-4">
|
|
116
|
-
<div class="flex items-center justify-between">
|
|
117
|
-
<div>
|
|
118
|
-
<div class="font-medium text-teal-400" id="skillDetailName"></div>
|
|
119
|
-
<div class="text-xs text-gray-500 mt-1" id="skillDetailDesc"></div>
|
|
120
|
-
</div>
|
|
121
|
-
<button id="closeDetailBtn" class="text-gray-500 hover:text-gray-300 transition-colors">
|
|
122
|
-
<i class="fas fa-times"></i>
|
|
123
|
-
</button>
|
|
124
|
-
</div>
|
|
125
|
-
</div>
|
|
126
|
-
|
|
127
|
-
<div>
|
|
128
|
-
<label class="block text-sm font-medium text-gray-300 mb-2">Skill Content</label>
|
|
129
|
-
<pre id="skillDetailContent" 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"></pre>
|
|
130
|
-
</div>
|
|
131
|
-
</div>
|
|
132
|
-
</div>
|
|
133
|
-
`;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
customElements.define('skills-view', SkillsView);
|