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.
Files changed (259) hide show
  1. package/README.md +86 -28
  2. package/dist/lib/agents/agent-executor.d.ts.map +1 -1
  3. package/dist/lib/agents/agent-executor.js +23 -7
  4. package/dist/lib/agents/agent-executor.js.map +1 -1
  5. package/dist/lib/agents/react-loop.d.ts.map +1 -1
  6. package/dist/lib/agents/react-loop.js +27 -0
  7. package/dist/lib/agents/react-loop.js.map +1 -1
  8. package/dist/lib/functions/simple-function-wrapper.js +3 -3
  9. package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
  10. package/dist/lib/knowledge/knowledge-store.d.ts +1 -1
  11. package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -1
  12. package/dist/lib/knowledge/knowledge-store.js +25 -4
  13. package/dist/lib/knowledge/knowledge-store.js.map +1 -1
  14. package/dist/lib/knowledge/loaders/file-loaders.d.ts +0 -1
  15. package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -1
  16. package/dist/lib/knowledge/loaders/file-loaders.js +7 -15
  17. package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -1
  18. package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -1
  19. package/dist/lib/knowledge/sqlite-store.js +19 -10
  20. package/dist/lib/knowledge/sqlite-store.js.map +1 -1
  21. package/dist/lib/knowledge/types.d.ts +13 -13
  22. package/dist/lib/llm/index.d.ts +1 -1
  23. package/dist/lib/llm/index.d.ts.map +1 -1
  24. package/dist/lib/llm/index.js +1 -1
  25. package/dist/lib/llm/index.js.map +1 -1
  26. package/dist/lib/llm/llm-config.d.ts +51 -8
  27. package/dist/lib/llm/llm-config.d.ts.map +1 -1
  28. package/dist/lib/llm/llm-config.js +161 -17
  29. package/dist/lib/llm/llm-config.js.map +1 -1
  30. package/dist/lib/llm/llm-factory.d.ts +1 -2
  31. package/dist/lib/llm/llm-factory.d.ts.map +1 -1
  32. package/dist/lib/llm/llm-factory.js +41 -8
  33. package/dist/lib/llm/llm-factory.js.map +1 -1
  34. package/dist/lib/llm/providers/openai-chat-model.d.ts +10 -0
  35. package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -1
  36. package/dist/lib/llm/providers/openai-chat-model.js +37 -5
  37. package/dist/lib/llm/providers/openai-chat-model.js.map +1 -1
  38. package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -1
  39. package/dist/lib/llm/providers/openai-embeddings.js +41 -10
  40. package/dist/lib/llm/providers/openai-embeddings.js.map +1 -1
  41. package/dist/lib/local-llm/binary-manager.d.ts +66 -0
  42. package/dist/lib/local-llm/binary-manager.d.ts.map +1 -0
  43. package/dist/lib/local-llm/binary-manager.js +441 -0
  44. package/dist/lib/local-llm/binary-manager.js.map +1 -0
  45. package/dist/lib/local-llm/engine-interface.d.ts +47 -0
  46. package/dist/lib/local-llm/engine-interface.d.ts.map +1 -0
  47. package/dist/lib/local-llm/engine-interface.js +2 -0
  48. package/dist/lib/local-llm/engine-interface.js.map +1 -0
  49. package/dist/lib/local-llm/engine-registry.d.ts +20 -0
  50. package/dist/lib/local-llm/engine-registry.d.ts.map +1 -0
  51. package/dist/lib/local-llm/engine-registry.js +56 -0
  52. package/dist/lib/local-llm/engine-registry.js.map +1 -0
  53. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts +31 -0
  54. package/dist/lib/local-llm/engines/llama-cpp-engine.d.ts.map +1 -0
  55. package/dist/lib/local-llm/engines/llama-cpp-engine.js +164 -0
  56. package/dist/lib/local-llm/engines/llama-cpp-engine.js.map +1 -0
  57. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts +31 -0
  58. package/dist/lib/local-llm/engines/mlx-serve-engine.d.ts.map +1 -0
  59. package/dist/lib/local-llm/engines/mlx-serve-engine.js +161 -0
  60. package/dist/lib/local-llm/engines/mlx-serve-engine.js.map +1 -0
  61. package/dist/lib/local-llm/gguf-reader.d.ts +20 -0
  62. package/dist/lib/local-llm/gguf-reader.d.ts.map +1 -0
  63. package/dist/lib/local-llm/gguf-reader.js +190 -0
  64. package/dist/lib/local-llm/gguf-reader.js.map +1 -0
  65. package/dist/lib/local-llm/index.d.ts +9 -0
  66. package/dist/lib/local-llm/index.d.ts.map +1 -0
  67. package/dist/lib/local-llm/index.js +6 -0
  68. package/dist/lib/local-llm/index.js.map +1 -0
  69. package/dist/lib/local-llm/llama-server-process.d.ts +42 -0
  70. package/dist/lib/local-llm/llama-server-process.d.ts.map +1 -0
  71. package/dist/lib/local-llm/llama-server-process.js +237 -0
  72. package/dist/lib/local-llm/llama-server-process.js.map +1 -0
  73. package/dist/lib/local-llm/mlx-binary-manager.d.ts +33 -0
  74. package/dist/lib/local-llm/mlx-binary-manager.d.ts.map +1 -0
  75. package/dist/lib/local-llm/mlx-binary-manager.js +211 -0
  76. package/dist/lib/local-llm/mlx-binary-manager.js.map +1 -0
  77. package/dist/lib/local-llm/mlx-server-process.d.ts +26 -0
  78. package/dist/lib/local-llm/mlx-server-process.d.ts.map +1 -0
  79. package/dist/lib/local-llm/mlx-server-process.js +210 -0
  80. package/dist/lib/local-llm/mlx-server-process.js.map +1 -0
  81. package/dist/lib/local-llm/model-manager.d.ts +33 -0
  82. package/dist/lib/local-llm/model-manager.d.ts.map +1 -0
  83. package/dist/lib/local-llm/model-manager.js +591 -0
  84. package/dist/lib/local-llm/model-manager.js.map +1 -0
  85. package/dist/lib/local-llm/types.d.ts +51 -0
  86. package/dist/lib/local-llm/types.d.ts.map +1 -0
  87. package/dist/lib/local-llm/types.js +2 -0
  88. package/dist/lib/local-llm/types.js.map +1 -0
  89. package/dist/lib/logger.d.ts +2 -0
  90. package/dist/lib/logger.d.ts.map +1 -1
  91. package/dist/lib/logger.js +68 -5
  92. package/dist/lib/logger.js.map +1 -1
  93. package/dist/lib/orchestrator.d.ts +9 -0
  94. package/dist/lib/orchestrator.d.ts.map +1 -1
  95. package/dist/lib/orchestrator.js +151 -3
  96. package/dist/lib/orchestrator.js.map +1 -1
  97. package/dist/lib/sandbox/cdp-client.d.ts +2 -1
  98. package/dist/lib/sandbox/cdp-client.d.ts.map +1 -1
  99. package/dist/lib/sandbox/cdp-client.js +33 -7
  100. package/dist/lib/sandbox/cdp-client.js.map +1 -1
  101. package/dist/lib/sandbox/index.d.ts +1 -0
  102. package/dist/lib/sandbox/index.d.ts.map +1 -1
  103. package/dist/lib/sandbox/index.js +1 -0
  104. package/dist/lib/sandbox/index.js.map +1 -1
  105. package/dist/lib/sandbox/page-readiness.d.ts.map +1 -1
  106. package/dist/lib/sandbox/page-readiness.js +33 -0
  107. package/dist/lib/sandbox/page-readiness.js.map +1 -1
  108. package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -1
  109. package/dist/lib/sandbox/sandbox-browser.js +14 -1
  110. package/dist/lib/sandbox/sandbox-browser.js.map +1 -1
  111. package/dist/lib/sandbox/sandbox-container.d.ts +39 -0
  112. package/dist/lib/sandbox/sandbox-container.d.ts.map +1 -0
  113. package/dist/lib/sandbox/sandbox-container.js +176 -0
  114. package/dist/lib/sandbox/sandbox-container.js.map +1 -0
  115. package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -1
  116. package/dist/lib/sandbox/sandbox-file.js +5 -4
  117. package/dist/lib/sandbox/sandbox-file.js.map +1 -1
  118. package/dist/lib/sandbox/sandbox-shell.d.ts +2 -1
  119. package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -1
  120. package/dist/lib/sandbox/sandbox-shell.js +42 -24
  121. package/dist/lib/sandbox/sandbox-shell.js.map +1 -1
  122. package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -1
  123. package/dist/lib/sandbox/sandbox-web.js +27 -2
  124. package/dist/lib/sandbox/sandbox-web.js.map +1 -1
  125. package/dist/lib/sandbox/vision-browser.d.ts.map +1 -1
  126. package/dist/lib/sandbox/vision-browser.js +9 -0
  127. package/dist/lib/sandbox/vision-browser.js.map +1 -1
  128. package/dist/lib/sea/app-window.d.ts +7 -0
  129. package/dist/lib/sea/app-window.d.ts.map +1 -0
  130. package/dist/lib/sea/app-window.js +95 -0
  131. package/dist/lib/sea/app-window.js.map +1 -0
  132. package/dist/lib/sea/bootstrap.d.ts +18 -0
  133. package/dist/lib/sea/bootstrap.d.ts.map +1 -0
  134. package/dist/lib/sea/bootstrap.js +103 -0
  135. package/dist/lib/sea/bootstrap.js.map +1 -0
  136. package/dist/lib/sea/sqlite-vec-shim.d.ts +3 -0
  137. package/dist/lib/sea/sqlite-vec-shim.d.ts.map +1 -0
  138. package/dist/lib/sea/sqlite-vec-shim.js +10 -0
  139. package/dist/lib/sea/sqlite-vec-shim.js.map +1 -0
  140. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +1 -2
  141. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -1
  142. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +7 -13
  143. package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -1
  144. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -1
  145. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +2 -4
  146. package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -1
  147. package/dist/lib/tools/built-in/knowledge-search.tool.js +4 -4
  148. package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
  149. package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -1
  150. package/dist/lib/tools/built-in/knowledge-sql.tool.js +70 -37
  151. package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -1
  152. package/dist/lib/tools/built-in/knowledge-tools-factory.js +2 -2
  153. package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -1
  154. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +1 -2
  155. package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -1
  156. package/dist/lib/tools/built-in/knowledge-traverse.tool.js +5 -11
  157. package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -1
  158. package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -1
  159. package/dist/lib/tools/workspace/workspace-tools.js +5 -4
  160. package/dist/lib/tools/workspace/workspace-tools.js.map +1 -1
  161. package/dist/lib/types/tool-factory.d.ts.map +1 -1
  162. package/dist/lib/types/tool-factory.js +9 -2
  163. package/dist/lib/types/tool-factory.js.map +1 -1
  164. package/dist/lib/utils/document-extract.d.ts +10 -0
  165. package/dist/lib/utils/document-extract.d.ts.map +1 -0
  166. package/dist/lib/utils/document-extract.js +149 -0
  167. package/dist/lib/utils/document-extract.js.map +1 -0
  168. package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -1
  169. package/dist/lib/workflows/react-workflow-executor.js +20 -14
  170. package/dist/lib/workflows/react-workflow-executor.js.map +1 -1
  171. package/dist/lib/workflows/types.d.ts +71 -45
  172. package/dist/lib/workflows/types.d.ts.map +1 -1
  173. package/dist/lib/workflows/types.js +10 -0
  174. package/dist/lib/workflows/types.js.map +1 -1
  175. package/dist/public/assets/logo.png +0 -0
  176. package/dist/public/chat.html +3 -78
  177. package/dist/public/index.html +3 -330
  178. package/dist/public/src/components/AgentComposer.js +132 -132
  179. package/dist/public/src/components/AgentsView.js +1231 -350
  180. package/dist/public/src/components/AppRoot.js +101 -39
  181. package/dist/public/src/components/GraphView.js +11 -13
  182. package/dist/public/src/components/IdeView.js +133 -98
  183. package/dist/public/src/components/KnowledgeView.js +94 -130
  184. package/dist/public/src/components/LlmView.js +15 -19
  185. package/dist/public/src/components/LocalLlmView.js +2440 -0
  186. package/dist/public/src/components/LogViewer.js +155 -0
  187. package/dist/public/src/components/McpView.js +41 -49
  188. package/dist/public/src/components/MonitorView.js +79 -126
  189. package/dist/public/src/components/NavBar.js +16 -26
  190. package/dist/public/src/components/StandaloneChat.js +136 -150
  191. package/dist/public/src/services/ApiService.js +196 -2
  192. package/dist/public/src/services/SessionStore.js +6 -3
  193. package/dist/public/src/services/StreamManager.js +183 -0
  194. package/dist/public/src/store.js +1 -1
  195. package/dist/public/src/utils/card.js +21 -0
  196. package/dist/public/src/utils/markdown.js +1 -7
  197. package/dist/public/styles.css +2777 -0
  198. package/dist/src/cli/commands/init.d.ts.map +1 -1
  199. package/dist/src/cli/commands/init.js +7 -1
  200. package/dist/src/cli/commands/init.js.map +1 -1
  201. package/dist/src/cli/commands/start.d.ts.map +1 -1
  202. package/dist/src/cli/commands/start.js +28 -5
  203. package/dist/src/cli/commands/start.js.map +1 -1
  204. package/dist/src/cli/index.js +13 -2
  205. package/dist/src/cli/index.js.map +1 -1
  206. package/dist/src/index.js +7 -1
  207. package/dist/src/index.js.map +1 -1
  208. package/dist/src/routes/agents.route.d.ts.map +1 -1
  209. package/dist/src/routes/agents.route.js +2 -0
  210. package/dist/src/routes/agents.route.js.map +1 -1
  211. package/dist/src/routes/chat.route.d.ts.map +1 -1
  212. package/dist/src/routes/chat.route.js +3 -2
  213. package/dist/src/routes/chat.route.js.map +1 -1
  214. package/dist/src/routes/llm.route.d.ts.map +1 -1
  215. package/dist/src/routes/llm.route.js +227 -7
  216. package/dist/src/routes/llm.route.js.map +1 -1
  217. package/dist/src/routes/local-llm.route.d.ts +3 -0
  218. package/dist/src/routes/local-llm.route.d.ts.map +1 -0
  219. package/dist/src/routes/local-llm.route.js +688 -0
  220. package/dist/src/routes/local-llm.route.js.map +1 -0
  221. package/dist/src/routes/logs.route.d.ts +3 -0
  222. package/dist/src/routes/logs.route.d.ts.map +1 -0
  223. package/dist/src/routes/logs.route.js +24 -0
  224. package/dist/src/routes/logs.route.js.map +1 -0
  225. package/dist/src/routes/vnc.route.d.ts +10 -1
  226. package/dist/src/routes/vnc.route.d.ts.map +1 -1
  227. package/dist/src/routes/vnc.route.js +37 -12
  228. package/dist/src/routes/vnc.route.js.map +1 -1
  229. package/dist/src/routes/workflows.route.d.ts.map +1 -1
  230. package/dist/src/routes/workflows.route.js +24 -0
  231. package/dist/src/routes/workflows.route.js.map +1 -1
  232. package/dist/src/server.d.ts.map +1 -1
  233. package/dist/src/server.js +24 -2
  234. package/dist/src/server.js.map +1 -1
  235. package/dist/templates/agents/actor.agent.yaml +34 -0
  236. package/dist/templates/agents/architect.agent.yaml +0 -1
  237. package/dist/templates/agents/chatbot.agent.yaml +0 -1
  238. package/dist/templates/agents/corporate.agent.yaml +0 -1
  239. package/dist/templates/agents/functions.agent.yaml +29 -0
  240. package/dist/templates/agents/investment-analyst.agent.yaml +0 -1
  241. package/dist/templates/agents/music-librarian.agent.yaml +3 -27
  242. package/dist/templates/agents/network-security.agent.yaml +0 -1
  243. package/dist/templates/agents/transport-security.agent.yaml +0 -1
  244. package/dist/templates/agents/web-engineer.agent.yaml +3 -4
  245. package/dist/templates/agents/web-pilot.agent.yaml +0 -1
  246. package/dist/templates/knowledge/patient-records.knowledge.yaml +20 -0
  247. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_0.pdf +0 -0
  248. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_1.pdf +0 -0
  249. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_10.pdf +0 -0
  250. package/dist/templates/knowledge/pdf-patients/PDF_Deid_Deidentification_11.pdf +0 -0
  251. package/dist/templates/knowledge/web-docs.knowledge.yaml +1 -1
  252. package/dist/templates/llm.json +73 -10
  253. package/dist/templates/skills/orcha-builder/SKILL.md +56 -3
  254. package/dist/templates/workflows/example.workflow.yaml +27 -35
  255. package/dist/templates/workflows/react-example.workflow.yaml +14 -19
  256. package/dist/templates/workflows/team-chat.workflow.yaml +47 -0
  257. package/package.json +14 -6
  258. package/dist/public/src/components/SkillsView.js +0 -137
  259. 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-400' },
