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
|
@@ -4,14 +4,14 @@ import { api } from '../services/ApiService.js';
|
|
|
4
4
|
import './AgentComposer.js';
|
|
5
5
|
|
|
6
6
|
const FILE_ICONS = {
|
|
7
|
-
yaml: { icon: 'fa-file-code', color: 'text-orange
|
|
8
|
-
yml: { icon: 'fa-file-code', color: 'text-orange
|
|
9
|
-
json: { icon: 'fa-file-code', color: 'text-yellow
|
|
10
|
-
js: { icon: 'fa-file-code', color: 'text-yellow
|
|
11
|
-
ts: { icon: 'fa-file-code', color: 'text-yellow
|
|
12
|
-
txt: { icon: 'fa-file-lines', color: 'text-
|
|
13
|
-
md: { icon: 'fa-file-lines', color: 'text-blue
|
|
14
|
-
default: { icon: 'fa-file', color: 'text-
|
|
7
|
+
yaml: { icon: 'fa-file-code', color: 'text-orange' },
|
|
8
|
+
yml: { icon: 'fa-file-code', color: 'text-orange' },
|
|
9
|
+
json: { icon: 'fa-file-code', color: 'text-yellow' },
|
|
10
|
+
js: { icon: 'fa-file-code', color: 'text-yellow' },
|
|
11
|
+
ts: { icon: 'fa-file-code', color: 'text-yellow' },
|
|
12
|
+
txt: { icon: 'fa-file-lines', color: 'text-secondary' },
|
|
13
|
+
md: { icon: 'fa-file-lines', color: 'text-blue' },
|
|
14
|
+
default: { icon: 'fa-file', color: 'text-muted' },
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
const ACE_MODES = {
|
|
@@ -28,35 +28,35 @@ const RESOURCE_TYPES = {
|
|
|
28
28
|
agent: {
|
|
29
29
|
label: 'Agent',
|
|
30
30
|
icon: 'fa-robot',
|
|
31
|
-
color: 'text-blue
|
|
31
|
+
color: 'text-blue',
|
|
32
32
|
folder: 'agents/',
|
|
33
33
|
suffix: '.agent.yaml',
|
|
34
34
|
},
|
|
35
35
|
function: {
|
|
36
36
|
label: 'Function',
|
|
37
37
|
icon: 'fa-bolt',
|
|
38
|
-
color: 'text-yellow
|
|
38
|
+
color: 'text-yellow',
|
|
39
39
|
folder: 'functions/',
|
|
40
40
|
suffix: '.function.js',
|
|
41
41
|
},
|
|
42
42
|
knowledge: {
|
|
43
43
|
label: 'Knowledge',
|
|
44
44
|
icon: 'fa-database',
|
|
45
|
-
color: 'text-purple
|
|
45
|
+
color: 'text-purple',
|
|
46
46
|
folder: 'knowledge/',
|
|
47
47
|
suffix: '.knowledge.yaml',
|
|
48
48
|
},
|
|
49
49
|
skill: {
|
|
50
50
|
label: 'Skill',
|
|
51
51
|
icon: 'fa-wand-magic-sparkles',
|
|
52
|
-
color: 'text-green
|
|
52
|
+
color: 'text-green',
|
|
53
53
|
folder: 'skills/',
|
|
54
54
|
suffix: '/SKILL.md',
|
|
55
55
|
},
|
|
56
56
|
workflow: {
|
|
57
57
|
label: 'Workflow',
|
|
58
58
|
icon: 'fa-diagram-project',
|
|
59
|
-
color: 'text-orange
|
|
59
|
+
color: 'text-orange',
|
|
60
60
|
folder: 'workflows/',
|
|
61
61
|
suffix: '.workflow.yaml',
|
|
62
62
|
},
|
|
@@ -77,6 +77,7 @@ export class IdeView extends Component {
|
|
|
77
77
|
this.editor = null;
|
|
78
78
|
this.currentFile = null;
|
|
79
79
|
this.isDirty = false;
|
|
80
|
+
this._loading = false;
|
|
80
81
|
this.treeData = [];
|
|
81
82
|
this.expandedDirs = new Set();
|
|
82
83
|
this._renamingPath = null;
|
|
@@ -158,10 +159,10 @@ export class IdeView extends Component {
|
|
|
158
159
|
const ext = getExtension(node.name);
|
|
159
160
|
const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
|
|
160
161
|
return `
|
|
161
|
-
<div class="tree-item tree-depth-${Math.min(depth, 5)}
|
|
162
|
+
<div class="tree-item tree-depth-${Math.min(depth, 5)}">
|
|
162
163
|
<span class="w-3"></span>
|
|
163
164
|
<i class="fas ${iconInfo.icon} ${iconInfo.color} text-sm"></i>
|
|
164
|
-
<input type="text" class="inline-tree-input
|
|
165
|
+
<input type="text" class="inline-tree-input"
|
|
165
166
|
data-action="rename" data-path="${node.path}" value="${node.name}" />
|
|
166
167
|
</div>
|
|
167
168
|
`;
|
|
@@ -179,17 +180,17 @@ export class IdeView extends Component {
|
|
|
179
180
|
|
|
180
181
|
// Only show menu button for subfolders (depth > 0)
|
|
181
182
|
const menuBtn = depth > 0 ? `
|
|
182
|
-
<button class="tree-menu-btn
|
|
183
|
+
<button class="tree-menu-btn"
|
|
183
184
|
data-menu-path="${node.path}" data-menu-type="directory">
|
|
184
185
|
<i class="fas fa-ellipsis-v text-xs"></i>
|
|
185
186
|
</button>
|
|
186
187
|
` : '';
|
|
187
188
|
|
|
188
189
|
return `
|
|
189
|
-
<div class="tree-item
|
|
190
|
+
<div class="tree-item tree-depth-${Math.min(depth, 5)}"
|
|
190
191
|
data-path="${node.path}" data-type="directory">
|
|
191
|
-
<i class="fas ${chevron} text-xs text-
|
|
192
|
-
<i class="fas fa-folder${isExpanded ? '-open' : ''} text-yellow
|
|
192
|
+
<i class="fas ${chevron} text-xs text-muted"></i>
|
|
193
|
+
<i class="fas fa-folder${isExpanded ? '-open' : ''} text-yellow text-sm"></i>
|
|
193
194
|
<span class="flex-1 min-w-0">${node.name}</span>
|
|
194
195
|
${menuBtn}
|
|
195
196
|
</div>
|
|
@@ -205,15 +206,14 @@ export class IdeView extends Component {
|
|
|
205
206
|
const ext = getExtension(node.name);
|
|
206
207
|
const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
|
|
207
208
|
const isActive = this.currentFile && this.currentFile.path === node.path;
|
|
208
|
-
const activeClass = isActive ? 'bg-dark-hover text-white' : '';
|
|
209
209
|
|
|
210
210
|
return `
|
|
211
|
-
<div class="tree-item
|
|
211
|
+
<div class="tree-item tree-depth-${Math.min(depth, 5)} ${isActive ? 'active-file' : ''}"
|
|
212
212
|
data-path="${node.path}" data-type="file">
|
|
213
213
|
<span class="w-3"></span>
|
|
214
214
|
<i class="fas ${iconInfo.icon} ${iconInfo.color} text-sm"></i>
|
|
215
215
|
<span class="tree-filename truncate flex-1 min-w-0">${node.name}</span>
|
|
216
|
-
<button class="tree-menu-btn
|
|
216
|
+
<button class="tree-menu-btn"
|
|
217
217
|
data-menu-path="${node.path}" data-menu-type="file">
|
|
218
218
|
<i class="fas fa-ellipsis-v text-xs"></i>
|
|
219
219
|
</button>
|
|
@@ -330,19 +330,19 @@ export class IdeView extends Component {
|
|
|
330
330
|
|
|
331
331
|
const menu = document.createElement('div');
|
|
332
332
|
menu.id = 'contextMenu';
|
|
333
|
-
menu.className = '
|
|
333
|
+
menu.className = 'context-menu';
|
|
334
334
|
|
|
335
335
|
const isFile = type === 'file';
|
|
336
336
|
|
|
337
337
|
menu.innerHTML = `
|
|
338
338
|
${isFile ? `
|
|
339
|
-
<div class="context-item
|
|
340
|
-
<i class="fas fa-pen text-xs
|
|
339
|
+
<div class="context-item" data-action="rename">
|
|
340
|
+
<i class="fas fa-pen text-xs text-muted"></i>
|
|
341
341
|
<span>Rename</span>
|
|
342
342
|
</div>
|
|
343
343
|
` : ''}
|
|
344
|
-
<div class="context-item
|
|
345
|
-
<i class="fas fa-trash text-xs
|
|
344
|
+
<div class="context-item danger" data-action="delete">
|
|
345
|
+
<i class="fas fa-trash text-xs"></i>
|
|
346
346
|
<span>Delete</span>
|
|
347
347
|
</div>
|
|
348
348
|
`;
|
|
@@ -435,22 +435,22 @@ export class IdeView extends Component {
|
|
|
435
435
|
if (!btn) return;
|
|
436
436
|
|
|
437
437
|
const items = Object.entries(RESOURCE_TYPES).map(([key, rt]) => `
|
|
438
|
-
<div class="
|
|
438
|
+
<div class="resource-dropdown-item"
|
|
439
439
|
data-resource="${key}">
|
|
440
|
-
<i class="fas ${rt.icon} ${rt.color} text-xs
|
|
440
|
+
<i class="fas ${rt.icon} ${rt.color} text-xs"></i>
|
|
441
441
|
<span>${rt.label}</span>
|
|
442
442
|
</div>
|
|
443
443
|
`).join('');
|
|
444
444
|
|
|
445
445
|
const dropdown = document.createElement('div');
|
|
446
446
|
dropdown.id = 'newResourceDropdown';
|
|
447
|
-
dropdown.className = '
|
|
447
|
+
dropdown.className = 'resource-dropdown';
|
|
448
448
|
dropdown.innerHTML = items;
|
|
449
449
|
|
|
450
450
|
btn.parentElement.classList.add('relative');
|
|
451
451
|
btn.parentElement.appendChild(dropdown);
|
|
452
452
|
|
|
453
|
-
dropdown.querySelectorAll('.
|
|
453
|
+
dropdown.querySelectorAll('.resource-dropdown-item').forEach(item => {
|
|
454
454
|
item.addEventListener('click', (e) => {
|
|
455
455
|
e.stopPropagation();
|
|
456
456
|
const type = item.dataset.resource;
|
|
@@ -472,32 +472,27 @@ export class IdeView extends Component {
|
|
|
472
472
|
const rt = RESOURCE_TYPES[type];
|
|
473
473
|
const modal = document.createElement('div');
|
|
474
474
|
modal.id = 'createResourceModal';
|
|
475
|
-
modal.className = '
|
|
475
|
+
modal.className = 'auth-overlay';
|
|
476
476
|
modal.innerHTML = `
|
|
477
|
-
<div class="absolute inset-0 bg-
|
|
478
|
-
<div class="relative
|
|
479
|
-
<div class="flex items-center gap-3 px-4 py-3 border-b
|
|
477
|
+
<div class="absolute inset-0 bg-overlay" data-action="cancel"></div>
|
|
478
|
+
<div class="relative panel shadow-xl w-full mx-4 max-w-md">
|
|
479
|
+
<div class="flex items-center gap-3 px-4 py-3 border-b">
|
|
480
480
|
<i class="fas ${rt.icon} ${rt.color}"></i>
|
|
481
481
|
<span class="text-white font-medium">New ${rt.label}</span>
|
|
482
482
|
</div>
|
|
483
483
|
<div class="p-4">
|
|
484
|
-
<label class="block text-sm text-
|
|
485
|
-
<div class="
|
|
486
|
-
<span
|
|
484
|
+
<label class="block text-sm text-secondary mb-2">Name</label>
|
|
485
|
+
<div class="create-modal-input">
|
|
486
|
+
<span>${rt.folder}</span>
|
|
487
487
|
<input type="text" id="resourceNameInput"
|
|
488
|
-
class="flex-1 px-3 py-2 bg-transparent text-white text-sm outline-none"
|
|
489
488
|
placeholder="my-${type}" autocomplete="off" />
|
|
490
|
-
<span
|
|
489
|
+
<span>${rt.suffix}</span>
|
|
491
490
|
</div>
|
|
492
|
-
<p class="text-xs text-
|
|
491
|
+
<p class="text-xs text-muted mt-2">Use lowercase letters, numbers, and hyphens</p>
|
|
493
492
|
</div>
|
|
494
|
-
<div class="flex justify-end gap-2 px-4 py-3 border-t
|
|
495
|
-
<button class="
|
|
496
|
-
|
|
497
|
-
</button>
|
|
498
|
-
<button class="px-4 py-1.5 text-sm bg-green-600 hover:bg-green-700 text-white rounded transition-colors" data-action="create">
|
|
499
|
-
Create
|
|
500
|
-
</button>
|
|
493
|
+
<div class="flex justify-end gap-2 px-4 py-3 border-t">
|
|
494
|
+
<button class="btn btn-ghost" data-action="cancel">Cancel</button>
|
|
495
|
+
<button class="btn btn-accent btn-sm" data-action="create">Create</button>
|
|
501
496
|
</div>
|
|
502
497
|
</div>
|
|
503
498
|
`;
|
|
@@ -614,8 +609,17 @@ export class IdeView extends Component {
|
|
|
614
609
|
const data = await api.readFile(filePath);
|
|
615
610
|
this.currentFile = { path: data.path, content: data.content };
|
|
616
611
|
this.isDirty = false;
|
|
617
|
-
|
|
612
|
+
// Preserve visual/source choice when switching between agent files
|
|
613
|
+
if (!isAgentFile(filePath)) {
|
|
614
|
+
this._viewMode = 'source';
|
|
615
|
+
} else if (!isAgentFile(this._prevFilePath)) {
|
|
616
|
+
this._viewMode = 'visual';
|
|
617
|
+
}
|
|
618
|
+
this._prevFilePath = filePath;
|
|
619
|
+
this._loading = true;
|
|
618
620
|
this._renderEditor();
|
|
621
|
+
this._loading = false;
|
|
622
|
+
this._updateDirtyState();
|
|
619
623
|
this._renderTree();
|
|
620
624
|
this._updateModeToggle();
|
|
621
625
|
} catch (err) {
|
|
@@ -650,6 +654,32 @@ export class IdeView extends Component {
|
|
|
650
654
|
if (this._viewMode === 'visual') {
|
|
651
655
|
if (editorContainer) editorContainer.classList.add('hidden');
|
|
652
656
|
if (composerContainer) composerContainer.classList.remove('hidden');
|
|
657
|
+
|
|
658
|
+
// Parse and load into composer
|
|
659
|
+
let parsed;
|
|
660
|
+
try {
|
|
661
|
+
parsed = jsyaml.load(this.currentFile.content);
|
|
662
|
+
} catch { parsed = null; }
|
|
663
|
+
|
|
664
|
+
if (parsed && typeof parsed === 'object') {
|
|
665
|
+
let composer = composerContainer.querySelector('agent-composer');
|
|
666
|
+
if (!composer) {
|
|
667
|
+
composer = document.createElement('agent-composer');
|
|
668
|
+
composer.classList.add('block', 'h-full');
|
|
669
|
+
composerContainer.appendChild(composer);
|
|
670
|
+
composer.addEventListener('composer:change', () => {
|
|
671
|
+
if (this._loading) return;
|
|
672
|
+
if (!this.isDirty) {
|
|
673
|
+
this.isDirty = true;
|
|
674
|
+
this._updateDirtyState();
|
|
675
|
+
}
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
composer.data = parsed;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
// Also sync Ace so switching to source has current content
|
|
682
|
+
this._syncAceContent();
|
|
653
683
|
return;
|
|
654
684
|
}
|
|
655
685
|
|
|
@@ -657,7 +687,13 @@ export class IdeView extends Component {
|
|
|
657
687
|
if (composerContainer) composerContainer.classList.add('hidden');
|
|
658
688
|
if (editorContainer) editorContainer.classList.remove('hidden');
|
|
659
689
|
|
|
660
|
-
|
|
690
|
+
this._syncAceContent();
|
|
691
|
+
this._updateDirtyState();
|
|
692
|
+
if (this.editor) this.editor.focus();
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
_syncAceContent() {
|
|
696
|
+
if (!this.currentFile) return;
|
|
661
697
|
const aceEl = this.querySelector('#aceEditor');
|
|
662
698
|
if (!aceEl) return;
|
|
663
699
|
|
|
@@ -671,8 +707,8 @@ export class IdeView extends Component {
|
|
|
671
707
|
tabSize: 2,
|
|
672
708
|
useSoftTabs: true,
|
|
673
709
|
});
|
|
674
|
-
|
|
675
710
|
this.editor.session.on('change', () => {
|
|
711
|
+
if (this._loading) return;
|
|
676
712
|
if (!this.isDirty) {
|
|
677
713
|
this.isDirty = true;
|
|
678
714
|
this._updateDirtyState();
|
|
@@ -680,16 +716,10 @@ export class IdeView extends Component {
|
|
|
680
716
|
});
|
|
681
717
|
}
|
|
682
718
|
|
|
683
|
-
// Set mode based on file extension
|
|
684
719
|
const ext = getExtension(this.currentFile.path);
|
|
685
720
|
const mode = ACE_MODES[ext] || ACE_MODES.default;
|
|
686
721
|
this.editor.session.setMode(mode);
|
|
687
|
-
|
|
688
|
-
// Set content without triggering change event
|
|
689
722
|
this.editor.setValue(this.currentFile.content, -1);
|
|
690
|
-
this.isDirty = false;
|
|
691
|
-
this._updateDirtyState();
|
|
692
|
-
this.editor.focus();
|
|
693
723
|
}
|
|
694
724
|
|
|
695
725
|
_updateDirtyState() {
|
|
@@ -737,16 +767,16 @@ export class IdeView extends Component {
|
|
|
737
767
|
const failed = result.reloaded === 'error';
|
|
738
768
|
if (failed) {
|
|
739
769
|
savedMsg.textContent = 'Saved (reload failed)';
|
|
740
|
-
savedMsg.classList.remove('hidden', 'text-green
|
|
741
|
-
savedMsg.classList.add('text-
|
|
770
|
+
savedMsg.classList.remove('hidden', 'text-green');
|
|
771
|
+
savedMsg.classList.add('text-amber');
|
|
742
772
|
} else if (reloaded) {
|
|
743
773
|
savedMsg.textContent = `Saved & reloaded ${result.reloaded}`;
|
|
744
|
-
savedMsg.classList.remove('hidden', 'text-
|
|
745
|
-
savedMsg.classList.add('text-green
|
|
774
|
+
savedMsg.classList.remove('hidden', 'text-amber');
|
|
775
|
+
savedMsg.classList.add('text-green');
|
|
746
776
|
} else {
|
|
747
777
|
savedMsg.textContent = 'Saved!';
|
|
748
|
-
savedMsg.classList.remove('hidden', 'text-
|
|
749
|
-
savedMsg.classList.add('text-green
|
|
778
|
+
savedMsg.classList.remove('hidden', 'text-amber');
|
|
779
|
+
savedMsg.classList.add('text-green');
|
|
750
780
|
}
|
|
751
781
|
setTimeout(() => savedMsg.classList.add('hidden'), 2500);
|
|
752
782
|
}
|
|
@@ -777,10 +807,7 @@ export class IdeView extends Component {
|
|
|
777
807
|
toggle.classList.toggle('hidden', !show);
|
|
778
808
|
|
|
779
809
|
toggle.querySelectorAll('.mode-toggle-btn').forEach(btn => {
|
|
780
|
-
|
|
781
|
-
btn.classList.toggle('bg-dark-hover', active);
|
|
782
|
-
btn.classList.toggle('text-white', active);
|
|
783
|
-
btn.classList.toggle('text-gray-500', !active);
|
|
810
|
+
btn.classList.toggle('active', btn.dataset.mode === this._viewMode);
|
|
784
811
|
});
|
|
785
812
|
}
|
|
786
813
|
|
|
@@ -802,6 +829,7 @@ export class IdeView extends Component {
|
|
|
802
829
|
return;
|
|
803
830
|
}
|
|
804
831
|
|
|
832
|
+
const wasDirty = this.isDirty;
|
|
805
833
|
this._viewMode = 'visual';
|
|
806
834
|
this._updateModeToggle();
|
|
807
835
|
|
|
@@ -817,31 +845,36 @@ export class IdeView extends Component {
|
|
|
817
845
|
composer = document.createElement('agent-composer');
|
|
818
846
|
composer.classList.add('block', 'h-full');
|
|
819
847
|
composerContainer.appendChild(composer);
|
|
848
|
+
composer.addEventListener('composer:change', () => {
|
|
849
|
+
if (this._loading) return;
|
|
850
|
+
if (!this.isDirty) {
|
|
851
|
+
this.isDirty = true;
|
|
852
|
+
this._updateDirtyState();
|
|
853
|
+
}
|
|
854
|
+
});
|
|
820
855
|
}
|
|
821
856
|
|
|
857
|
+
this._loading = true;
|
|
822
858
|
composer.data = parsed;
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
if (!this.isDirty) {
|
|
827
|
-
this.isDirty = true;
|
|
828
|
-
this._updateDirtyState();
|
|
829
|
-
}
|
|
830
|
-
});
|
|
859
|
+
this._loading = false;
|
|
860
|
+
this.isDirty = wasDirty;
|
|
861
|
+
this._updateDirtyState();
|
|
831
862
|
}
|
|
832
863
|
|
|
833
864
|
_switchToSource() {
|
|
834
865
|
if (!this.currentFile) return;
|
|
835
866
|
|
|
867
|
+
const wasDirty = this.isDirty;
|
|
836
868
|
const composer = this.querySelector('agent-composer');
|
|
837
869
|
if (composer && this._viewMode === 'visual') {
|
|
838
870
|
const data = composer.getData();
|
|
839
871
|
const yaml = jsyaml.dump(data, { indent: 2, lineWidth: -1, noRefs: true, sortKeys: false });
|
|
840
872
|
|
|
841
|
-
|
|
873
|
+
this._loading = true;
|
|
842
874
|
if (this.editor) {
|
|
843
875
|
this.editor.setValue(yaml, -1);
|
|
844
876
|
}
|
|
877
|
+
this._loading = false;
|
|
845
878
|
this.currentFile.content = yaml;
|
|
846
879
|
}
|
|
847
880
|
|
|
@@ -853,6 +886,9 @@ export class IdeView extends Component {
|
|
|
853
886
|
if (composerContainer) composerContainer.classList.add('hidden');
|
|
854
887
|
if (editorContainer) editorContainer.classList.remove('hidden');
|
|
855
888
|
|
|
889
|
+
this.isDirty = wasDirty;
|
|
890
|
+
this._updateDirtyState();
|
|
891
|
+
|
|
856
892
|
if (this.editor) {
|
|
857
893
|
this.editor.resize();
|
|
858
894
|
this.editor.focus();
|
|
@@ -865,8 +901,7 @@ export class IdeView extends Component {
|
|
|
865
901
|
|
|
866
902
|
const toast = document.createElement('div');
|
|
867
903
|
toast.id = 'ideToast';
|
|
868
|
-
|
|
869
|
-
toast.className = `fixed bottom-4 right-4 z-50 ${color} text-white text-sm px-4 py-2 rounded-lg shadow-lg`;
|
|
904
|
+
toast.className = `ide-toast ${type === 'error' ? 'error' : ''}`;
|
|
870
905
|
toast.textContent = message;
|
|
871
906
|
document.body.appendChild(toast);
|
|
872
907
|
setTimeout(() => toast.remove(), 4000);
|
|
@@ -874,57 +909,57 @@ export class IdeView extends Component {
|
|
|
874
909
|
|
|
875
910
|
template() {
|
|
876
911
|
return `
|
|
877
|
-
<div class="
|
|
912
|
+
<div class="ide-shell">
|
|
878
913
|
<!-- Toolbar -->
|
|
879
|
-
<div class="
|
|
880
|
-
<div class="flex items-center gap-2 text-sm text-
|
|
881
|
-
<i class="fas fa-code text-green
|
|
914
|
+
<div class="ide-toolbar">
|
|
915
|
+
<div class="flex items-center gap-2 text-sm text-secondary">
|
|
916
|
+
<i class="fas fa-code text-green"></i>
|
|
882
917
|
<span id="breadcrumb">Select a file to edit</span>
|
|
883
918
|
</div>
|
|
884
919
|
<div class="flex items-center gap-3">
|
|
885
920
|
<!-- Mode toggle (only for .agent.yaml files) -->
|
|
886
|
-
<div id="modeToggle" class="hidden
|
|
887
|
-
<button class="mode-toggle-btn
|
|
921
|
+
<div id="modeToggle" class="hidden mode-toggle">
|
|
922
|
+
<button class="mode-toggle-btn active" data-mode="source">
|
|
888
923
|
<i class="fas fa-code mr-1"></i>Source
|
|
889
924
|
</button>
|
|
890
|
-
<button class="mode-toggle-btn
|
|
925
|
+
<button class="mode-toggle-btn" data-mode="visual">
|
|
891
926
|
<i class="fas fa-palette mr-1"></i>Visual
|
|
892
927
|
</button>
|
|
893
928
|
</div>
|
|
894
|
-
<span id="dirtyIndicator" class="hidden text-
|
|
895
|
-
<i class="fas fa-circle text-
|
|
929
|
+
<span id="dirtyIndicator" class="hidden text-amber text-xs flex items-center gap-1">
|
|
930
|
+
<i class="fas fa-circle text-2xs"></i> Unsaved
|
|
896
931
|
</span>
|
|
897
|
-
<span id="savedMsg" class="hidden text-green
|
|
898
|
-
<button id="saveBtn" class="
|
|
932
|
+
<span id="savedMsg" class="hidden text-green text-xs">Saved!</span>
|
|
933
|
+
<button id="saveBtn" class="btn btn-accent btn-sm opacity-50 cursor-not-allowed" disabled>
|
|
899
934
|
<i class="fas fa-save mr-1"></i> Save
|
|
900
935
|
</button>
|
|
901
936
|
</div>
|
|
902
937
|
</div>
|
|
903
938
|
|
|
904
939
|
<!-- Main content -->
|
|
905
|
-
<div class="
|
|
940
|
+
<div class="ide-main">
|
|
906
941
|
<!-- File tree sidebar -->
|
|
907
|
-
<div class="
|
|
908
|
-
<div class="
|
|
942
|
+
<div class="ide-tree">
|
|
943
|
+
<div class="ide-tree-header">
|
|
909
944
|
<span>Explorer</span>
|
|
910
|
-
<button id="newFileBtn" class="text-
|
|
945
|
+
<button id="newFileBtn" class="text-muted transition-colors" title="New Resource">
|
|
911
946
|
<i class="fas fa-plus text-xs"></i>
|
|
912
947
|
</button>
|
|
913
948
|
</div>
|
|
914
949
|
<div id="fileTree" class="py-1">
|
|
915
|
-
<div class="px-4 py-8 text-center text-
|
|
950
|
+
<div class="px-4 py-8 text-center text-muted text-sm">
|
|
916
951
|
<i class="fas fa-spinner fa-spin mr-2"></i> Loading...
|
|
917
952
|
</div>
|
|
918
953
|
</div>
|
|
919
954
|
</div>
|
|
920
955
|
|
|
921
956
|
<!-- Editor / Composer / Welcome -->
|
|
922
|
-
<div class="
|
|
923
|
-
<div id="welcomePanel" class="flex items-center justify-center h-full text-
|
|
957
|
+
<div class="ide-editor">
|
|
958
|
+
<div id="welcomePanel" class="flex items-center justify-center h-full text-muted">
|
|
924
959
|
<div class="text-center">
|
|
925
|
-
<i class="fas fa-code text-4xl mb-4 text-
|
|
960
|
+
<i class="fas fa-code text-4xl mb-4 text-muted"></i>
|
|
926
961
|
<p class="text-lg">Select a file from the tree to begin editing</p>
|
|
927
|
-
<p class="text-sm mt-2 text-
|
|
962
|
+
<p class="text-sm mt-2 text-muted">Supports YAML, JSON, JavaScript, TypeScript, and more</p>
|
|
928
963
|
</div>
|
|
929
964
|
</div>
|
|
930
965
|
<div id="editorContainer" class="hidden h-full">
|