agent-orcha 0.0.4 → 0.0.7
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 +216 -1323
- package/dist/lib/agents/agent-executor.d.ts +15 -4
- package/dist/lib/agents/agent-executor.d.ts.map +1 -1
- package/dist/lib/agents/agent-executor.js +337 -87
- package/dist/lib/agents/agent-executor.js.map +1 -1
- package/dist/lib/agents/agent-loader.d.ts +4 -1
- package/dist/lib/agents/agent-loader.d.ts.map +1 -1
- package/dist/lib/agents/agent-loader.js +20 -4
- package/dist/lib/agents/agent-loader.js.map +1 -1
- package/dist/lib/agents/index.d.ts +5 -5
- package/dist/lib/agents/index.js +4 -4
- package/dist/lib/agents/react-loop.d.ts +30 -0
- package/dist/lib/agents/react-loop.d.ts.map +1 -0
- package/dist/lib/agents/react-loop.js +193 -0
- package/dist/lib/agents/react-loop.js.map +1 -0
- package/dist/lib/agents/structured-output-wrapper.d.ts +3 -3
- package/dist/lib/agents/structured-output-wrapper.d.ts.map +1 -1
- package/dist/lib/agents/structured-output-wrapper.js +2 -2
- package/dist/lib/agents/structured-output-wrapper.js.map +1 -1
- package/dist/lib/agents/types.d.ts +306 -19
- package/dist/lib/agents/types.d.ts.map +1 -1
- package/dist/lib/agents/types.js +34 -4
- package/dist/lib/agents/types.js.map +1 -1
- package/dist/lib/functions/function-loader.d.ts +3 -1
- package/dist/lib/functions/function-loader.d.ts.map +1 -1
- package/dist/lib/functions/function-loader.js +23 -5
- package/dist/lib/functions/function-loader.js.map +1 -1
- package/dist/lib/functions/index.d.ts +2 -2
- package/dist/lib/functions/index.js +1 -1
- package/dist/lib/functions/simple-function-wrapper.d.ts +2 -11
- package/dist/lib/functions/simple-function-wrapper.d.ts.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/index.d.ts +29 -17
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +21 -9
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/integrations/collabnook.d.ts +56 -0
- package/dist/lib/integrations/collabnook.d.ts.map +1 -0
- package/dist/lib/integrations/collabnook.js +307 -0
- package/dist/lib/integrations/collabnook.js.map +1 -0
- package/dist/lib/integrations/email.d.ts +38 -0
- package/dist/lib/integrations/email.d.ts.map +1 -0
- package/dist/lib/integrations/email.js +249 -0
- package/dist/lib/integrations/email.js.map +1 -0
- package/dist/lib/integrations/integration-manager.d.ts +19 -0
- package/dist/lib/integrations/integration-manager.d.ts.map +1 -0
- package/dist/lib/integrations/integration-manager.js +159 -0
- package/dist/lib/integrations/integration-manager.js.map +1 -0
- package/dist/lib/integrations/types.d.ts +232 -0
- package/dist/lib/integrations/types.d.ts.map +1 -0
- package/dist/lib/integrations/types.js +37 -0
- package/dist/lib/integrations/types.js.map +1 -0
- package/dist/lib/knowledge/direct-mapper.d.ts +21 -0
- package/dist/lib/knowledge/direct-mapper.d.ts.map +1 -0
- package/dist/lib/knowledge/direct-mapper.js +134 -0
- package/dist/lib/knowledge/direct-mapper.js.map +1 -0
- package/dist/lib/knowledge/index.d.ts +9 -8
- package/dist/lib/knowledge/index.d.ts.map +1 -1
- package/dist/lib/knowledge/index.js +9 -7
- package/dist/lib/knowledge/index.js.map +1 -1
- package/dist/lib/knowledge/knowledge-store-metadata.d.ts +40 -0
- package/dist/lib/knowledge/knowledge-store-metadata.d.ts.map +1 -0
- package/dist/lib/knowledge/knowledge-store-metadata.js +93 -0
- package/dist/lib/knowledge/knowledge-store-metadata.js.map +1 -0
- package/dist/lib/knowledge/knowledge-store.d.ts +49 -0
- package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -0
- package/dist/lib/knowledge/knowledge-store.js +670 -0
- package/dist/lib/knowledge/knowledge-store.js.map +1 -0
- package/dist/lib/knowledge/loaders/database-loader.d.ts +5 -5
- package/dist/lib/knowledge/loaders/database-loader.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/database-loader.js +21 -10
- package/dist/lib/knowledge/loaders/database-loader.js.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.d.ts +45 -0
- package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -0
- package/dist/lib/knowledge/loaders/file-loaders.js +160 -0
- package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -0
- package/dist/lib/knowledge/loaders/index.d.ts +3 -3
- package/dist/lib/knowledge/loaders/index.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/index.js +3 -3
- package/dist/lib/knowledge/loaders/index.js.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.d.ts +14 -5
- package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.js +64 -29
- package/dist/lib/knowledge/loaders/web-loader.js.map +1 -1
- package/dist/lib/knowledge/sqlite-store.d.ts +107 -0
- package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -0
- package/dist/lib/knowledge/sqlite-store.js +327 -0
- package/dist/lib/knowledge/sqlite-store.js.map +1 -0
- package/dist/lib/knowledge/types.d.ts +124 -1448
- package/dist/lib/knowledge/types.d.ts.map +1 -1
- package/dist/lib/knowledge/types.js +54 -60
- package/dist/lib/knowledge/types.js.map +1 -1
- package/dist/lib/knowledge/utils/connection-pool.d.ts +3 -2
- package/dist/lib/knowledge/utils/connection-pool.d.ts.map +1 -1
- package/dist/lib/knowledge/utils/connection-pool.js +20 -10
- package/dist/lib/knowledge/utils/connection-pool.js.map +1 -1
- package/dist/lib/knowledge/utils/index.d.ts +2 -2
- package/dist/lib/knowledge/utils/index.js +2 -2
- package/dist/lib/llm/index.d.ts +5 -5
- package/dist/lib/llm/index.d.ts.map +1 -1
- package/dist/lib/llm/index.js +3 -3
- package/dist/lib/llm/index.js.map +1 -1
- package/dist/lib/llm/llm-call-logger.d.ts +39 -0
- package/dist/lib/llm/llm-call-logger.d.ts.map +1 -0
- package/dist/lib/llm/llm-call-logger.js +110 -0
- package/dist/lib/llm/llm-call-logger.js.map +1 -0
- package/dist/lib/llm/llm-config.d.ts +30 -16
- package/dist/lib/llm/llm-config.d.ts.map +1 -1
- package/dist/lib/llm/llm-config.js +22 -4
- package/dist/lib/llm/llm-config.js.map +1 -1
- package/dist/lib/llm/llm-factory.d.ts +3 -16
- package/dist/lib/llm/llm-factory.d.ts.map +1 -1
- package/dist/lib/llm/llm-factory.js +33 -48
- package/dist/lib/llm/llm-factory.js.map +1 -1
- package/dist/lib/llm/provider-detector.d.ts +1 -1
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts +31 -0
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts.map +1 -0
- package/dist/lib/llm/providers/anthropic-chat-model.js +262 -0
- package/dist/lib/llm/providers/anthropic-chat-model.js.map +1 -0
- package/dist/lib/llm/providers/gemini-chat-model.d.ts +30 -0
- package/dist/lib/llm/providers/gemini-chat-model.d.ts.map +1 -0
- package/dist/lib/llm/providers/gemini-chat-model.js +300 -0
- package/dist/lib/llm/providers/gemini-chat-model.js.map +1 -0
- package/dist/lib/llm/providers/gemini-embeddings.d.ts +14 -0
- package/dist/lib/llm/providers/gemini-embeddings.d.ts.map +1 -0
- package/dist/lib/llm/providers/gemini-embeddings.js +20 -0
- package/dist/lib/llm/providers/gemini-embeddings.js.map +1 -0
- package/dist/lib/llm/providers/openai-chat-model.d.ts +39 -0
- package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -0
- package/dist/lib/llm/providers/openai-chat-model.js +397 -0
- package/dist/lib/llm/providers/openai-chat-model.js.map +1 -0
- package/dist/lib/llm/providers/openai-embeddings.d.ts +17 -0
- package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -0
- package/dist/lib/llm/providers/openai-embeddings.js +35 -0
- package/dist/lib/llm/providers/openai-embeddings.js.map +1 -0
- package/dist/lib/llm/types.d.ts +2 -2
- package/dist/lib/llm/types.js +1 -1
- package/dist/lib/logger.d.ts +7 -0
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +42 -4
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/mcp/index.d.ts +3 -3
- package/dist/lib/mcp/index.js +2 -2
- package/dist/lib/mcp/mcp-client.d.ts +3 -2
- package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
- package/dist/lib/mcp/mcp-client.js +10 -5
- package/dist/lib/mcp/mcp-client.js.map +1 -1
- package/dist/lib/mcp/types.d.ts +26 -25
- package/dist/lib/mcp/types.d.ts.map +1 -1
- package/dist/lib/mcp/types.js +12 -4
- package/dist/lib/mcp/types.js.map +1 -1
- package/dist/lib/memory/conversation-store.d.ts +2 -2
- package/dist/lib/memory/conversation-store.d.ts.map +1 -1
- package/dist/lib/memory/conversation-store.js +1 -1
- package/dist/lib/memory/index.d.ts +3 -2
- package/dist/lib/memory/index.d.ts.map +1 -1
- package/dist/lib/memory/index.js +3 -2
- package/dist/lib/memory/index.js.map +1 -1
- package/dist/lib/memory/memory-manager.d.ts +10 -0
- package/dist/lib/memory/memory-manager.d.ts.map +1 -0
- package/dist/lib/memory/memory-manager.js +43 -0
- package/dist/lib/memory/memory-manager.js.map +1 -0
- package/dist/lib/memory/types.d.ts +1 -1
- package/dist/lib/memory/types.d.ts.map +1 -1
- package/dist/lib/orchestrator.d.ts +72 -18
- package/dist/lib/orchestrator.d.ts.map +1 -1
- package/dist/lib/orchestrator.js +341 -56
- package/dist/lib/orchestrator.js.map +1 -1
- package/dist/lib/sandbox/cdp-client.d.ts +14 -0
- package/dist/lib/sandbox/cdp-client.d.ts.map +1 -0
- package/dist/lib/sandbox/cdp-client.js +113 -0
- package/dist/lib/sandbox/cdp-client.js.map +1 -0
- package/dist/lib/sandbox/html-to-markdown.d.ts +10 -0
- package/dist/lib/sandbox/html-to-markdown.d.ts.map +1 -0
- package/dist/lib/sandbox/html-to-markdown.js +121 -0
- package/dist/lib/sandbox/html-to-markdown.js.map +1 -0
- package/dist/lib/sandbox/index.d.ts +12 -0
- package/dist/lib/sandbox/index.d.ts.map +1 -0
- package/dist/lib/sandbox/index.js +10 -0
- package/dist/lib/sandbox/index.js.map +1 -0
- package/dist/lib/sandbox/page-readiness.d.ts +37 -0
- package/dist/lib/sandbox/page-readiness.d.ts.map +1 -0
- package/dist/lib/sandbox/page-readiness.js +235 -0
- package/dist/lib/sandbox/page-readiness.js.map +1 -0
- package/dist/lib/sandbox/sandbox-browser.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-browser.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-browser.js +303 -0
- package/dist/lib/sandbox/sandbox-browser.js.map +1 -0
- package/dist/lib/sandbox/sandbox-exec.d.ts +5 -0
- package/dist/lib/sandbox/sandbox-exec.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-exec.js +35 -0
- package/dist/lib/sandbox/sandbox-exec.js.map +1 -0
- package/dist/lib/sandbox/sandbox-file.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-file.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-file.js +168 -0
- package/dist/lib/sandbox/sandbox-file.js.map +1 -0
- package/dist/lib/sandbox/sandbox-shell.d.ts +4 -0
- package/dist/lib/sandbox/sandbox-shell.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-shell.js +93 -0
- package/dist/lib/sandbox/sandbox-shell.js.map +1 -0
- package/dist/lib/sandbox/sandbox-web.d.ts +5 -0
- package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-web.js +226 -0
- package/dist/lib/sandbox/sandbox-web.js.map +1 -0
- package/dist/lib/sandbox/types.d.ts +30 -0
- package/dist/lib/sandbox/types.d.ts.map +1 -0
- package/dist/lib/sandbox/types.js +8 -0
- package/dist/lib/sandbox/types.js.map +1 -0
- package/dist/lib/sandbox/vision-browser.d.ts +4 -0
- package/dist/lib/sandbox/vision-browser.d.ts.map +1 -0
- package/dist/lib/sandbox/vision-browser.js +289 -0
- package/dist/lib/sandbox/vision-browser.js.map +1 -0
- package/dist/lib/sandbox/vm-executor.d.ts +12 -0
- package/dist/lib/sandbox/vm-executor.d.ts.map +1 -0
- package/dist/lib/sandbox/vm-executor.js +101 -0
- package/dist/lib/sandbox/vm-executor.js.map +1 -0
- package/dist/lib/skills/index.d.ts +4 -0
- package/dist/lib/skills/index.d.ts.map +1 -0
- package/dist/lib/skills/index.js +3 -0
- package/dist/lib/skills/index.js.map +1 -0
- package/dist/lib/skills/skill-loader.d.ts +21 -0
- package/dist/lib/skills/skill-loader.d.ts.map +1 -0
- package/dist/lib/skills/skill-loader.js +116 -0
- package/dist/lib/skills/skill-loader.js.map +1 -0
- package/dist/lib/skills/types.d.ts +17 -0
- package/dist/lib/skills/types.d.ts.map +1 -0
- package/dist/lib/skills/types.js +6 -0
- package/dist/lib/skills/types.js.map +1 -0
- package/dist/lib/tasks/index.d.ts +4 -0
- package/dist/lib/tasks/index.d.ts.map +1 -0
- package/dist/lib/tasks/index.js +4 -0
- package/dist/lib/tasks/index.js.map +1 -0
- package/dist/lib/tasks/task-manager.d.ts +27 -0
- package/dist/lib/tasks/task-manager.d.ts.map +1 -0
- package/dist/lib/tasks/task-manager.js +200 -0
- package/dist/lib/tasks/task-manager.js.map +1 -0
- package/dist/lib/tasks/task-store.d.ts +20 -0
- package/dist/lib/tasks/task-store.d.ts.map +1 -0
- package/dist/lib/tasks/task-store.js +102 -0
- package/dist/lib/tasks/task-store.js.map +1 -0
- package/dist/lib/tasks/types.d.ts +56 -0
- package/dist/lib/tasks/types.d.ts.map +1 -0
- package/dist/lib/tasks/types.js +2 -0
- package/dist/lib/tasks/types.js.map +1 -0
- package/dist/lib/templates/resource-templates.d.ts +6 -0
- package/dist/lib/templates/resource-templates.d.ts.map +1 -0
- package/dist/lib/templates/resource-templates.js +146 -0
- package/dist/lib/templates/resource-templates.js.map +1 -0
- package/dist/lib/tools/agent-tool-wrapper.d.ts +5 -5
- package/dist/lib/tools/agent-tool-wrapper.js +3 -3
- package/dist/lib/tools/agent-tool-wrapper.js.map +1 -1
- package/dist/lib/tools/built-in/ask-user.tool.d.ts +1 -1
- package/dist/lib/tools/built-in/ask-user.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/ask-user.tool.js +2 -2
- package/dist/lib/tools/built-in/ask-user.tool.js.map +1 -1
- package/dist/lib/tools/built-in/index.d.ts +9 -2
- package/dist/lib/tools/built-in/index.d.ts.map +1 -1
- package/dist/lib/tools/built-in/index.js +9 -2
- package/dist/lib/tools/built-in/index.js.map +1 -1
- package/dist/lib/tools/built-in/integration-tools.d.ts +4 -0
- package/dist/lib/tools/built-in/integration-tools.d.ts.map +1 -0
- package/dist/lib/tools/built-in/integration-tools.js +47 -0
- package/dist/lib/tools/built-in/integration-tools.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +9 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +108 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts +9 -0
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +96 -0
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-search.tool.d.ts +2 -2
- package/dist/lib/tools/built-in/knowledge-search.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-search.tool.js +1 -1
- package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts +7 -0
- package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-sql.tool.js +128 -0
- package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-tools-factory.d.ts +17 -0
- package/dist/lib/tools/built-in/knowledge-tools-factory.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-tools-factory.js +54 -0
- package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +9 -0
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js +91 -0
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -0
- package/dist/lib/tools/built-in/memory-save.tool.d.ts +4 -0
- package/dist/lib/tools/built-in/memory-save.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/memory-save.tool.js +21 -0
- package/dist/lib/tools/built-in/memory-save.tool.js.map +1 -0
- package/dist/lib/tools/built-in/query-validators.d.ts +18 -0
- package/dist/lib/tools/built-in/query-validators.d.ts.map +1 -0
- package/dist/lib/tools/built-in/query-validators.js +91 -0
- package/dist/lib/tools/built-in/query-validators.js.map +1 -0
- package/dist/lib/tools/index.d.ts +4 -4
- package/dist/lib/tools/index.js +4 -4
- package/dist/lib/tools/tool-discovery.d.ts +11 -33
- package/dist/lib/tools/tool-discovery.d.ts.map +1 -1
- package/dist/lib/tools/tool-discovery.js +16 -43
- package/dist/lib/tools/tool-discovery.js.map +1 -1
- package/dist/lib/tools/tool-registry.d.ts +10 -18
- package/dist/lib/tools/tool-registry.d.ts.map +1 -1
- package/dist/lib/tools/tool-registry.js +37 -23
- package/dist/lib/tools/tool-registry.js.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.d.ts +61 -0
- package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -0
- package/dist/lib/tools/workspace/workspace-tools.js +179 -0
- package/dist/lib/tools/workspace/workspace-tools.js.map +1 -0
- package/dist/lib/triggers/cron-trigger.d.ts +12 -0
- package/dist/lib/triggers/cron-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/cron-trigger.js +45 -0
- package/dist/lib/triggers/cron-trigger.js.map +1 -0
- package/dist/lib/triggers/index.d.ts +6 -0
- package/dist/lib/triggers/index.d.ts.map +1 -0
- package/dist/lib/triggers/index.js +5 -0
- package/dist/lib/triggers/index.js.map +1 -0
- package/dist/lib/triggers/trigger-manager.d.ts +12 -0
- package/dist/lib/triggers/trigger-manager.d.ts.map +1 -0
- package/dist/lib/triggers/trigger-manager.js +77 -0
- package/dist/lib/triggers/trigger-manager.js.map +1 -0
- package/dist/lib/triggers/types.d.ts +57 -0
- package/dist/lib/triggers/types.d.ts.map +1 -0
- package/dist/lib/triggers/types.js +16 -0
- package/dist/lib/triggers/types.js.map +1 -0
- package/dist/lib/triggers/webhook-trigger.d.ts +12 -0
- package/dist/lib/triggers/webhook-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/webhook-trigger.js +34 -0
- package/dist/lib/triggers/webhook-trigger.js.map +1 -0
- package/dist/lib/types/llm-types.d.ts +72 -0
- package/dist/lib/types/llm-types.d.ts.map +1 -0
- package/dist/lib/types/llm-types.js +72 -0
- package/dist/lib/types/llm-types.js.map +1 -0
- package/dist/lib/types/text-splitters.d.ts +27 -0
- package/dist/lib/types/text-splitters.d.ts.map +1 -0
- package/dist/lib/types/text-splitters.js +114 -0
- package/dist/lib/types/text-splitters.js.map +1 -0
- package/dist/lib/types/tool-factory.d.ts +9 -0
- package/dist/lib/types/tool-factory.d.ts.map +1 -0
- package/dist/lib/types/tool-factory.js +12 -0
- package/dist/lib/types/tool-factory.js.map +1 -0
- package/dist/lib/utils/env-substitution.d.ts +6 -0
- package/dist/lib/utils/env-substitution.d.ts.map +1 -0
- package/dist/lib/utils/env-substitution.js +15 -0
- package/dist/lib/utils/env-substitution.js.map +1 -0
- package/dist/lib/utils/file-utils.d.ts +11 -0
- package/dist/lib/utils/file-utils.d.ts.map +1 -0
- package/dist/lib/utils/file-utils.js +86 -0
- package/dist/lib/utils/file-utils.js.map +1 -0
- package/dist/lib/workflows/index.d.ts +6 -6
- package/dist/lib/workflows/index.d.ts.map +1 -1
- package/dist/lib/workflows/index.js +5 -5
- package/dist/lib/workflows/index.js.map +1 -1
- package/dist/lib/workflows/interrupt-manager.d.ts +1 -1
- package/dist/lib/workflows/interrupt-manager.js +1 -1
- package/dist/lib/workflows/react-workflow-executor.d.ts +26 -0
- package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -0
- package/dist/lib/workflows/react-workflow-executor.js +333 -0
- package/dist/lib/workflows/react-workflow-executor.js.map +1 -0
- package/dist/lib/workflows/types.d.ts +106 -107
- package/dist/lib/workflows/types.d.ts.map +1 -1
- package/dist/lib/workflows/types.js +5 -5
- package/dist/lib/workflows/types.js.map +1 -1
- package/dist/lib/workflows/workflow-executor.d.ts +3 -3
- package/dist/lib/workflows/workflow-executor.js +2 -2
- package/dist/lib/workflows/workflow-executor.js.map +1 -1
- package/dist/lib/workflows/workflow-loader.d.ts +4 -1
- package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
- package/dist/lib/workflows/workflow-loader.js +20 -4
- package/dist/lib/workflows/workflow-loader.js.map +1 -1
- package/dist/public/chat.html +114 -0
- package/dist/public/index.html +189 -0
- package/dist/public/src/components/AgentComposer.js +807 -0
- package/dist/public/src/components/AgentsView.js +1021 -344
- package/dist/public/src/components/AppRoot.js +150 -5
- package/dist/public/src/components/GraphView.js +420 -0
- package/dist/public/src/components/IdeView.js +625 -14
- package/dist/public/src/components/KnowledgeView.js +443 -66
- package/dist/public/src/components/MonitorView.js +526 -0
- package/dist/public/src/components/NavBar.js +3 -0
- package/dist/public/src/components/SkillsView.js +137 -0
- package/dist/public/src/components/StandaloneChat.js +889 -0
- package/dist/public/src/components/WorkflowsView.js +454 -129
- package/dist/public/src/services/ApiService.js +170 -25
- package/dist/public/src/services/SessionStore.js +83 -0
- package/dist/public/src/store.js +3 -4
- package/dist/public/src/utils/markdown.js +14 -0
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/start.d.ts +0 -1
- package/dist/src/cli/commands/start.d.ts.map +1 -1
- package/dist/src/cli/commands/start.js +23 -14
- package/dist/src/cli/commands/start.js.map +1 -1
- package/dist/src/cli/index.js +8 -5
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +23 -9
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +3 -0
- package/dist/src/middleware/auth.d.ts.map +1 -0
- package/dist/src/middleware/auth.js +129 -0
- package/dist/src/middleware/auth.js.map +1 -0
- package/dist/src/middleware/rate-limit.d.ts +8 -0
- package/dist/src/middleware/rate-limit.d.ts.map +1 -0
- package/dist/src/middleware/rate-limit.js +21 -0
- package/dist/src/middleware/rate-limit.js.map +1 -0
- package/dist/src/routes/agents.route.d.ts.map +1 -1
- package/dist/src/routes/agents.route.js +167 -12
- package/dist/src/routes/agents.route.js.map +1 -1
- package/dist/src/routes/chat.route.d.ts +3 -0
- package/dist/src/routes/chat.route.d.ts.map +1 -0
- package/dist/src/routes/chat.route.js +155 -0
- package/dist/src/routes/chat.route.js.map +1 -0
- package/dist/src/routes/files.route.d.ts.map +1 -1
- package/dist/src/routes/files.route.js +163 -87
- package/dist/src/routes/files.route.js.map +1 -1
- package/dist/src/routes/functions.route.js +1 -1
- package/dist/src/routes/graph.route.d.ts +3 -0
- package/dist/src/routes/graph.route.d.ts.map +1 -0
- package/dist/src/routes/graph.route.js +173 -0
- package/dist/src/routes/graph.route.js.map +1 -0
- package/dist/src/routes/knowledge.route.d.ts.map +1 -1
- package/dist/src/routes/knowledge.route.js +172 -69
- package/dist/src/routes/knowledge.route.js.map +1 -1
- package/dist/src/routes/llm.route.d.ts.map +1 -1
- package/dist/src/routes/llm.route.js +85 -9
- package/dist/src/routes/llm.route.js.map +1 -1
- package/dist/src/routes/mcp.route.js +1 -1
- package/dist/src/routes/skills.route.d.ts +3 -0
- package/dist/src/routes/skills.route.d.ts.map +1 -0
- package/dist/src/routes/skills.route.js +23 -0
- package/dist/src/routes/skills.route.js.map +1 -0
- package/dist/src/routes/tasks.route.d.ts +3 -0
- package/dist/src/routes/tasks.route.d.ts.map +1 -0
- package/dist/src/routes/tasks.route.js +149 -0
- package/dist/src/routes/tasks.route.js.map +1 -0
- package/dist/src/routes/vnc.route.d.ts +3 -0
- package/dist/src/routes/vnc.route.d.ts.map +1 -0
- package/dist/src/routes/vnc.route.js +49 -0
- package/dist/src/routes/vnc.route.js.map +1 -0
- package/dist/src/routes/workflows.route.d.ts.map +1 -1
- package/dist/src/routes/workflows.route.js +9 -1
- package/dist/src/routes/workflows.route.js.map +1 -1
- package/dist/src/server.d.ts +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +26 -9
- package/dist/src/server.js.map +1 -1
- package/dist/templates/.env.example +4 -19
- package/dist/templates/Demo.md +152 -0
- package/dist/templates/README.md +28 -11
- package/dist/templates/agents/architect.agent.yaml +57 -0
- package/dist/templates/agents/chatbot.agent.yaml +55 -0
- package/dist/templates/agents/corporate.agent.yaml +65 -0
- package/dist/templates/agents/investment-analyst.agent.yaml +80 -0
- package/dist/templates/agents/music-librarian.agent.yaml +70 -0
- package/dist/templates/agents/network-security.agent.yaml +82 -0
- package/dist/templates/agents/transport-security.agent.yaml +70 -0
- package/dist/templates/agents/web-engineer.agent.yaml +99 -0
- package/dist/templates/agents/web-pilot.agent.yaml +58 -0
- package/dist/templates/knowledge/music-store/LICENSE.md +11 -0
- package/dist/templates/knowledge/music-store/musicstore.sqlite +0 -0
- package/dist/templates/knowledge/music-store/tables.png +0 -0
- package/dist/templates/knowledge/music-store.knowledge.yaml +138 -0
- package/dist/templates/knowledge/org-chart/personnel.csv +21 -0
- package/dist/templates/knowledge/org-chart.knowledge.yaml +53 -0
- package/dist/templates/knowledge/pet-store/pet-store.db +0 -0
- package/dist/templates/knowledge/pet-store.knowledge.yaml +81 -0
- package/dist/templates/knowledge/security-incidents/incidents.json +55935 -0
- package/dist/templates/knowledge/security-incidents.knowledge.yaml +46 -0
- package/dist/templates/knowledge/transcripts.knowledge.yaml +29 -0
- package/dist/templates/knowledge/transport-ot/systems.csv +117 -0
- package/dist/templates/knowledge/transport-ot.knowledge.yaml +55 -0
- package/dist/templates/knowledge/web-docs.knowledge.yaml +20 -0
- package/dist/templates/llm.json +7 -30
- package/dist/templates/mcp.json +10 -4
- package/dist/templates/skills/orcha-builder/SKILL.md +219 -0
- package/dist/templates/skills/pii-guard/SKILL.md +22 -0
- package/dist/templates/skills/sandbox/SKILL.md +40 -0
- package/dist/templates/skills/web-pilot/SKILL.md +51 -0
- package/dist/templates/workflows/example.workflow.yaml +25 -30
- package/dist/templates/workflows/react-example.workflow.yaml +53 -0
- package/package.json +22 -20
- package/dist/lib/knowledge/graph-rag/community-detector.d.ts +0 -16
- package/dist/lib/knowledge/graph-rag/community-detector.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/community-detector.js +0 -81
- package/dist/lib/knowledge/graph-rag/community-detector.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts +0 -17
- package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/community-summarizer.js +0 -87
- package/dist/lib/knowledge/graph-rag/community-summarizer.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts +0 -36
- package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/entity-extractor.js +0 -192
- package/dist/lib/knowledge/graph-rag/entity-extractor.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts +0 -30
- package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/extraction-cache.js +0 -88
- package/dist/lib/knowledge/graph-rag/extraction-cache.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/global-search.d.ts +0 -19
- package/dist/lib/knowledge/graph-rag/global-search.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/global-search.js +0 -96
- package/dist/lib/knowledge/graph-rag/global-search.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts +0 -24
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.js +0 -239
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/index.d.ts +0 -14
- package/dist/lib/knowledge/graph-rag/index.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/index.js +0 -12
- package/dist/lib/knowledge/graph-rag/index.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/local-search.d.ts +0 -20
- package/dist/lib/knowledge/graph-rag/local-search.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/local-search.js +0 -110
- package/dist/lib/knowledge/graph-rag/local-search.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts +0 -31
- package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/memory-graph-store.js +0 -165
- package/dist/lib/knowledge/graph-rag/memory-graph-store.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts +0 -38
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js +0 -190
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts +0 -11
- package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/search-mode-detector.js +0 -50
- package/dist/lib/knowledge/graph-rag/search-mode-detector.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/types.d.ts +0 -368
- package/dist/lib/knowledge/graph-rag/types.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/types.js +0 -48
- package/dist/lib/knowledge/graph-rag/types.js.map +0 -1
- package/dist/lib/knowledge/knowledge-store-factory.d.ts +0 -16
- package/dist/lib/knowledge/knowledge-store-factory.d.ts.map +0 -1
- package/dist/lib/knowledge/knowledge-store-factory.js +0 -376
- package/dist/lib/knowledge/knowledge-store-factory.js.map +0 -1
- package/dist/lib/knowledge/knowledge-store-manager.d.ts +0 -18
- package/dist/lib/knowledge/knowledge-store-manager.d.ts.map +0 -1
- package/dist/lib/knowledge/knowledge-store-manager.js +0 -98
- package/dist/lib/knowledge/knowledge-store-manager.js.map +0 -1
- package/dist/lib/knowledge/loaders/s3-loader.d.ts +0 -17
- package/dist/lib/knowledge/loaders/s3-loader.d.ts.map +0 -1
- package/dist/lib/knowledge/loaders/s3-loader.js +0 -185
- package/dist/lib/knowledge/loaders/s3-loader.js.map +0 -1
- package/dist/lib/workflows/langgraph-executor.d.ts +0 -51
- package/dist/lib/workflows/langgraph-executor.d.ts.map +0 -1
- package/dist/lib/workflows/langgraph-executor.js +0 -297
- package/dist/lib/workflows/langgraph-executor.js.map +0 -1
- package/dist/templates/agents/call-center-analyst-simple.agent.yaml +0 -36
- package/dist/templates/agents/math.agent.yaml +0 -28
- package/dist/templates/agents/sentiment-structured.agent.yaml +0 -42
- package/dist/templates/knowledge/example.knowledge.yaml +0 -28
- package/dist/templates/llm.md +0 -1195
- package/dist/templates/workflows/langgraph-example.workflow.yaml +0 -84
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
import { Component } from '../utils/Component.js';
|
|
3
3
|
import { api } from '../services/ApiService.js';
|
|
4
|
+
import './AgentComposer.js';
|
|
4
5
|
|
|
5
6
|
const FILE_ICONS = {
|
|
6
7
|
yaml: { icon: 'fa-file-code', color: 'text-orange-400' },
|
|
@@ -23,11 +24,53 @@ const ACE_MODES = {
|
|
|
23
24
|
default: 'ace/mode/text',
|
|
24
25
|
};
|
|
25
26
|
|
|
27
|
+
const RESOURCE_TYPES = {
|
|
28
|
+
agent: {
|
|
29
|
+
label: 'Agent',
|
|
30
|
+
icon: 'fa-robot',
|
|
31
|
+
color: 'text-blue-400',
|
|
32
|
+
folder: 'agents/',
|
|
33
|
+
suffix: '.agent.yaml',
|
|
34
|
+
},
|
|
35
|
+
function: {
|
|
36
|
+
label: 'Function',
|
|
37
|
+
icon: 'fa-bolt',
|
|
38
|
+
color: 'text-yellow-400',
|
|
39
|
+
folder: 'functions/',
|
|
40
|
+
suffix: '.function.js',
|
|
41
|
+
},
|
|
42
|
+
knowledge: {
|
|
43
|
+
label: 'Knowledge',
|
|
44
|
+
icon: 'fa-database',
|
|
45
|
+
color: 'text-purple-400',
|
|
46
|
+
folder: 'knowledge/',
|
|
47
|
+
suffix: '.knowledge.yaml',
|
|
48
|
+
},
|
|
49
|
+
skill: {
|
|
50
|
+
label: 'Skill',
|
|
51
|
+
icon: 'fa-wand-magic-sparkles',
|
|
52
|
+
color: 'text-green-400',
|
|
53
|
+
folder: 'skills/',
|
|
54
|
+
suffix: '/SKILL.md',
|
|
55
|
+
},
|
|
56
|
+
workflow: {
|
|
57
|
+
label: 'Workflow',
|
|
58
|
+
icon: 'fa-diagram-project',
|
|
59
|
+
color: 'text-orange-400',
|
|
60
|
+
folder: 'workflows/',
|
|
61
|
+
suffix: '.workflow.yaml',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
|
|
26
65
|
function getExtension(filename) {
|
|
27
66
|
const parts = filename.split('.');
|
|
28
67
|
return parts.length > 1 ? parts.pop().toLowerCase() : '';
|
|
29
68
|
}
|
|
30
69
|
|
|
70
|
+
function isAgentFile(path) {
|
|
71
|
+
return path && path.endsWith('.agent.yaml');
|
|
72
|
+
}
|
|
73
|
+
|
|
31
74
|
export class IdeView extends Component {
|
|
32
75
|
constructor() {
|
|
33
76
|
super();
|
|
@@ -36,28 +79,54 @@ export class IdeView extends Component {
|
|
|
36
79
|
this.isDirty = false;
|
|
37
80
|
this.treeData = [];
|
|
38
81
|
this.expandedDirs = new Set();
|
|
82
|
+
this._renamingPath = null;
|
|
83
|
+
this._viewMode = 'source'; // 'source' | 'visual'
|
|
39
84
|
this._handleKeyDown = this._handleKeyDown.bind(this);
|
|
85
|
+
this._handleDocClick = this._handleDocClick.bind(this);
|
|
40
86
|
}
|
|
41
87
|
|
|
42
88
|
disconnectedCallback() {
|
|
43
89
|
document.removeEventListener('keydown', this._handleKeyDown);
|
|
90
|
+
document.removeEventListener('click', this._handleDocClick);
|
|
44
91
|
if (this.editor) {
|
|
45
92
|
this.editor.destroy();
|
|
46
93
|
this.editor = null;
|
|
47
94
|
}
|
|
95
|
+
this._viewMode = 'source';
|
|
48
96
|
}
|
|
49
97
|
|
|
50
98
|
async postRender() {
|
|
51
99
|
document.addEventListener('keydown', this._handleKeyDown);
|
|
100
|
+
document.addEventListener('click', this._handleDocClick);
|
|
52
101
|
|
|
53
102
|
const saveBtn = this.querySelector('#saveBtn');
|
|
54
103
|
if (saveBtn) {
|
|
55
104
|
saveBtn.addEventListener('click', () => this._saveFile());
|
|
56
105
|
}
|
|
57
106
|
|
|
107
|
+
const newFileBtn = this.querySelector('#newFileBtn');
|
|
108
|
+
if (newFileBtn) {
|
|
109
|
+
newFileBtn.addEventListener('click', (e) => {
|
|
110
|
+
e.stopPropagation();
|
|
111
|
+
this._toggleDropdown();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
this._attachModeToggle();
|
|
58
116
|
await this._loadTree();
|
|
59
117
|
}
|
|
60
118
|
|
|
119
|
+
_handleDocClick(e) {
|
|
120
|
+
const dropdown = this.querySelector('#newResourceDropdown');
|
|
121
|
+
if (dropdown && !dropdown.contains(e.target) && !e.target.closest('#newFileBtn')) {
|
|
122
|
+
dropdown.remove();
|
|
123
|
+
}
|
|
124
|
+
const contextMenu = document.querySelector('#contextMenu');
|
|
125
|
+
if (contextMenu && !contextMenu.contains(e.target)) {
|
|
126
|
+
contextMenu.remove();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
61
130
|
_handleKeyDown(e) {
|
|
62
131
|
if ((e.ctrlKey || e.metaKey) && e.key === 's') {
|
|
63
132
|
e.preventDefault();
|
|
@@ -78,8 +147,24 @@ export class IdeView extends Component {
|
|
|
78
147
|
_renderTree() {
|
|
79
148
|
const container = this.querySelector('#fileTree');
|
|
80
149
|
if (!container) return;
|
|
150
|
+
|
|
81
151
|
container.innerHTML = this._buildTreeHTML(this.treeData, 0);
|
|
152
|
+
|
|
82
153
|
this._attachTreeListeners();
|
|
154
|
+
this._focusInlineInput();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
_buildRenameInputHTML(node, depth) {
|
|
158
|
+
const ext = getExtension(node.name);
|
|
159
|
+
const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
|
|
160
|
+
return `
|
|
161
|
+
<div class="tree-item tree-depth-${Math.min(depth, 5)} flex items-center gap-2 rounded text-sm text-gray-300">
|
|
162
|
+
<span class="w-3"></span>
|
|
163
|
+
<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
|
+
data-action="rename" data-path="${node.path}" value="${node.name}" />
|
|
166
|
+
</div>
|
|
167
|
+
`;
|
|
83
168
|
}
|
|
84
169
|
|
|
85
170
|
_buildTreeHTML(nodes, depth) {
|
|
@@ -87,40 +172,128 @@ export class IdeView extends Component {
|
|
|
87
172
|
if (node.type === 'directory') {
|
|
88
173
|
const isExpanded = this.expandedDirs.has(node.path);
|
|
89
174
|
const chevron = isExpanded ? 'fa-chevron-down' : 'fa-chevron-right';
|
|
175
|
+
|
|
90
176
|
const childrenHTML = isExpanded
|
|
91
177
|
? this._buildTreeHTML(node.children || [], depth + 1)
|
|
92
178
|
: '';
|
|
93
179
|
|
|
180
|
+
// Only show menu button for subfolders (depth > 0)
|
|
181
|
+
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
|
+
data-menu-path="${node.path}" data-menu-type="directory">
|
|
184
|
+
<i class="fas fa-ellipsis-v text-xs"></i>
|
|
185
|
+
</button>
|
|
186
|
+
` : '';
|
|
187
|
+
|
|
94
188
|
return `
|
|
95
|
-
<div class="tree-item tree-depth-${Math.min(depth, 5)} flex items-center gap-2 cursor-pointer hover:bg-dark-hover rounded text-sm text-gray-300"
|
|
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"
|
|
96
190
|
data-path="${node.path}" data-type="directory">
|
|
97
191
|
<i class="fas ${chevron} text-xs text-gray-500 w-3"></i>
|
|
98
192
|
<i class="fas fa-folder${isExpanded ? '-open' : ''} text-yellow-500 text-sm"></i>
|
|
99
|
-
<span>${node.name}</span>
|
|
193
|
+
<span class="flex-1 min-w-0">${node.name}</span>
|
|
194
|
+
${menuBtn}
|
|
100
195
|
</div>
|
|
101
196
|
${childrenHTML}
|
|
102
197
|
`;
|
|
103
198
|
}
|
|
104
199
|
|
|
200
|
+
// If this file is being renamed, show an inline input instead
|
|
201
|
+
if (this._renamingPath === node.path) {
|
|
202
|
+
return this._buildRenameInputHTML(node, depth);
|
|
203
|
+
}
|
|
204
|
+
|
|
105
205
|
const ext = getExtension(node.name);
|
|
106
206
|
const iconInfo = FILE_ICONS[ext] || FILE_ICONS.default;
|
|
107
207
|
const isActive = this.currentFile && this.currentFile.path === node.path;
|
|
108
208
|
const activeClass = isActive ? 'bg-dark-hover text-white' : '';
|
|
109
209
|
|
|
110
210
|
return `
|
|
111
|
-
<div class="tree-item 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 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}"
|
|
112
212
|
data-path="${node.path}" data-type="file">
|
|
113
213
|
<span class="w-3"></span>
|
|
114
214
|
<i class="fas ${iconInfo.icon} ${iconInfo.color} text-sm"></i>
|
|
115
|
-
<span class="truncate
|
|
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"
|
|
217
|
+
data-menu-path="${node.path}" data-menu-type="file">
|
|
218
|
+
<i class="fas fa-ellipsis-v text-xs"></i>
|
|
219
|
+
</button>
|
|
116
220
|
</div>
|
|
117
221
|
`;
|
|
118
222
|
}).join('');
|
|
119
223
|
}
|
|
120
224
|
|
|
225
|
+
_focusInlineInput() {
|
|
226
|
+
const input = this.querySelector('.inline-tree-input');
|
|
227
|
+
if (!input) return;
|
|
228
|
+
|
|
229
|
+
requestAnimationFrame(() => {
|
|
230
|
+
input.focus();
|
|
231
|
+
// Select the name portion (before extension) for rename inputs
|
|
232
|
+
if (input.dataset.action === 'rename') {
|
|
233
|
+
const val = input.value;
|
|
234
|
+
const dotIdx = val.lastIndexOf('.');
|
|
235
|
+
input.setSelectionRange(0, dotIdx > 0 ? dotIdx : val.length);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
input.addEventListener('keydown', (e) => {
|
|
240
|
+
e.stopPropagation();
|
|
241
|
+
if (e.key === 'Enter') {
|
|
242
|
+
e.preventDefault();
|
|
243
|
+
this._commitInlineInput(input);
|
|
244
|
+
} else if (e.key === 'Escape') {
|
|
245
|
+
e.preventDefault();
|
|
246
|
+
this._cancelInlineInput();
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
input.addEventListener('blur', () => {
|
|
251
|
+
// Small delay to allow click-away to cancel rather than commit
|
|
252
|
+
setTimeout(() => {
|
|
253
|
+
if (this._renamingPath !== null) {
|
|
254
|
+
this._cancelInlineInput();
|
|
255
|
+
}
|
|
256
|
+
}, 150);
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
_cancelInlineInput() {
|
|
261
|
+
this._renamingPath = null;
|
|
262
|
+
this._renderTree();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
async _commitInlineInput(input) {
|
|
266
|
+
const value = input.value.trim();
|
|
267
|
+
if (!value) {
|
|
268
|
+
this._cancelInlineInput();
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (input.dataset.action === 'rename') {
|
|
273
|
+
const oldPath = input.dataset.path;
|
|
274
|
+
const oldName = oldPath.split('/').pop();
|
|
275
|
+
if (value === oldName) {
|
|
276
|
+
this._cancelInlineInput();
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const parentDir = oldPath.includes('/') ? oldPath.substring(0, oldPath.lastIndexOf('/')) : '';
|
|
280
|
+
const newPath = parentDir ? `${parentDir}/${value}` : value;
|
|
281
|
+
this._renamingPath = null;
|
|
282
|
+
await this._renameFile(oldPath, newPath);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
121
286
|
_attachTreeListeners() {
|
|
122
287
|
this.querySelectorAll('.tree-item').forEach(item => {
|
|
123
|
-
item.
|
|
288
|
+
if (!item.dataset.path) return;
|
|
289
|
+
|
|
290
|
+
item.addEventListener('click', (e) => {
|
|
291
|
+
// Ignore clicks on the menu button
|
|
292
|
+
if (e.target.closest('.tree-menu-btn')) return;
|
|
293
|
+
|
|
294
|
+
// Close any open context menu
|
|
295
|
+
this._closeContextMenu();
|
|
296
|
+
|
|
124
297
|
const filePath = item.dataset.path;
|
|
125
298
|
const type = item.dataset.type;
|
|
126
299
|
|
|
@@ -131,6 +304,115 @@ export class IdeView extends Component {
|
|
|
131
304
|
}
|
|
132
305
|
});
|
|
133
306
|
});
|
|
307
|
+
|
|
308
|
+
// Menu button clicks
|
|
309
|
+
this.querySelectorAll('.tree-menu-btn').forEach(btn => {
|
|
310
|
+
btn.addEventListener('click', (e) => {
|
|
311
|
+
e.stopPropagation();
|
|
312
|
+
const filePath = btn.dataset.menuPath;
|
|
313
|
+
const type = btn.dataset.menuType;
|
|
314
|
+
this._showContextMenu(e, filePath, type);
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
_closeContextMenu() {
|
|
320
|
+
const menu = document.querySelector('#contextMenu');
|
|
321
|
+
if (menu) menu.remove();
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
_showContextMenu(e, filePath, type) {
|
|
325
|
+
// Remove existing context menu
|
|
326
|
+
this._closeContextMenu();
|
|
327
|
+
|
|
328
|
+
const btn = e.currentTarget;
|
|
329
|
+
const btnRect = btn.getBoundingClientRect();
|
|
330
|
+
|
|
331
|
+
const menu = document.createElement('div');
|
|
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]';
|
|
334
|
+
|
|
335
|
+
const isFile = type === 'file';
|
|
336
|
+
|
|
337
|
+
menu.innerHTML = `
|
|
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>
|
|
341
|
+
<span>Rename</span>
|
|
342
|
+
</div>
|
|
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>
|
|
346
|
+
<span>Delete</span>
|
|
347
|
+
</div>
|
|
348
|
+
`;
|
|
349
|
+
|
|
350
|
+
document.body.appendChild(menu);
|
|
351
|
+
|
|
352
|
+
// Position after render to get correct dimensions
|
|
353
|
+
requestAnimationFrame(() => {
|
|
354
|
+
const menuRect = menu.getBoundingClientRect();
|
|
355
|
+
let left = btnRect.right + 4;
|
|
356
|
+
let top = btnRect.top;
|
|
357
|
+
|
|
358
|
+
// Adjust if menu goes off-screen
|
|
359
|
+
if (left + menuRect.width > window.innerWidth) {
|
|
360
|
+
left = btnRect.left - menuRect.width - 4;
|
|
361
|
+
}
|
|
362
|
+
if (top + menuRect.height > window.innerHeight) {
|
|
363
|
+
top = window.innerHeight - menuRect.height - 8;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
menu.style.left = `${left}px`;
|
|
367
|
+
menu.style.top = `${top}px`;
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
menu.querySelectorAll('.context-item').forEach(item => {
|
|
371
|
+
item.addEventListener('click', () => {
|
|
372
|
+
const action = item.dataset.action;
|
|
373
|
+
menu.remove();
|
|
374
|
+
if (action === 'rename') {
|
|
375
|
+
this._startRename(filePath);
|
|
376
|
+
} else if (action === 'delete') {
|
|
377
|
+
this._confirmDelete(filePath, type);
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
_confirmDelete(filePath, type) {
|
|
384
|
+
const name = filePath.split('/').pop();
|
|
385
|
+
const isDir = type === 'directory';
|
|
386
|
+
const msg = isDir
|
|
387
|
+
? `Delete folder "${name}" and all its contents?`
|
|
388
|
+
: `Delete "${name}"?`;
|
|
389
|
+
|
|
390
|
+
if (!confirm(msg)) return;
|
|
391
|
+
this._deleteFile(filePath);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
async _deleteFile(filePath) {
|
|
395
|
+
try {
|
|
396
|
+
const result = await api.deleteFile(filePath);
|
|
397
|
+
if (result.error) {
|
|
398
|
+
alert(result.error);
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// If the deleted file was open, clear the editor
|
|
403
|
+
if (this.currentFile && this.currentFile.path === filePath) {
|
|
404
|
+
this.currentFile = null;
|
|
405
|
+
this.isDirty = false;
|
|
406
|
+
this._viewMode = 'source';
|
|
407
|
+
this._renderEditor();
|
|
408
|
+
this._updateModeToggle();
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
await this._loadTree();
|
|
412
|
+
} catch (err) {
|
|
413
|
+
console.error('Failed to delete file:', err);
|
|
414
|
+
alert('Failed to delete file.');
|
|
415
|
+
}
|
|
134
416
|
}
|
|
135
417
|
|
|
136
418
|
_toggleDir(dirPath) {
|
|
@@ -142,6 +424,186 @@ export class IdeView extends Component {
|
|
|
142
424
|
this._renderTree();
|
|
143
425
|
}
|
|
144
426
|
|
|
427
|
+
_toggleDropdown() {
|
|
428
|
+
const existing = this.querySelector('#newResourceDropdown');
|
|
429
|
+
if (existing) {
|
|
430
|
+
existing.remove();
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const btn = this.querySelector('#newFileBtn');
|
|
435
|
+
if (!btn) return;
|
|
436
|
+
|
|
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"
|
|
439
|
+
data-resource="${key}">
|
|
440
|
+
<i class="fas ${rt.icon} ${rt.color} text-xs w-4 text-center"></i>
|
|
441
|
+
<span>${rt.label}</span>
|
|
442
|
+
</div>
|
|
443
|
+
`).join('');
|
|
444
|
+
|
|
445
|
+
const dropdown = document.createElement('div');
|
|
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]';
|
|
448
|
+
dropdown.innerHTML = items;
|
|
449
|
+
|
|
450
|
+
btn.parentElement.classList.add('relative');
|
|
451
|
+
btn.parentElement.appendChild(dropdown);
|
|
452
|
+
|
|
453
|
+
dropdown.querySelectorAll('.new-resource-item').forEach(item => {
|
|
454
|
+
item.addEventListener('click', (e) => {
|
|
455
|
+
e.stopPropagation();
|
|
456
|
+
const type = item.dataset.resource;
|
|
457
|
+
dropdown.remove();
|
|
458
|
+
this._selectResourceType(type);
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
_selectResourceType(type) {
|
|
464
|
+
this._showCreateModal(type);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
_showCreateModal(type) {
|
|
468
|
+
// Remove existing modal if any
|
|
469
|
+
const existing = this.querySelector('#createResourceModal');
|
|
470
|
+
if (existing) existing.remove();
|
|
471
|
+
|
|
472
|
+
const rt = RESOURCE_TYPES[type];
|
|
473
|
+
const modal = document.createElement('div');
|
|
474
|
+
modal.id = 'createResourceModal';
|
|
475
|
+
modal.className = 'fixed inset-0 z-50 flex items-center justify-center';
|
|
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">
|
|
480
|
+
<i class="fas ${rt.icon} ${rt.color}"></i>
|
|
481
|
+
<span class="text-white font-medium">New ${rt.label}</span>
|
|
482
|
+
</div>
|
|
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>
|
|
487
|
+
<input type="text" id="resourceNameInput"
|
|
488
|
+
class="flex-1 px-3 py-2 bg-transparent text-white text-sm outline-none"
|
|
489
|
+
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>
|
|
491
|
+
</div>
|
|
492
|
+
<p class="text-xs text-gray-500 mt-2">Use lowercase letters, numbers, and hyphens</p>
|
|
493
|
+
</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>
|
|
501
|
+
</div>
|
|
502
|
+
</div>
|
|
503
|
+
`;
|
|
504
|
+
|
|
505
|
+
this.appendChild(modal);
|
|
506
|
+
|
|
507
|
+
const input = modal.querySelector('#resourceNameInput');
|
|
508
|
+
const createBtn = modal.querySelector('[data-action="create"]');
|
|
509
|
+
const cancelBtns = modal.querySelectorAll('[data-action="cancel"]');
|
|
510
|
+
|
|
511
|
+
input.focus();
|
|
512
|
+
|
|
513
|
+
const close = () => modal.remove();
|
|
514
|
+
|
|
515
|
+
const create = async () => {
|
|
516
|
+
const name = input.value.trim();
|
|
517
|
+
if (!name) return;
|
|
518
|
+
close();
|
|
519
|
+
await this._createResourceFromTemplate(type, name);
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
input.addEventListener('keydown', (e) => {
|
|
523
|
+
if (e.key === 'Enter') {
|
|
524
|
+
e.preventDefault();
|
|
525
|
+
create();
|
|
526
|
+
} else if (e.key === 'Escape') {
|
|
527
|
+
e.preventDefault();
|
|
528
|
+
close();
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
createBtn.addEventListener('click', create);
|
|
533
|
+
cancelBtns.forEach(btn => btn.addEventListener('click', close));
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
_startRename(filePath) {
|
|
537
|
+
this._renamingPath = filePath;
|
|
538
|
+
this._renderTree();
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
async _createResourceFromTemplate(type, name) {
|
|
542
|
+
try {
|
|
543
|
+
const template = await api.getResourceTemplate(type, name);
|
|
544
|
+
if (template.error) {
|
|
545
|
+
alert(template.error);
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
const result = await api.createFile(template.path, template.content);
|
|
550
|
+
if (result.error) {
|
|
551
|
+
alert(result.error);
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// Expand the parent directory of the new file
|
|
556
|
+
const parts = template.path.split('/');
|
|
557
|
+
if (parts.length > 1) {
|
|
558
|
+
parts.pop();
|
|
559
|
+
this.expandedDirs.add(parts.join('/'));
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
await this._loadTree();
|
|
563
|
+
await this._openFile(template.path);
|
|
564
|
+
} catch (err) {
|
|
565
|
+
console.error('Failed to create resource:', err);
|
|
566
|
+
alert('Failed to create resource.');
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
async _createFile(filePath, content = '') {
|
|
571
|
+
try {
|
|
572
|
+
const result = await api.createFile(filePath, content);
|
|
573
|
+
if (result.error) {
|
|
574
|
+
alert(result.error);
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
await this._loadTree();
|
|
578
|
+
await this._openFile(filePath);
|
|
579
|
+
} catch (err) {
|
|
580
|
+
console.error('Failed to create file:', err);
|
|
581
|
+
alert('Failed to create file.');
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
async _renameFile(oldPath, newPath) {
|
|
586
|
+
try {
|
|
587
|
+
const result = await api.renameFile(oldPath, newPath);
|
|
588
|
+
if (result.error) {
|
|
589
|
+
alert(result.error);
|
|
590
|
+
this._renderTree();
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// If the renamed file was currently open, update the reference
|
|
595
|
+
if (this.currentFile && this.currentFile.path === oldPath) {
|
|
596
|
+
this.currentFile.path = newPath;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
await this._loadTree();
|
|
600
|
+
} catch (err) {
|
|
601
|
+
console.error('Failed to rename file:', err);
|
|
602
|
+
alert('Failed to rename file.');
|
|
603
|
+
this._renderTree();
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
145
607
|
async _openFile(filePath) {
|
|
146
608
|
if (this.isDirty) {
|
|
147
609
|
const confirmed = confirm('You have unsaved changes. Discard and open another file?');
|
|
@@ -152,8 +614,10 @@ export class IdeView extends Component {
|
|
|
152
614
|
const data = await api.readFile(filePath);
|
|
153
615
|
this.currentFile = { path: data.path, content: data.content };
|
|
154
616
|
this.isDirty = false;
|
|
617
|
+
this._viewMode = 'source';
|
|
155
618
|
this._renderEditor();
|
|
156
619
|
this._renderTree();
|
|
620
|
+
this._updateModeToggle();
|
|
157
621
|
} catch (err) {
|
|
158
622
|
console.error('Failed to read file:', err);
|
|
159
623
|
}
|
|
@@ -161,19 +625,18 @@ export class IdeView extends Component {
|
|
|
161
625
|
|
|
162
626
|
_renderEditor() {
|
|
163
627
|
const editorContainer = this.querySelector('#editorContainer');
|
|
628
|
+
const composerContainer = this.querySelector('#composerContainer');
|
|
164
629
|
const welcomePanel = this.querySelector('#welcomePanel');
|
|
165
630
|
const breadcrumb = this.querySelector('#breadcrumb');
|
|
166
|
-
const saveBtn = this.querySelector('#saveBtn');
|
|
167
|
-
const dirtyIndicator = this.querySelector('#dirtyIndicator');
|
|
168
631
|
|
|
169
632
|
if (!this.currentFile) {
|
|
170
633
|
if (welcomePanel) welcomePanel.classList.remove('hidden');
|
|
171
634
|
if (editorContainer) editorContainer.classList.add('hidden');
|
|
635
|
+
if (composerContainer) composerContainer.classList.add('hidden');
|
|
172
636
|
return;
|
|
173
637
|
}
|
|
174
638
|
|
|
175
639
|
if (welcomePanel) welcomePanel.classList.add('hidden');
|
|
176
|
-
if (editorContainer) editorContainer.classList.remove('hidden');
|
|
177
640
|
|
|
178
641
|
// Update breadcrumb
|
|
179
642
|
if (breadcrumb) {
|
|
@@ -184,6 +647,16 @@ export class IdeView extends Component {
|
|
|
184
647
|
// Update dirty state
|
|
185
648
|
this._updateDirtyState();
|
|
186
649
|
|
|
650
|
+
if (this._viewMode === 'visual') {
|
|
651
|
+
if (editorContainer) editorContainer.classList.add('hidden');
|
|
652
|
+
if (composerContainer) composerContainer.classList.remove('hidden');
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// Source mode
|
|
657
|
+
if (composerContainer) composerContainer.classList.add('hidden');
|
|
658
|
+
if (editorContainer) editorContainer.classList.remove('hidden');
|
|
659
|
+
|
|
187
660
|
// Initialize or update Ace
|
|
188
661
|
const aceEl = this.querySelector('#aceEditor');
|
|
189
662
|
if (!aceEl) return;
|
|
@@ -238,9 +711,18 @@ export class IdeView extends Component {
|
|
|
238
711
|
}
|
|
239
712
|
|
|
240
713
|
async _saveFile() {
|
|
241
|
-
if (!this.currentFile || !this.isDirty
|
|
242
|
-
|
|
243
|
-
|
|
714
|
+
if (!this.currentFile || !this.isDirty) return;
|
|
715
|
+
|
|
716
|
+
let content;
|
|
717
|
+
if (this._viewMode === 'visual') {
|
|
718
|
+
const composer = this.querySelector('agent-composer');
|
|
719
|
+
if (!composer) return;
|
|
720
|
+
const data = composer.getData();
|
|
721
|
+
content = jsyaml.dump(data, { indent: 2, lineWidth: -1, noRefs: true, sortKeys: false });
|
|
722
|
+
} else {
|
|
723
|
+
if (!this.editor) return;
|
|
724
|
+
content = this.editor.getValue();
|
|
725
|
+
}
|
|
244
726
|
|
|
245
727
|
try {
|
|
246
728
|
const result = await api.writeFile(this.currentFile.path, content);
|
|
@@ -274,6 +756,122 @@ export class IdeView extends Component {
|
|
|
274
756
|
}
|
|
275
757
|
}
|
|
276
758
|
|
|
759
|
+
// ── Mode Toggle ──
|
|
760
|
+
|
|
761
|
+
_attachModeToggle() {
|
|
762
|
+
this.querySelectorAll('.mode-toggle-btn').forEach(btn => {
|
|
763
|
+
btn.addEventListener('click', () => {
|
|
764
|
+
const mode = btn.dataset.mode;
|
|
765
|
+
if (mode === this._viewMode) return;
|
|
766
|
+
if (mode === 'visual') this._switchToVisual();
|
|
767
|
+
else this._switchToSource();
|
|
768
|
+
});
|
|
769
|
+
});
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
_updateModeToggle() {
|
|
773
|
+
const toggle = this.querySelector('#modeToggle');
|
|
774
|
+
if (!toggle) return;
|
|
775
|
+
|
|
776
|
+
const show = this.currentFile && isAgentFile(this.currentFile.path);
|
|
777
|
+
toggle.classList.toggle('hidden', !show);
|
|
778
|
+
|
|
779
|
+
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);
|
|
784
|
+
});
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
_switchToVisual() {
|
|
788
|
+
if (!this.currentFile) return;
|
|
789
|
+
|
|
790
|
+
// Get current Ace content and parse
|
|
791
|
+
const content = this.editor ? this.editor.getValue() : this.currentFile.content;
|
|
792
|
+
let parsed;
|
|
793
|
+
try {
|
|
794
|
+
parsed = jsyaml.load(content);
|
|
795
|
+
} catch (err) {
|
|
796
|
+
this._showToast(`Invalid YAML: ${err.message}`, 'error');
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
801
|
+
this._showToast('YAML must be an object', 'error');
|
|
802
|
+
return;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
this._viewMode = 'visual';
|
|
806
|
+
this._updateModeToggle();
|
|
807
|
+
|
|
808
|
+
// Hide Ace, show composer
|
|
809
|
+
const editorContainer = this.querySelector('#editorContainer');
|
|
810
|
+
const composerContainer = this.querySelector('#composerContainer');
|
|
811
|
+
if (editorContainer) editorContainer.classList.add('hidden');
|
|
812
|
+
if (composerContainer) composerContainer.classList.remove('hidden');
|
|
813
|
+
|
|
814
|
+
// Create or get the composer element
|
|
815
|
+
let composer = composerContainer.querySelector('agent-composer');
|
|
816
|
+
if (!composer) {
|
|
817
|
+
composer = document.createElement('agent-composer');
|
|
818
|
+
composer.classList.add('block', 'h-full');
|
|
819
|
+
composerContainer.appendChild(composer);
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
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
|
+
});
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
_switchToSource() {
|
|
834
|
+
if (!this.currentFile) return;
|
|
835
|
+
|
|
836
|
+
const composer = this.querySelector('agent-composer');
|
|
837
|
+
if (composer && this._viewMode === 'visual') {
|
|
838
|
+
const data = composer.getData();
|
|
839
|
+
const yaml = jsyaml.dump(data, { indent: 2, lineWidth: -1, noRefs: true, sortKeys: false });
|
|
840
|
+
|
|
841
|
+
// Update Ace content
|
|
842
|
+
if (this.editor) {
|
|
843
|
+
this.editor.setValue(yaml, -1);
|
|
844
|
+
}
|
|
845
|
+
this.currentFile.content = yaml;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
this._viewMode = 'source';
|
|
849
|
+
this._updateModeToggle();
|
|
850
|
+
|
|
851
|
+
const editorContainer = this.querySelector('#editorContainer');
|
|
852
|
+
const composerContainer = this.querySelector('#composerContainer');
|
|
853
|
+
if (composerContainer) composerContainer.classList.add('hidden');
|
|
854
|
+
if (editorContainer) editorContainer.classList.remove('hidden');
|
|
855
|
+
|
|
856
|
+
if (this.editor) {
|
|
857
|
+
this.editor.resize();
|
|
858
|
+
this.editor.focus();
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
_showToast(message, type = 'info') {
|
|
863
|
+
const existing = document.querySelector('#ideToast');
|
|
864
|
+
if (existing) existing.remove();
|
|
865
|
+
|
|
866
|
+
const toast = document.createElement('div');
|
|
867
|
+
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`;
|
|
870
|
+
toast.textContent = message;
|
|
871
|
+
document.body.appendChild(toast);
|
|
872
|
+
setTimeout(() => toast.remove(), 4000);
|
|
873
|
+
}
|
|
874
|
+
|
|
277
875
|
template() {
|
|
278
876
|
return `
|
|
279
877
|
<div class="flex flex-col h-full">
|
|
@@ -284,6 +882,15 @@ export class IdeView extends Component {
|
|
|
284
882
|
<span id="breadcrumb">Select a file to edit</span>
|
|
285
883
|
</div>
|
|
286
884
|
<div class="flex items-center gap-3">
|
|
885
|
+
<!-- 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">
|
|
888
|
+
<i class="fas fa-code mr-1"></i>Source
|
|
889
|
+
</button>
|
|
890
|
+
<button class="mode-toggle-btn px-2.5 py-1 text-xs transition-colors text-gray-500" data-mode="visual">
|
|
891
|
+
<i class="fas fa-palette mr-1"></i>Visual
|
|
892
|
+
</button>
|
|
893
|
+
</div>
|
|
287
894
|
<span id="dirtyIndicator" class="hidden text-yellow-400 text-xs flex items-center gap-1">
|
|
288
895
|
<i class="fas fa-circle text-[6px]"></i> Unsaved
|
|
289
896
|
</span>
|
|
@@ -298,8 +905,11 @@ export class IdeView extends Component {
|
|
|
298
905
|
<div class="flex flex-1 min-h-0 border border-t-0 border-dark-border rounded-b-lg overflow-hidden">
|
|
299
906
|
<!-- File tree sidebar -->
|
|
300
907
|
<div class="w-60 flex-shrink-0 bg-dark-surface border-r border-dark-border overflow-y-auto">
|
|
301
|
-
<div class="px-3 py-2 text-xs font-semibold text-gray-500 uppercase tracking-wider border-b border-dark-border">
|
|
302
|
-
Explorer
|
|
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">
|
|
909
|
+
<span>Explorer</span>
|
|
910
|
+
<button id="newFileBtn" class="text-gray-500 hover:text-green-400 transition-colors" title="New Resource">
|
|
911
|
+
<i class="fas fa-plus text-xs"></i>
|
|
912
|
+
</button>
|
|
303
913
|
</div>
|
|
304
914
|
<div id="fileTree" class="py-1">
|
|
305
915
|
<div class="px-4 py-8 text-center text-gray-500 text-sm">
|
|
@@ -308,7 +918,7 @@ export class IdeView extends Component {
|
|
|
308
918
|
</div>
|
|
309
919
|
</div>
|
|
310
920
|
|
|
311
|
-
<!-- Editor / Welcome -->
|
|
921
|
+
<!-- Editor / Composer / Welcome -->
|
|
312
922
|
<div class="flex-1 min-w-0 relative">
|
|
313
923
|
<div id="welcomePanel" class="flex items-center justify-center h-full text-gray-500">
|
|
314
924
|
<div class="text-center">
|
|
@@ -320,6 +930,7 @@ export class IdeView extends Component {
|
|
|
320
930
|
<div id="editorContainer" class="hidden h-full">
|
|
321
931
|
<div id="aceEditor" class="h-full w-full"></div>
|
|
322
932
|
</div>
|
|
933
|
+
<div id="composerContainer" class="hidden h-full overflow-hidden"></div>
|
|
323
934
|
</div>
|
|
324
935
|
</div>
|
|
325
936
|
</div>
|