8
- yml: { icon: 'fa-file-code', color: 'text-orange-400' },
9
- json: { icon: 'fa-file-code', color: 'text-yellow-400' },
10
- js: { icon: 'fa-file-code', color: 'text-yellow-300' },
11
- ts: { icon: 'fa-file-code', color: 'text-yellow-300' },
12
- txt: { icon: 'fa-file-lines', color: 'text-gray-400' },
13
- md: { icon: 'fa-file-lines', color: 'text-blue-400' },
14
- default: { icon: 'fa-file', color: 'text-gray-500' },
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-400',
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-400',
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-400',
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-400',
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-400',
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)} flex items-center gap-2 rounded text-sm text-gray-300">
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 bg-dark-hover border border-blue-500 text-white text-sm rounded px-1 outline-none flex-1 min-w-0"
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 opacity-0 group-hover:opacity-100 px-1 text-gray-500 hover:text-white transition-opacity"
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 group tree-depth-${Math.min(depth, 5)} flex items-center gap-2 cursor-pointer hover:bg-dark-hover rounded text-sm text-gray-300"
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-gray-500 w-3"></i>
192
- <i class="fas fa-folder${isExpanded ? '-open' : ''} text-yellow-500 text-sm"></i>
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 group tree-depth-${Math.min(depth, 5)} flex items-center gap-2 cursor-pointer hover:bg-dark-hover rounded text-sm text-gray-300 ${activeClass}"
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 opacity-0 group-hover:opacity-100 px-1 text-gray-500 hover:text-white transition-opacity"
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 = 'fixed z-50 bg-dark-surface border border-dark-border rounded shadow-lg py-1 min-w-[100px]';
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 flex items-center gap-2 px-3 py-1.5 cursor-pointer hover:bg-dark-hover text-sm text-gray-300" data-action="rename">
340
- <i class="fas fa-pen text-xs w-4 text-gray-500"></i>
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 flex items-center gap-2 px-3 py-1.5 cursor-pointer hover:bg-dark-hover text-sm text-red-400" data-action="delete">
345
- <i class="fas fa-trash text-xs w-4"></i>
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="new-resource-item flex items-center gap-2 px-3 py-1.5 cursor-pointer hover:bg-dark-hover rounded text-sm text-gray-300"
438
+ <div class="resource-dropdown-item"
439
439
  data-resource="${key}">
440
- <i class="fas ${rt.icon} ${rt.color} text-xs w-4 text-center"></i>
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 = 'absolute right-0 top-full z-50 bg-dark-surface border border-dark-border rounded-lg shadow-lg py-1 mt-1 min-w-[140px]';
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('.new-resource-item').forEach(item => {
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 = 'fixed inset-0 z-50 flex items-center justify-center';
475
+ modal.className = 'auth-overlay';
476
476
  modal.innerHTML = `
477
- <div class="absolute inset-0 bg-black/50" data-action="cancel"></div>
478
- <div class="relative bg-dark-surface border border-dark-border rounded-lg shadow-xl w-full max-w-md mx-4">
479
- <div class="flex items-center gap-3 px-4 py-3 border-b border-dark-border">
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-gray-400 mb-2">Name</label>
485
- <div class="flex items-center bg-dark-bg border border-dark-border rounded overflow-hidden">
486
- <span class="px-3 py-2 text-gray-500 text-sm bg-dark-hover border-r border-dark-border">${rt.folder}</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 class="px-3 py-2 text-gray-500 text-sm bg-dark-hover border-l border-dark-border">${rt.suffix}</span>
489
+ <span>${rt.suffix}</span>
491
490
  </div>
492
- <p class="text-xs text-gray-500 mt-2">Use lowercase letters, numbers, and hyphens</p>
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 border-dark-border">
495
- <button class="px-4 py-1.5 text-sm text-gray-400 hover:text-white transition-colors" data-action="cancel">
496
- Cancel
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
- this._viewMode = 'source';
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
- // Initialize or update Ace
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-400');
741
- savedMsg.classList.add('text-yellow-400');
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-yellow-400');
745
- savedMsg.classList.add('text-green-400');
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-yellow-400');
749
- savedMsg.classList.add('text-green-400');
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
- const active = btn.dataset.mode === this._viewMode;
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
- // Listen for changes
825
- composer.addEventListener('composer:change', () => {
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
- // Update Ace content
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
- const color = type === 'error' ? 'bg-red-600' : 'bg-blue-600';
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="flex flex-col h-full">
912
+ <div class="ide-shell">
878
913
  <!-- Toolbar -->
879
- <div class="flex items-center justify-between bg-dark-surface border border-dark-border rounded-t-lg px-4 py-2 flex-shrink-0">
880
- <div class="flex items-center gap-2 text-sm text-gray-400">
881
- <i class="fas fa-code text-green-400"></i>
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 flex items-center bg-dark-bg rounded border border-dark-border overflow-hidden">
887
- <button class="mode-toggle-btn px-2.5 py-1 text-xs transition-colors text-white bg-dark-hover" data-mode="source">
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 px-2.5 py-1 text-xs transition-colors text-gray-500" data-mode="visual">
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-yellow-400 text-xs flex items-center gap-1">
895
- <i class="fas fa-circle text-[6px]"></i> Unsaved
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-400 text-xs">Saved!</span>
898
- <button id="saveBtn" class="px-3 py-1 bg-green-600 hover:bg-green-700 text-white text-sm rounded transition-colors opacity-50 cursor-not-allowed" disabled>
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="flex flex-1 min-h-0 border border-t-0 border-dark-border rounded-b-lg overflow-hidden">
940
+ <div class="ide-main">
906
941
  <!-- File tree sidebar -->
907
- <div class="w-60 flex-shrink-0 bg-dark-surface border-r border-dark-border overflow-y-auto">
908
- <div class="px-3 py-2 text-xs font-semibold text-gray-500 uppercase tracking-wider border-b border-dark-border flex items-center justify-between">
942
+ <div class="ide-tree">
943
+ <div class="ide-tree-header">
909
944
  <span>Explorer</span>
910
- <button id="newFileBtn" class="text-gray-500 hover:text-green-400 transition-colors" title="New Resource">
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-gray-500 text-sm">
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="flex-1 min-w-0 relative">
923
- <div id="welcomePanel" class="flex items-center justify-center h-full text-gray-500">
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-gray-600"></i>
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-gray-600">Supports YAML, JSON, JavaScript, TypeScript, and more</p>
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">