@zythum02/fello-server 0.1.28 → 0.1.29
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/out/renderer/assets/{_baseUniq-C01H-TTl.js → _baseUniq-BApwm7pv.js} +1 -1
- package/out/renderer/assets/{arc-BXqrFYj-.js → arc-yKenDsmO.js} +1 -1
- package/out/renderer/assets/{architectureDiagram-Q4EWVU46-DlFz_4yO.js → architectureDiagram-Q4EWVU46-C31yFVWH.js} +5 -5
- package/out/renderer/assets/{blockDiagram-DXYQGD6D-B_jYpKkP.js → blockDiagram-DXYQGD6D-6liCvTXv.js} +6 -6
- package/out/renderer/assets/{c4Diagram-AHTNJAMY-DWRXz6-S.js → c4Diagram-AHTNJAMY-Co_b_6bH.js} +2 -2
- package/out/renderer/assets/{channel-iMh-jYBg.js → channel-Dc_jjyUr.js} +1 -1
- package/out/renderer/assets/{chunk-4BX2VUAB-CDXuLHIo.js → chunk-4BX2VUAB-Cg18SQei.js} +1 -1
- package/out/renderer/assets/{chunk-4TB4RGXK-Bs-z-5kA.js → chunk-4TB4RGXK-CvSqwINq.js} +5 -5
- package/out/renderer/assets/{chunk-55IACEB6-DBmLw2WJ.js → chunk-55IACEB6-CfBiPWtx.js} +1 -1
- package/out/renderer/assets/{chunk-EDXVE4YY-BhsDT27O.js → chunk-EDXVE4YY-DMjVfNdS.js} +1 -1
- package/out/renderer/assets/{chunk-FMBD7UC4-C_qJYK5q.js → chunk-FMBD7UC4-BbpFqyFG.js} +1 -1
- package/out/renderer/assets/{chunk-OYMX7WX6-DIh7s3uw.js → chunk-OYMX7WX6-Cf724x--.js} +3 -3
- package/out/renderer/assets/{chunk-QZHKN3VN-CYa45CSJ.js → chunk-QZHKN3VN-4ZNIwknr.js} +1 -1
- package/out/renderer/assets/{chunk-YZCP3GAM-BeF07Xv_.js → chunk-YZCP3GAM-D1j7xGGR.js} +1 -1
- package/out/renderer/assets/{classDiagram-6PBFFD2Q-B12_6ldG.js → classDiagram-6PBFFD2Q-OFMeoPav.js} +6 -6
- package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-B12_6ldG.js → classDiagram-v2-HSJHXN6E-OFMeoPav.js} +6 -6
- package/out/renderer/assets/{clone-1GZJZPn3.js → clone-Cm3RO2Zl.js} +1 -1
- package/out/renderer/assets/{cose-bilkent-S5V4N54A-CuSnz9Ro.js → cose-bilkent-S5V4N54A-lCfWcP6y.js} +1 -1
- package/out/renderer/assets/{dagre-KV5264BT-LHPLEy9g.js → dagre-KV5264BT-4I0h4wyh.js} +6 -6
- package/out/renderer/assets/{diagram-5BDNPKRD-DWjP3Jzr.js → diagram-5BDNPKRD-C1mEpAlt.js} +6 -6
- package/out/renderer/assets/{diagram-G4DWMVQ6-CM3uASto.js → diagram-G4DWMVQ6-C_g_DZm9.js} +6 -6
- package/out/renderer/assets/{diagram-MMDJMWI5-X5oh5RON.js → diagram-MMDJMWI5-Di6wZV6-.js} +5 -5
- package/out/renderer/assets/{diagram-TYMM5635-iO4Xohj9.js → diagram-TYMM5635-aF8hIDx1.js} +5 -5
- package/out/renderer/assets/{erDiagram-SMLLAGMA-4xwE7Ysd.js → erDiagram-SMLLAGMA-Bk9QFZ27.js} +4 -4
- package/out/renderer/assets/{flowDiagram-DWJPFMVM-DoIqEJWm.js → flowDiagram-DWJPFMVM-Dfg0LLup.js} +6 -6
- package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-C48vXSUK.js → ganttDiagram-T4ZO3ILL-lTjaJTs0.js} +2 -2
- package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-D3YiiEhK.js → gitGraphDiagram-UUTBAWPF-C74WBszH.js} +6 -6
- package/out/renderer/assets/{graph-CYPfPCZi.js → graph-DGEX1eV1.js} +2 -2
- package/out/renderer/assets/{highlighted-body-OFNGDK62-B6M-kMLU.js → highlighted-body-OFNGDK62-DQWoSdTY.js} +1 -1
- package/out/renderer/assets/{index-Dabo17L1.js → index-BZzw3jIU.js} +1506 -244
- package/out/renderer/assets/index-Cv3lJTlc.css +382 -0
- package/out/renderer/assets/{infoDiagram-42DDH7IO-ur7rRidE.js → infoDiagram-42DDH7IO-CR4ZLAM1.js} +4 -4
- package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-fJSipMV8.js → ishikawaDiagram-UXIWVN3A-uXL-4FGw.js} +1 -1
- package/out/renderer/assets/{journeyDiagram-VCZTEJTY-TxjKxXBo.js → journeyDiagram-VCZTEJTY-Ds2OL3Lo.js} +4 -4
- package/out/renderer/assets/{kanban-definition-6JOO6SKY-DJwjRjlE.js → kanban-definition-6JOO6SKY-CZ1CZVyP.js} +2 -2
- package/out/renderer/assets/{layout-BT1ASsLg.js → layout-CNGveWdi.js} +4 -4
- package/out/renderer/assets/{linear-ecuEcPGt.js → linear-CnHAiAJ3.js} +1 -1
- package/out/renderer/assets/{min-BYCDJeWK.js → min-D63AfN0e.js} +2 -2
- package/out/renderer/assets/{mindmap-definition-QFDTVHPH-D2MxZmzw.js → mindmap-definition-QFDTVHPH-C3U3xkIJ.js} +3 -3
- package/out/renderer/assets/{pieDiagram-DEJITSTG-Cew7QWxE.js → pieDiagram-DEJITSTG-C8AxK_-F.js} +6 -6
- package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-CrZCtVJh.js → quadrantDiagram-34T5L4WZ-BdiZmi7w.js} +2 -2
- package/out/renderer/assets/{requirementDiagram-MS252O5E-C69IGxW8.js → requirementDiagram-MS252O5E-BHIfl5Tz.js} +3 -3
- package/out/renderer/assets/{sankeyDiagram-XADWPNL6-B2tuS_nG.js → sankeyDiagram-XADWPNL6-SthTR8cL.js} +1 -1
- package/out/renderer/assets/{sequenceDiagram-FGHM5R23-Dv_lOZN1.js → sequenceDiagram-FGHM5R23-COKEbCYM.js} +3 -3
- package/out/renderer/assets/{stateDiagram-FHFEXIEX-D9dJAqtV.js → stateDiagram-FHFEXIEX-7zRGBf7O.js} +8 -8
- package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-CQXoaDY1.js → stateDiagram-v2-QKLJ7IA2-BqHJ_ZBX.js} +4 -4
- package/out/renderer/assets/{timeline-definition-GMOUNBTQ-DnnX0Ml0.js → timeline-definition-GMOUNBTQ-AvZAT5J-.js} +2 -2
- package/out/renderer/assets/{vennDiagram-DHZGUBPP-BCIC8HTk.js → vennDiagram-DHZGUBPP-oSTndBDY.js} +1 -1
- package/out/renderer/assets/{wardley-RL74JXVD-B35jxdMa.js → wardley-RL74JXVD-C8hIuf19.js} +3 -3
- package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-D3rjXear.js → wardleyDiagram-NUSXRM2D-Dv2kSOMM.js} +5 -5
- package/out/renderer/assets/{xychartDiagram-5P7HB3ND-095YR9W9.js → xychartDiagram-5P7HB3ND-J9z4uuMK.js} +2 -2
- package/out/renderer/index.html +2 -2
- package/out/server/main.js +695 -159
- package/package.json +3 -1
- package/out/renderer/assets/index-D8H7Q_md.css +0 -382
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./dagre-KV5264BT-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./dagre-KV5264BT-4I0h4wyh.js","./graph-DGEX1eV1.js","./_baseUniq-BApwm7pv.js","./layout-CNGveWdi.js","./min-D63AfN0e.js","./clone-Cm3RO2Zl.js","./cose-bilkent-S5V4N54A-lCfWcP6y.js","./cytoscape.esm-Bm8DJGmZ.js","./c4Diagram-AHTNJAMY-Co_b_6bH.js","./chunk-YZCP3GAM-D1j7xGGR.js","./flowDiagram-DWJPFMVM-Dfg0LLup.js","./chunk-FMBD7UC4-BbpFqyFG.js","./chunk-55IACEB6-CfBiPWtx.js","./chunk-EDXVE4YY-DMjVfNdS.js","./channel-Dc_jjyUr.js","./erDiagram-SMLLAGMA-Bk9QFZ27.js","./gitGraphDiagram-UUTBAWPF-C74WBszH.js","./chunk-4BX2VUAB-Cg18SQei.js","./chunk-QZHKN3VN-4ZNIwknr.js","./wardley-RL74JXVD-C8hIuf19.js","./ganttDiagram-T4ZO3ILL-lTjaJTs0.js","./linear-CnHAiAJ3.js","./init-ZxktEp_H.js","./defaultLocale-B2RvLBDe.js","./infoDiagram-42DDH7IO-CR4ZLAM1.js","./pieDiagram-DEJITSTG-C8AxK_-F.js","./arc-yKenDsmO.js","./ordinal-CxptdPJm.js","./quadrantDiagram-34T5L4WZ-BdiZmi7w.js","./xychartDiagram-5P7HB3ND-J9z4uuMK.js","./requirementDiagram-MS252O5E-BHIfl5Tz.js","./sequenceDiagram-FGHM5R23-COKEbCYM.js","./classDiagram-6PBFFD2Q-OFMeoPav.js","./chunk-4TB4RGXK-CvSqwINq.js","./classDiagram-v2-HSJHXN6E-OFMeoPav.js","./stateDiagram-FHFEXIEX-7zRGBf7O.js","./chunk-OYMX7WX6-Cf724x--.js","./stateDiagram-v2-QKLJ7IA2-BqHJ_ZBX.js","./journeyDiagram-VCZTEJTY-Ds2OL3Lo.js","./timeline-definition-GMOUNBTQ-AvZAT5J-.js","./mindmap-definition-QFDTVHPH-C3U3xkIJ.js","./kanban-definition-6JOO6SKY-CZ1CZVyP.js","./sankeyDiagram-XADWPNL6-SthTR8cL.js","./diagram-TYMM5635-aF8hIDx1.js","./diagram-MMDJMWI5-Di6wZV6-.js","./blockDiagram-DXYQGD6D-6liCvTXv.js","./diagram-5BDNPKRD-C1mEpAlt.js","./architectureDiagram-Q4EWVU46-C31yFVWH.js","./diagram-G4DWMVQ6-C_g_DZm9.js","./wardleyDiagram-NUSXRM2D-Dv2kSOMM.js","./angular-html-BYG42TJr.js","./html-GC16tDh9.js","./javascript-BsAkV7mL.js","./css-BtVcDqlU.js","./angular-ts-BftcHvZ6.js","./scss-Dq-LbI_c.js","./apl-CGZawg-A.js","./xml-BMzZeaqs.js","./java-BfXh-0uJ.js","./json-TjWBGEk1.js","./astro-BxdWOZvM.js","./typescript-CP6ECzON.js","./postcss-kj1IbjVd.js","./tsx-CmGGo4Hm.js","./blade-BbH7YAUi.js","./html-derivative-HU9p64q4.js","./sql-DzUuSofg.js","./bsl-DwPS0BId.js","./sdbl-BBUhycGU.js","./cairo-BtYx2aM5.js","./python-CrdIx4PZ.js","./cobol-B8r1pfPr.js","./coffee-XLjtuEYs.js","./cpp-zh2ePAE_.js","./regexp-BxWeO75u.js","./glsl-CGsiYPcu.js","./c-C4VtT7JA.js","./crystal-BqBRy7Ec.js","./shellscript-CQ8MXh-D.js","./edge-CnHxQ_FD.js","./elixir-B_LIBv5J.js","./elm-BlO7pcFp.js","./erb-Bzn22wO6.js","./ruby-C13Bjepi.js","./haml-DrIklt7F.js","./graphql-CwmtR1ib.js","./jsx-BPmvoin2.js","./lua-BVbbqwZC.js","./yaml-B_vW5iTY.js","./erlang-Ch5kuXHm.js","./markdown-F_EULe_G.js","./fortran-fixed-form-CpmOyvS5.js","./fortran-free-form-5X94ETMi.js","./fsharp-5vtGqRR9.js","./gdresource-B5TLWiFO.js","./gdshader-BEzE4j_3.js","./gdscript-CNW3Aj-d.js","./git-commit-PP9xCApN.js","./diff-BEdzuHlE.js","./git-rebase-D-XQSvDj.js","./glimmer-js-h2QNNiD7.js","./glimmer-ts-Bk3uX6Ae.js","./hack-BTX3ICIE.js","./handlebars-yWFGGD2R.js","./http-DjsOm9E4.js","./hurl-Am2cDU4f.js","./csv-Ba84L8e5.js","./hxml-Jle7oGdm.js","./haxe-BpobLYM9.js","./jinja-FkIlHBgj.js","./jison-BkdOIOd4.js","./julia-CU_UwNb8.js","./r-Dpdc-Kyk.js","./just-tGFryTtU.js","./perl-HITCDkgu.js","./latex-B0gTO9uZ.js","./tex-CGVqF8nD.js","./liquid-QmJ_LYTW.js","./marko-BAWrmNIa.js","./less-BAzLMJNR.js","./mdc-Ca0ft0PS.js","./nextflow-B166B-y1.js","./nextflow-groovy-BOO9s0iq.js","./nginx-BFAkI5_-.js","./nim-B3PAIZ4D.js","./php-C2HieitX.js","./pug-BwQB43qN.js","./qml-jtL8okyu.js","./razor-gBXW6YBJ.js","./csharp-DxX_6tHh.js","./rst-by6KAwTb.js","./cmake-CDfQILeU.js","./sas-BLBgC3TA.js","./shaderlab-C07uO3dL.js","./hlsl-TRzjajlb.js","./shellsession-CkeTp4M1.js","./soy-BHaHgMUy.js","./sparql-DswowMAp.js","./turtle-BnC7StHY.js","./stata-Dl7wDdBE.js","./surrealql-Bs3vUeKA.js","./svelte-fC0HkEkx.js","./templ-CSEiQwNm.js","./go-DRMr3iML.js","./ts-tags-cG2hZuda.js","./twig-CwEEYIBf.js","./vue-K-7Ga-y8.js","./vue-html-DhreShjd.js","./vue-vine-rMIwOpFf.js","./stylus-DXFa_2Jl.js","./xsl-CnwVr_6q.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
function _mergeNamespaces(n2, m2) {
|
|
3
3
|
for (var i3 = 0; i3 < m2.length; i3++) {
|
|
4
4
|
const e2 = m2[i3];
|
|
@@ -15082,10 +15082,10 @@ const useTranslation = (ns2, props = {}) => {
|
|
|
15082
15082
|
}
|
|
15083
15083
|
return ret;
|
|
15084
15084
|
};
|
|
15085
|
-
const sidebar$1 = { "welcome": "Welcome", "skills": "Skills", "projects": "Projects", "noProjects": "No projects yet", "noProjectsHint": "Add a project folder to get started", "addProject": "Add Project", "noAgentsHint": "Configure an agent first", "configureAgent": "Configure Agent", "revealInFinder": "Reveal in Finder", "rename": "Rename", "delete": "Delete", "renameProject": "Rename Project", "renameChat": "Rename Chat", "deleteChat": "Delete Chat", "enterNewProjectName": "Enter a new project name.", "enterNewChatName": "Enter a new chat name.", "addProjectTitle": "Add Project", "enterProjectPath": "Enter absolute path to project on the server:", "pathCannotBeEmpty": "Path cannot be empty", "webuiEnabled": "WebUI Enabled", "deleteProject": "Delete Project", "deleteProjectConfirm": 'Delete project "{{title}}" and all chats in it?\nThis action cannot be undone.', "deleteChatConfirm": 'Delete chat "{{title}}"?\nThis action cannot be undone.', "cancel": "Cancel", "save": "Save", "settings": "Settings", "agents": "Agents", "addProjectFailed": "Failed to add project.", "newChatFailed": "Failed to create a new chat.", "loadSessionFailed": "Failed to load session.", "revealInFinderFailed": "Failed to reveal in Finder.", "projectExists": "Project already exists.", "projectNameEmpty": "Project name cannot be empty.", "chatNameEmpty": "Chat name cannot be empty.", "newChat": "New Chat", "projectActions": "Project actions for {{title}}", "createChatInProject": "Create chat in {{title}}", "chatActions": "Chat actions for {{title}}", "ilinkSetActive": "Set WeChat Active", "ilinkUnsetActive": "Unset WeChat Active", "newSessionDialog": { "title": "Create session", "agent": "Agent", "selectAgent": "Select an agent", "mcp": "MCP", "noMcp": "No MCP servers configured", "permission": "Permission", "permissionAsk": "Ask", "permissionAllowAll": "Allow all", "create": "Create" } };
|
|
15085
|
+
const sidebar$1 = { "welcome": "Welcome", "skills": "Skills", "automation": "Automation", "projects": "Projects", "noProjects": "No projects yet", "noProjectsHint": "Add a project folder to get started", "addProject": "Add Project", "noAgentsHint": "Configure an agent first", "configureAgent": "Configure Agent", "revealInFinder": "Reveal in Finder", "rename": "Rename", "delete": "Delete", "renameProject": "Rename Project", "renameChat": "Rename Chat", "deleteChat": "Delete Chat", "enterNewProjectName": "Enter a new project name.", "enterNewChatName": "Enter a new chat name.", "addProjectTitle": "Add Project", "enterProjectPath": "Enter absolute path to project on the server:", "pathCannotBeEmpty": "Path cannot be empty", "webuiEnabled": "WebUI Enabled", "deleteProject": "Delete Project", "deleteProjectConfirm": 'Delete project "{{title}}" and all chats in it?\nThis action cannot be undone.', "deleteChatConfirm": 'Delete chat "{{title}}"?\nThis action cannot be undone.', "cancel": "Cancel", "save": "Save", "settings": "Settings", "agents": "Agents", "addProjectFailed": "Failed to add project.", "newChatFailed": "Failed to create a new chat.", "loadSessionFailed": "Failed to load session.", "revealInFinderFailed": "Failed to reveal in Finder.", "projectExists": "Project already exists.", "projectNameEmpty": "Project name cannot be empty.", "chatNameEmpty": "Chat name cannot be empty.", "newChat": "New Chat", "projectActions": "Project actions for {{title}}", "createChatInProject": "Create chat in {{title}}", "chatActions": "Chat actions for {{title}}", "ilinkSetActive": "Set WeChat Active", "ilinkUnsetActive": "Unset WeChat Active", "newSessionDialog": { "title": "Create session", "agent": "Agent", "selectAgent": "Select an agent", "mcp": "MCP", "noMcp": "No MCP servers configured", "permission": "Permission", "permissionAsk": "Ask", "permissionAllowAll": "Allow all", "create": "Create" } };
|
|
15086
15086
|
const skills$1 = { "title": "Skills", "installed": { "label": "Installed", "noDescription": "No description provided.", "revealInFinder": "Reveal in Finder", "viewSkill": "View SKILL.md", "uninstall": "Uninstall", "uninstallTitle": "Uninstall Skill", "uninstallConfirm": "Are you sure you want to uninstall {{name}}? ", "cancel": "Cancel", "uninstalledSuccess": "Skill {{name}} uninstalled", "uninstallFailed": "Failed to uninstall: {{message}}", "revealFailed": "Failed to reveal in Finder: {{message}}", "loadFailed": "Failed to load skills", "loadContentFailed": "Error loading skill content: {{message}}", "noSkills": "No skills installed." }, "skillsSh": { "label": "skills.sh", "title": "Discover Skills", "desc": "Explore and install community skills to enhance your agents.", "searchPlaceholder": "Search skills (e.g. pr-review, react-best-practices)...", "install": "Install", "installSuccess": "Skill {{name}} installed", "installFailed": "Install failed", "noResults": "No skills found", "installs": "{{count}} installs", "installedStatus": "Installed", "authorPrefix": "by " } };
|
|
15087
15087
|
const contextMenu$1 = { "cut": "Cut", "copy": "Copy", "paste": "Paste", "selectAll": "Select All" };
|
|
15088
|
-
const settings$1 = { "themeDesc": "Customize the appearance of the application", "languageDesc": "Select the display language", "title": "Settings", "general": { "title": "General", "desc": "Manage your application settings.", "theme": "Theme", "light": "Light", "dark": "Dark", "system": "System", "language": "Language", "english": "English", "chinese": "简体中文", "saveThemeFailed": "Failed to save theme setting.", "saveLanguageFailed": "Failed to save language setting.", "groupAppearance": "Appearance", "groupProject": "Project", "autoWatchFiles": "Auto Watch Files", "autoWatchFilesDesc": "Automatically watch project file changes", "saveFileWatcherFailed": "Failed to save file watcher setting.", "groupSound": "Sound", "soundEnabled": "Sound Effects", "soundEnabledDesc": "Play sound effects for notifications", "soundVolume": "Volume", "soundVolumeDesc": "Adjust notification volume", "soundTheme": "Sound Style", "soundThemeDesc": "Select the sound effect style", "soundSoft": "Soft", "soundCrisp": "Crisp", "soundTest": "Test", "soundTestDesc": "Preview the current sound effect", "soundTestPlay": "Play", "saveSoundFailed": "Failed to save sound setting." }, "agents": { "desc": "Manage agent configurations and startup commands.", "description": "Configure agents", "title": "Agents", "addAgent": "Add Agent", "addStdioAgent": "Add Stdio Agent", "addApiAgent": "Add API Agent", "editAgent": "Edit Agent", "dialogDesc": "Configure the agent ID, command, arguments and environment variables.", "apiDialogDesc": "Configure provider, endpoint and authentication for API agent.", "agentId": "Agent ID (Name)", "apiProvider": "Provider", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "Headers (JSON)", "contextWindowTokens": "Context Window (tokens)", "command": "Command", "args": "Arguments", "envVars": "Environment Variables (JSON)", "envJson": "Environment Variables (JSON)", "cancel": "Cancel", "save": "Save", "edit": "Edit", "delete": "Delete", "dragToReorder": "Drag to reorder", "noAgents": "No agents configured", "errorIdCommand": "ID and Command are required.", "errorDuplicateId": "An agent with this ID already exists.", "errorEnvJson": "Env must be a valid JSON object.", "errorContextWindowTokens": "Context Window must be a positive integer.", "updateFailed": "Failed to update configuration.", "confirmDeleteTitle": "Delete Agent", "confirmDeleteDesc": "Are you sure you want to delete this agent? This action cannot be undone.", "validation": { "enterId": "Please enter an agent ID.", "idFormat": "Only letters, numbers, _ and - allowed.", "selectProvider": "Please select a provider.", "enterBaseUrl": "Please enter a base URL.", "enterApiKey": "Please enter an API key.", "enterCommand": "Please enter a command.", "jsonObject": "Must be a valid JSON object with string values.", "positiveInteger": "Must be a positive integer." } }, "mcp": { "desc": "Manage MCP server configurations and startup commands.", "description": "Configure MCP Servers", "title": "MCP Servers", "addMcp": "Add MCP Server", "addStdioMcp": "Add Stdio MCP", "addHttpMcp": "Add HTTP MCP", "recommended": { "exa": { "name": "Exa", "desc": "Exa MCP Server — AI Web Search" } }, "editMcp": "Edit MCP Server", "dialogDesc": "Configure the MCP server ID, command, arguments and environment variables.", "mcpId": "MCP Server ID (Name)", "command": "Command", "args": "Arguments", "envVars": "Environment Variables (JSON)", "envJson": "Environment Variables (JSON)", "url": "URL", "headers": "Headers (JSON)", "headersJson": "Headers (JSON)", "httpDialogDesc": "Configure the MCP server ID, HTTP URL and request headers.", "cancel": "Cancel", "save": "Save", "edit": "Edit", "delete": "Delete", "dragToReorder": "Drag to reorder", "noMcpServers": "No MCP servers configured", "errorIdRequired": "ID is required.", "errorUrlRequired": "URL is required.", "errorIdCommand": "ID and Command are required.", "errorDuplicateId": "An MCP server with this ID already exists.", "errorHeadersJson": "Headers must be a valid JSON object.", "errorEnvJson": "Env must be a valid JSON object.", "updateFailed": "Failed to update configuration.", "confirmDeleteTitle": "Delete MCP Server", "confirmDeleteDesc": "Are you sure you want to delete this MCP server? This action cannot be undone.", "validation": { "enterId": "Please enter a server ID.", "idFormat": "Only letters, numbers, _ and - allowed.", "enterCommand": "Please enter a command.", "enterUrl": "Please enter a URL.", "jsonObject": "Must be a valid JSON object with string values." } }, "webui": { "desc": "Configure remote access to the Fello interface.", "title": "WebUI", "enable": "Enable WebUI", "enableDesc": "Allow remote access to Fello interface via browser", "accessUrl": "Access URL", "accessDesc": "Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.", "enableAccess": "Enable WebUI Access", "port": "Port:", "token": "Token:", "autoGenerated": "Auto-generated", "copy": "Copy", "note": "Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.", "updateFailed": "Failed to update configuration.", "disabledInWebUI": "WebUI configuration is disabled when running inside the browser." }, "ilink": { "title": "WeChat iLink", "description": "Connect Fello to WeChat via iLink Bot API. Once connected, a ClawBot contact will appear in your WeChat, allowing you to chat with your AI agent from anywhere.", "connected": "Connected", "notConnected": "Not Connected", "notConnectedHint": "Scan QR code with WeChat to connect", "login": "Login", "loggingIn": "Waiting...", "disconnect": "Disconnect", "scanPrompt": "Scan with WeChat to login", "qrcodeExpired": "QR code expired, please try again", "scanned": "Scanned! Please confirm on your phone.", "browserOpened": "QR code opened in browser. Scan with WeChat to login.", "activeSession": "Active Session for WeChat", "activeSessionHint": "Messages from WeChat will be routed to this session. Right-click a session in the sidebar to set it as active.", "selectSession": "-- Select a session --", "none": "-- None --", "howItWorks": "How it works", "step1": 'Click "Login" to open the QR code in your browser', "step2": "Scan the QR code with WeChat", "step3": 'A "ClawBot" contact appears in your WeChat', "step4": "Chat with ClawBot — messages are routed to the active session above", "step5": "Right-click any session in the sidebar to set it as active for WeChat", "useOriginalImage": "Use Original Image", "useOriginalImageDesc": "Send full-size images to the model (uses more tokens). When off, thumbnails are used.", "keepaliveMaxCount": "Keepalive Messages", "keepaliveMaxCountDesc": "Max consecutive keepalive messages while thinking." }, "snippets": { "title": "Snippets", "desc": "Manage reusable text snippets for quick insertion.", "description": "Configure Snippets", "add": "Add Snippet", "edit": "Edit Snippet", "delete": "Delete", "save": "Save", "cancel": "Cancel", "empty": "No snippets configured", "saveFailed": "Failed to save snippets.", "titleLabel": "Title", "titlePlaceholder": "Title", "contentLabel": "Content", "contentPlaceholder": "Content", "dialogDesc": "Configure the snippet title and content.", "confirmDeleteTitle": "Delete Snippet", "confirmDeleteDesc": "Are you sure you want to delete this snippet? This action cannot be undone.", "validation": { "enterTitle": "Please enter a title.", "enterContent": "Please enter content." } } };
|
|
15088
|
+
const settings$1 = { "themeDesc": "Customize the appearance of the application", "languageDesc": "Select the display language", "title": "Settings", "general": { "title": "General", "desc": "Manage your application settings.", "theme": "Theme", "light": "Light", "dark": "Dark", "system": "System", "language": "Language", "english": "English", "chinese": "简体中文", "saveThemeFailed": "Failed to save theme setting.", "saveLanguageFailed": "Failed to save language setting.", "groupAppearance": "Appearance", "groupProject": "Project", "autoWatchFiles": "Auto Watch Files", "autoWatchFilesDesc": "Automatically watch project file changes", "saveFileWatcherFailed": "Failed to save file watcher setting.", "groupSound": "Sound", "soundEnabled": "Sound Effects", "soundEnabledDesc": "Play sound effects for notifications", "soundVolume": "Volume", "soundVolumeDesc": "Adjust notification volume", "soundTheme": "Sound Style", "soundThemeDesc": "Select the sound effect style", "soundSoft": "Soft", "soundCrisp": "Crisp", "soundTest": "Test", "soundTestDesc": "Preview the current sound effect", "soundTestPlay": "Play", "saveSoundFailed": "Failed to save sound setting." }, "agents": { "desc": "Manage agent configurations and startup commands.", "description": "Configure agents", "title": "Agents", "addAgent": "Add Agent", "addStdioAgent": "Add Stdio Agent", "addApiAgent": "Add API Agent", "editAgent": "Edit Agent", "dialogDesc": "Configure the agent ID, command, arguments and environment variables.", "apiDialogDesc": "Configure provider, endpoint and authentication for API agent.", "agentId": "Agent ID (Name)", "apiProvider": "Provider", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "Headers (JSON)", "contextWindowTokens": "Context Window (tokens)", "modelIdTemplate": "Model Id Template", "command": "Command", "args": "Arguments", "envVars": "Environment Variables (JSON)", "envJson": "Environment Variables (JSON)", "cancel": "Cancel", "save": "Save", "edit": "Edit", "delete": "Delete", "dragToReorder": "Drag to reorder", "noAgents": "No agents configured", "errorIdCommand": "ID and Command are required.", "errorDuplicateId": "An agent with this ID already exists.", "errorEnvJson": "Env must be a valid JSON object.", "errorContextWindowTokens": "Context Window must be a positive integer.", "updateFailed": "Failed to update configuration.", "confirmDeleteTitle": "Delete Agent", "confirmDeleteDesc": "Are you sure you want to delete this agent? This action cannot be undone.", "validation": { "enterId": "Please enter an agent ID.", "idFormat": "Only letters, numbers, _ and - allowed.", "selectProvider": "Please select a provider.", "enterBaseUrl": "Please enter a base URL.", "enterApiKey": "Please enter an API key.", "enterCommand": "Please enter a command.", "jsonObject": "Must be a valid JSON object with string values.", "positiveInteger": "Must be a positive integer." } }, "mcp": { "desc": "Manage MCP server configurations and startup commands.", "description": "Configure MCP Servers", "title": "MCP Servers", "addMcp": "Add MCP Server", "addStdioMcp": "Add Stdio MCP", "addHttpMcp": "Add HTTP MCP", "recommended": { "exa": { "name": "Exa", "desc": "Exa MCP Server — AI Web Search" } }, "editMcp": "Edit MCP Server", "dialogDesc": "Configure the MCP server ID, command, arguments and environment variables.", "mcpId": "MCP Server ID (Name)", "command": "Command", "args": "Arguments", "envVars": "Environment Variables (JSON)", "envJson": "Environment Variables (JSON)", "url": "URL", "headers": "Headers (JSON)", "headersJson": "Headers (JSON)", "httpDialogDesc": "Configure the MCP server ID, HTTP URL and request headers.", "cancel": "Cancel", "save": "Save", "edit": "Edit", "delete": "Delete", "dragToReorder": "Drag to reorder", "noMcpServers": "No MCP servers configured", "errorIdRequired": "ID is required.", "errorUrlRequired": "URL is required.", "errorIdCommand": "ID and Command are required.", "errorDuplicateId": "An MCP server with this ID already exists.", "errorHeadersJson": "Headers must be a valid JSON object.", "errorEnvJson": "Env must be a valid JSON object.", "updateFailed": "Failed to update configuration.", "confirmDeleteTitle": "Delete MCP Server", "confirmDeleteDesc": "Are you sure you want to delete this MCP server? This action cannot be undone.", "validation": { "enterId": "Please enter a server ID.", "idFormat": "Only letters, numbers, _ and - allowed.", "enterCommand": "Please enter a command.", "enterUrl": "Please enter a URL.", "jsonObject": "Must be a valid JSON object with string values." } }, "webui": { "desc": "Configure remote access to the Fello interface.", "title": "WebUI", "enable": "Enable WebUI", "enableDesc": "Allow remote access to Fello interface via browser", "accessUrl": "Access URL", "accessDesc": "Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.", "enableAccess": "Enable WebUI Access", "port": "Port:", "token": "Token:", "autoGenerated": "Auto-generated", "copy": "Copy", "note": "Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.", "updateFailed": "Failed to update configuration.", "disabledInWebUI": "WebUI configuration is disabled when running inside the browser." }, "ilink": { "title": "WeChat iLink", "description": "Connect Fello to WeChat via iLink Bot API. Once connected, a ClawBot contact will appear in your WeChat, allowing you to chat with your AI agent from anywhere.", "connected": "Connected", "notConnected": "Not Connected", "notConnectedHint": "Scan QR code with WeChat to connect", "login": "Login", "loggingIn": "Waiting...", "disconnect": "Disconnect", "scanPrompt": "Scan with WeChat to login", "qrcodeExpired": "QR code expired, please try again", "scanned": "Scanned! Please confirm on your phone.", "browserOpened": "QR code opened in browser. Scan with WeChat to login.", "activeSession": "Active Session for WeChat", "activeSessionHint": "Messages from WeChat will be routed to this session. Right-click a session in the sidebar to set it as active.", "selectSession": "-- Select a session --", "none": "-- None --", "howItWorks": "How it works", "step1": 'Click "Login" to open the QR code in your browser', "step2": "Scan the QR code with WeChat", "step3": 'A "ClawBot" contact appears in your WeChat', "step4": "Chat with ClawBot — messages are routed to the active session above", "step5": "Right-click any session in the sidebar to set it as active for WeChat", "useOriginalImage": "Use Original Image", "useOriginalImageDesc": "Send full-size images to the model (uses more tokens). When off, thumbnails are used.", "keepaliveMaxCount": "Keepalive Messages", "keepaliveMaxCountDesc": "Max consecutive keepalive messages while thinking." }, "snippets": { "title": "Snippets", "desc": "Manage reusable text snippets for quick insertion.", "description": "Configure Snippets", "add": "Add Snippet", "edit": "Edit Snippet", "delete": "Delete", "save": "Save", "cancel": "Cancel", "empty": "No snippets configured", "saveFailed": "Failed to save snippets.", "titleLabel": "Title", "titlePlaceholder": "Title", "contentLabel": "Content", "contentPlaceholder": "Content", "dialogDesc": "Configure the snippet title and content.", "confirmDeleteTitle": "Delete Snippet", "confirmDeleteDesc": "Are you sure you want to delete this snippet? This action cannot be undone.", "validation": { "enterTitle": "Please enter a title.", "enterContent": "Please enter content." } } };
|
|
15089
15089
|
const chat$1 = { "failedToLoadSession": "Failed to load session.", "failedToUpdateMcpServers": "Failed to update MCP servers." };
|
|
15090
15090
|
const planBubble$1 = { "title": "Plan", "summary": "{{completed}} / {{total}} completed", "status": { "pending": "Pending", "inProgress": "In progress", "completed": "Completed" }, "priority": { "high": "High", "medium": "Medium", "low": "Low" } };
|
|
15091
15091
|
const constant$5 = { "feature": { "title": "Features", "askUser": "Ask Me", "skills": "Skills" } };
|
|
@@ -15113,6 +15113,7 @@ const fileDetail$1 = { "fileNotFound": "File not found", "fileTooLarge": "File i
|
|
|
15113
15113
|
const htmlDetail$1 = { "fileNotFound": "File not found or inaccessible", "errorLoading": "Failed to load", "loadFailed": "Page load failed", "retry": "Retry", "openInBrowser": "Open in browser", "webuiNotEnabled": "Enable WebUI first to open in browser", "open": "Open", "refresh": "Refresh" };
|
|
15114
15114
|
const welcome$1 = { "title": "Fello", "desc": "Yet another Agent client based on the ACP protocol. Connect with the agent and begin collaborating.", "hint": "Start a new chat from the sidebar", "getStarted": "Get Started", "stepAgent": "Configure Agent", "stepAgentDesc": "Add an AI agent (local Stdio or API) to power your conversations", "stepAgentDone": "{{count}} agent(s) configured", "stepProject": "Add Project", "stepProjectDesc": "Select a local project folder as your workspace", "stepProjectDone": "{{count}} project(s) added", "stepChat": "Start Chat", "stepChatDesc": "Create a new AI conversation in your project", "allDone": "All set! Start a new chat from the sidebar" };
|
|
15115
15115
|
const askUser$1 = { "title": "Request", "other": "Other...", "back": "Back", "inputPlaceholder": "Type your response... (Enter to send)", "submit": "Submit" };
|
|
15116
|
+
const automation$1 = { "title": "Automation", "agent": "Agent", "alwaysDisabled": "always disabled", "anyMoment": "Any moment now", "back": "Back", "cancel": "Cancel", "create": "Create", "createFirst": "Create your first schedule", "delete": "Delete", "deleteConfirm": 'Delete "{{name}}" permanently?', "deleteTaskConfirm": "Delete this task permanently?", "deleteTaskTitle": "Delete Task", "deleteTitle": "Delete Schedule", "dialogDesc": "Configure the automated task schedule and prompt.", "editSchedule": "Edit Schedule", "editSettings": "Edit settings", "features": "Features", "lastRun": "Last", "lessThanMinute": "Less than 1 min", "manual": "Manual", "manualDesc": "Manual trigger only. No automatic scheduling.", "mcpServers": "MCP Servers", "newSchedule": "New Schedule", "nextRun": "Next", "noFiles": "No files generated", "noSchedules": "No schedules yet", "noTasksDesc": 'No runs yet. Click "Trigger now" to start the first run.', "prompt": "Prompt", "promptPlaceholder": "What should the agent do?", "save": "Save", "schedule": "Schedule", "scheduleName": "Schedule Name", "scheduleNamePlaceholder": "e.g. Morning Standup Summary", "scheduleNotFound": "Schedule not found", "schedules": "schedules", "selectFileToPreview": "Select a file to preview", "selectTaskToPreview": "Select a task to preview files", "timedExecution": "Timed (cron)", "triggerNow": "Trigger now", "validation": { "nameRequired": "Name is required", "agentRequired": "Agent is required", "promptRequired": "Prompt is required" }, "cron": { "at": "at", "atMinute": "at min", "custom": "Custom", "daily": "Every day", "hourly": "Every N hours", "weekdays": "Weekdays", "weekly": "Every week", "nextRun": "Next run", "nextRunIn": "Next run in", "lastRun": "Last run", "days": { "0": "Sun", "1": "Mon", "2": "Tue", "3": "Wed", "4": "Thu", "5": "Fri", "6": "Sat" } } };
|
|
15116
15117
|
const en$4 = {
|
|
15117
15118
|
sidebar: sidebar$1,
|
|
15118
15119
|
skills: skills$1,
|
|
@@ -15144,12 +15145,13 @@ const en$4 = {
|
|
|
15144
15145
|
fileDetail: fileDetail$1,
|
|
15145
15146
|
htmlDetail: htmlDetail$1,
|
|
15146
15147
|
welcome: welcome$1,
|
|
15147
|
-
askUser: askUser$1
|
|
15148
|
+
askUser: askUser$1,
|
|
15149
|
+
automation: automation$1
|
|
15148
15150
|
};
|
|
15149
|
-
const sidebar = { "welcome": "欢迎使用", "skills": "技能", "projects": "项目", "noProjects": "暂无项目", "noProjectsHint": "添加一个项目文件夹开始", "addProject": "添加项目", "noAgentsHint": "请先配置 Agent", "configureAgent": "配置 Agent", "revealInFinder": "在访达中显示", "rename": "重命名", "delete": "删除", "renameProject": "重命名项目", "renameChat": "重命名会话", "deleteChat": "删除会话", "enterNewProjectName": "请输入新的项目名称。", "enterNewChatName": "请输入新的会话名称。", "addProjectTitle": "添加项目", "enterProjectPath": "请输入服务器上的项目绝对路径:", "pathCannotBeEmpty": "路径不能为空", "webuiEnabled": "已启用 WebUI", "deleteProject": "删除项目", "deleteProjectConfirm": "是否删除项目“{{title}}”及其所有会话?\n此操作无法撤销。", "deleteChatConfirm": "是否删除会话“{{title}}”?\n此操作无法撤销。", "cancel": "取消", "save": "保存", "settings": "设置", "agents": "智能体", "addProjectFailed": "添加项目失败。", "newChatFailed": "创建新会话失败。", "loadSessionFailed": "加载会话失败。", "revealInFinderFailed": "在访达中显示失败。", "projectExists": "项目已存在。", "projectNameEmpty": "项目名称不能为空。", "chatNameEmpty": "会话名称不能为空。", "newChat": "新会话", "projectActions": "项目操作:{{title}}", "createChatInProject": "在 {{title}} 中创建会话", "chatActions": "会话操作:{{title}}", "ilinkSetActive": "设为微信活跃会话", "ilinkUnsetActive": "取消微信活跃", "newSessionDialog": { "title": "新建会话", "agent": "智能体", "selectAgent": "选择智能体", "mcp": "MCP", "noMcp": "未配置 MCP 服务器", "permission": "权限", "permissionAsk": "每次询问", "permissionAllowAll": "全部允许", "create": "创建" } };
|
|
15151
|
+
const sidebar = { "welcome": "欢迎使用", "skills": "技能", "automation": "自动化", "projects": "项目", "noProjects": "暂无项目", "noProjectsHint": "添加一个项目文件夹开始", "addProject": "添加项目", "noAgentsHint": "请先配置 Agent", "configureAgent": "配置 Agent", "revealInFinder": "在访达中显示", "rename": "重命名", "delete": "删除", "renameProject": "重命名项目", "renameChat": "重命名会话", "deleteChat": "删除会话", "enterNewProjectName": "请输入新的项目名称。", "enterNewChatName": "请输入新的会话名称。", "addProjectTitle": "添加项目", "enterProjectPath": "请输入服务器上的项目绝对路径:", "pathCannotBeEmpty": "路径不能为空", "webuiEnabled": "已启用 WebUI", "deleteProject": "删除项目", "deleteProjectConfirm": "是否删除项目“{{title}}”及其所有会话?\n此操作无法撤销。", "deleteChatConfirm": "是否删除会话“{{title}}”?\n此操作无法撤销。", "cancel": "取消", "save": "保存", "settings": "设置", "agents": "智能体", "addProjectFailed": "添加项目失败。", "newChatFailed": "创建新会话失败。", "loadSessionFailed": "加载会话失败。", "revealInFinderFailed": "在访达中显示失败。", "projectExists": "项目已存在。", "projectNameEmpty": "项目名称不能为空。", "chatNameEmpty": "会话名称不能为空。", "newChat": "新会话", "projectActions": "项目操作:{{title}}", "createChatInProject": "在 {{title}} 中创建会话", "chatActions": "会话操作:{{title}}", "ilinkSetActive": "设为微信活跃会话", "ilinkUnsetActive": "取消微信活跃", "newSessionDialog": { "title": "新建会话", "agent": "智能体", "selectAgent": "选择智能体", "mcp": "MCP", "noMcp": "未配置 MCP 服务器", "permission": "权限", "permissionAsk": "每次询问", "permissionAllowAll": "全部允许", "create": "创建" } };
|
|
15150
15152
|
const skills = { "title": "技能", "installed": { "label": "已安装", "noDescription": "暂无描述。", "revealInFinder": "在访达中显示", "viewSkill": "查看 SKILL.md", "uninstall": "卸载", "uninstallTitle": "卸载技能", "uninstallConfirm": "确定要卸载 {{name}} 吗?", "cancel": "取消", "uninstalledSuccess": "技能 {{name}} 已卸载", "uninstallFailed": "卸载失败:{{message}}", "revealFailed": "在访达中显示失败:{{message}}", "loadFailed": "加载技能失败", "loadContentFailed": "加载技能内容出错:{{message}}", "noSkills": "暂无安装的技能" }, "skillsSh": { "label": "skills.sh", "title": "探索技能", "desc": "浏览并安装社区提供的技能,以增强你的 Agent 能力。", "searchPlaceholder": "搜索技能(例如:pr-review, react-best-practices)...", "install": "安装", "installSuccess": "技能 {{name}} 已安装", "installFailed": "安装失败", "noResults": "未找到相关技能", "installs": "{{count}} 次安装", "installedStatus": "已安装", "authorPrefix": "作者: " } };
|
|
15151
15153
|
const contextMenu = { "cut": "剪切", "copy": "复制", "paste": "粘贴", "selectAll": "全选" };
|
|
15152
|
-
const settings = { "themeDesc": "自定义应用的外观", "languageDesc": "选择应用显示的语言", "title": "设置", "general": { "title": "通用", "desc": "管理应用设置。", "theme": "主题", "light": "浅色", "dark": "深色", "system": "跟随系统", "language": "语言", "english": "English", "chinese": "简体中文", "saveThemeFailed": "保存主题设置失败。", "saveLanguageFailed": "保存语言设置失败。", "groupAppearance": "外观", "groupProject": "项目", "autoWatchFiles": "自动监听文件", "autoWatchFilesDesc": "自动监听项目文件变更", "saveFileWatcherFailed": "保存文件监听设置失败。", "groupSound": "音效", "soundEnabled": "音效", "soundEnabledDesc": "播放通知音效", "soundVolume": "音量", "soundVolumeDesc": "调整通知音量", "soundTheme": "音效风格", "soundThemeDesc": "选择音效风格", "soundSoft": "柔和", "soundCrisp": "清脆", "soundTest": "试听", "soundTestDesc": "预览当前音效效果", "soundTestPlay": "播放", "saveSoundFailed": "保存音效设置失败。" }, "agents": { "desc": "管理智能体的配置和启动命令。", "description": "配置智能体", "title": "智能体", "addAgent": "添加智能体", "addStdioAgent": "添加 Stdio Agent", "addApiAgent": "添加 API Agent", "editAgent": "编辑智能体", "dialogDesc": "配置智能体 ID、命令、参数和环境变量。", "apiDialogDesc": "配置 API 智能体的提供商、端点和认证信息。", "agentId": "智能体 ID (名称)", "apiProvider": "提供商", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "请求头 (JSON)", "contextWindowTokens": "上下文窗口 (token)", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noAgents": "未配置任何智能体", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的智能体。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "errorContextWindowTokens": "上下文窗口必须为正整数。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除智能体", "confirmDeleteDesc": "确定要删除此智能体吗?此操作无法撤销。", "validation": { "enterId": "请输入智能体 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterCommand": "请输入命令。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。", "positiveInteger": "必须为正整数。" } }, "mcp": { "desc": "管理 MCP 服务器的配置和启动命令。", "description": "配置 MCP 服务器", "title": "MCP 服务器", "addMcp": "添加 MCP 服务器", "addStdioMcp": "添加 Stdio MCP", "addHttpMcp": "添加 HTTP MCP", "recommended": { "exa": { "name": "Exa", "desc": "Exa MCP 服务器 — AI 网络搜索" } }, "editMcp": "编辑 MCP 服务器", "dialogDesc": "配置 MCP 服务器 ID、命令、参数和环境变量。", "mcpId": "MCP 服务器 ID (名称)", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "url": "URL", "headers": "请求头 (JSON)", "headersJson": "请求头 (JSON)", "httpDialogDesc": "配置 MCP 服务器 ID、HTTP URL 和请求头。", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noMcpServers": "未配置任何 MCP 服务器", "errorIdRequired": "ID 不能为空。", "errorUrlRequired": "URL 不能为空。", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的 MCP 服务器。", "errorHeadersJson": "请求头必须是有效的 JSON 对象。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除 MCP 服务器", "confirmDeleteDesc": "确定要删除此 MCP 服务器吗?此操作无法撤销。", "validation": { "enterId": "请输入服务器 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "enterCommand": "请输入命令。", "enterUrl": "请输入 URL。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。" } }, "webui": { "desc": "配置对 Fello 界面的远程访问。", "title": "WebUI", "enable": "启用 WebUI", "enableDesc": "允许通过浏览器远程访问 Fello 界面", "enableAccess": "启用 WebUI 访问", "port": "端口:", "token": "Token:", "autoGenerated": "自动生成", "accessUrl": "访问地址", "accessDesc": "注意:此地址包含临时访问令牌,应用重启后将失效。", "copy": "复制", "note": "注意:此地址包含临时访问令牌,应用重启后将失效。", "updateFailed": "更新配置失败。", "disabledInWebUI": "WebUI 配置在浏览器中不可用。" }, "ilink": { "title": "微信 iLink", "description": "通过 iLink Bot API 将 Fello 接入微信。连接后,微信中会出现一个 ClawBot 联系人,你可以随时随地与 AI 智能体对话。", "connected": "已连接", "notConnected": "未连接", "notConnectedHint": "使用微信扫描二维码连接", "login": "登录", "loggingIn": "等待扫码...", "disconnect": "断开连接", "scanPrompt": "使用微信扫描二维码登录", "qrcodeExpired": "二维码已过期,请重新获取", "scanned": "已扫码!请在手机上确认登录。", "browserOpened": "二维码已在浏览器中打开,请使用微信扫码登录。", "activeSession": "微信活跃会话", "activeSessionHint": "微信消息将路由到此会话。可在侧边栏右键会话设为活跃。", "selectSession": "-- 选择一个会话 --", "none": "-- 无 --", "howItWorks": "使用说明", "step1": "点击「登录」在浏览器中打开二维码", "step2": "使用微信扫描二维码", "step3": "微信中出现「ClawBot」联系人", "step4": "与 ClawBot 聊天 — 消息将路由到上方选择的活跃会话", "step5": "在侧边栏右键任意会话即可设为微信活跃会话", "useOriginalImage": "使用原图", "useOriginalImageDesc": "向模型发送原始大小的图片(消耗更多 token)。关闭时使用缩略图。", "keepaliveMaxCount": "保活消息", "keepaliveMaxCountDesc": "AI 思考时最大连续保活消息数。" }, "snippets": { "title": "快捷短语", "desc": "管理可复用的文本片段,快速插入到对话中。", "description": "配置快捷短语", "add": "添加短语", "edit": "编辑短语", "delete": "删除", "save": "保存", "cancel": "取消", "empty": "暂无快捷短语", "saveFailed": "保存快捷短语失败。", "titleLabel": "标题", "titlePlaceholder": "标题", "contentLabel": "内容", "contentPlaceholder": "内容", "dialogDesc": "配置短语的标题和内容。", "confirmDeleteTitle": "删除短语", "confirmDeleteDesc": "确定要删除此短语吗?此操作无法撤销。", "validation": { "enterTitle": "请输入标题。", "enterContent": "请输入内容。" } } };
|
|
15154
|
+
const settings = { "themeDesc": "自定义应用的外观", "languageDesc": "选择应用显示的语言", "title": "设置", "general": { "title": "通用", "desc": "管理应用设置。", "theme": "主题", "light": "浅色", "dark": "深色", "system": "跟随系统", "language": "语言", "english": "English", "chinese": "简体中文", "saveThemeFailed": "保存主题设置失败。", "saveLanguageFailed": "保存语言设置失败。", "groupAppearance": "外观", "groupProject": "项目", "autoWatchFiles": "自动监听文件", "autoWatchFilesDesc": "自动监听项目文件变更", "saveFileWatcherFailed": "保存文件监听设置失败。", "groupSound": "音效", "soundEnabled": "音效", "soundEnabledDesc": "播放通知音效", "soundVolume": "音量", "soundVolumeDesc": "调整通知音量", "soundTheme": "音效风格", "soundThemeDesc": "选择音效风格", "soundSoft": "柔和", "soundCrisp": "清脆", "soundTest": "试听", "soundTestDesc": "预览当前音效效果", "soundTestPlay": "播放", "saveSoundFailed": "保存音效设置失败。" }, "agents": { "desc": "管理智能体的配置和启动命令。", "description": "配置智能体", "title": "智能体", "addAgent": "添加智能体", "addStdioAgent": "添加 Stdio Agent", "addApiAgent": "添加 API Agent", "editAgent": "编辑智能体", "dialogDesc": "配置智能体 ID、命令、参数和环境变量。", "apiDialogDesc": "配置 API 智能体的提供商、端点和认证信息。", "agentId": "智能体 ID (名称)", "apiProvider": "提供商", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "请求头 (JSON)", "contextWindowTokens": "上下文窗口 (token)", "modelIdTemplate": "Model Id 模版", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noAgents": "未配置任何智能体", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的智能体。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "errorContextWindowTokens": "上下文窗口必须为正整数。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除智能体", "confirmDeleteDesc": "确定要删除此智能体吗?此操作无法撤销。", "validation": { "enterId": "请输入智能体 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterCommand": "请输入命令。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。", "positiveInteger": "必须为正整数。" } }, "mcp": { "desc": "管理 MCP 服务器的配置和启动命令。", "description": "配置 MCP 服务器", "title": "MCP 服务器", "addMcp": "添加 MCP 服务器", "addStdioMcp": "添加 Stdio MCP", "addHttpMcp": "添加 HTTP MCP", "recommended": { "exa": { "name": "Exa", "desc": "Exa MCP 服务器 — AI 网络搜索" } }, "editMcp": "编辑 MCP 服务器", "dialogDesc": "配置 MCP 服务器 ID、命令、参数和环境变量。", "mcpId": "MCP 服务器 ID (名称)", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "url": "URL", "headers": "请求头 (JSON)", "headersJson": "请求头 (JSON)", "httpDialogDesc": "配置 MCP 服务器 ID、HTTP URL 和请求头。", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noMcpServers": "未配置任何 MCP 服务器", "errorIdRequired": "ID 不能为空。", "errorUrlRequired": "URL 不能为空。", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的 MCP 服务器。", "errorHeadersJson": "请求头必须是有效的 JSON 对象。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除 MCP 服务器", "confirmDeleteDesc": "确定要删除此 MCP 服务器吗?此操作无法撤销。", "validation": { "enterId": "请输入服务器 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "enterCommand": "请输入命令。", "enterUrl": "请输入 URL。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。" } }, "webui": { "desc": "配置对 Fello 界面的远程访问。", "title": "WebUI", "enable": "启用 WebUI", "enableDesc": "允许通过浏览器远程访问 Fello 界面", "enableAccess": "启用 WebUI 访问", "port": "端口:", "token": "Token:", "autoGenerated": "自动生成", "accessUrl": "访问地址", "accessDesc": "注意:此地址包含临时访问令牌,应用重启后将失效。", "copy": "复制", "note": "注意:此地址包含临时访问令牌,应用重启后将失效。", "updateFailed": "更新配置失败。", "disabledInWebUI": "WebUI 配置在浏览器中不可用。" }, "ilink": { "title": "微信 iLink", "description": "通过 iLink Bot API 将 Fello 接入微信。连接后,微信中会出现一个 ClawBot 联系人,你可以随时随地与 AI 智能体对话。", "connected": "已连接", "notConnected": "未连接", "notConnectedHint": "使用微信扫描二维码连接", "login": "登录", "loggingIn": "等待扫码...", "disconnect": "断开连接", "scanPrompt": "使用微信扫描二维码登录", "qrcodeExpired": "二维码已过期,请重新获取", "scanned": "已扫码!请在手机上确认登录。", "browserOpened": "二维码已在浏览器中打开,请使用微信扫码登录。", "activeSession": "微信活跃会话", "activeSessionHint": "微信消息将路由到此会话。可在侧边栏右键会话设为活跃。", "selectSession": "-- 选择一个会话 --", "none": "-- 无 --", "howItWorks": "使用说明", "step1": "点击「登录」在浏览器中打开二维码", "step2": "使用微信扫描二维码", "step3": "微信中出现「ClawBot」联系人", "step4": "与 ClawBot 聊天 — 消息将路由到上方选择的活跃会话", "step5": "在侧边栏右键任意会话即可设为微信活跃会话", "useOriginalImage": "使用原图", "useOriginalImageDesc": "向模型发送原始大小的图片(消耗更多 token)。关闭时使用缩略图。", "keepaliveMaxCount": "保活消息", "keepaliveMaxCountDesc": "AI 思考时最大连续保活消息数。" }, "snippets": { "title": "快捷短语", "desc": "管理可复用的文本片段,快速插入到对话中。", "description": "配置快捷短语", "add": "添加短语", "edit": "编辑短语", "delete": "删除", "save": "保存", "cancel": "取消", "empty": "暂无快捷短语", "saveFailed": "保存快捷短语失败。", "titleLabel": "标题", "titlePlaceholder": "标题", "contentLabel": "内容", "contentPlaceholder": "内容", "dialogDesc": "配置短语的标题和内容。", "confirmDeleteTitle": "删除短语", "confirmDeleteDesc": "确定要删除此短语吗?此操作无法撤销。", "validation": { "enterTitle": "请输入标题。", "enterContent": "请输入内容。" } } };
|
|
15153
15155
|
const chat = { "failedToLoadSession": "加载会话失败。", "failedToUpdateMcpServers": "更新 MCP 服务器失败。" };
|
|
15154
15156
|
const planBubble = { "title": "计划", "summary": "已完成 {{completed}} / {{total}}", "status": { "pending": "等待中", "inProgress": "进行中", "completed": "已完成" }, "priority": { "high": "高优先级", "medium": "中优先级", "low": "低优先级" } };
|
|
15155
15157
|
const constant$4 = { "feature": { "title": "功能", "askUser": "向我提问", "skills": "技能" } };
|
|
@@ -15177,6 +15179,7 @@ const fileDetail = { "fileNotFound": "文件不存在", "fileTooLarge": "该文
|
|
|
15177
15179
|
const htmlDetail = { "fileNotFound": "文件不存在或无法访问", "errorLoading": "加载失败", "loadFailed": "页面加载失败", "retry": "重试", "openInBrowser": "在浏览器中打开", "webuiNotEnabled": "请先启用 WebUI 才能在浏览器中打开", "open": "打开", "refresh": "刷新" };
|
|
15178
15180
|
const welcome = { "title": "Fello", "desc": "又一个基于 ACP 协议的 Agent 客户端,连接智能体并开始协作。", "hint": "从左侧边栏新建会话开始", "getStarted": "开始使用", "stepAgent": "配置 Agent", "stepAgentDesc": "添加一个 AI 智能体(本地 Stdio 或 API)来驱动对话", "stepAgentDone": "已配置 {{count}} 个 Agent", "stepProject": "添加项目", "stepProjectDesc": "选择一个本地项目文件夹作为工作区", "stepProjectDone": "已添加 {{count}} 个项目", "stepChat": "开始会话", "stepChatDesc": "在项目中创建一个新的 AI 对话", "allDone": "一切就绪!从左侧边栏开始新会话吧" };
|
|
15179
15181
|
const askUser = { "title": "请求", "other": "其他...", "back": "返回", "inputPlaceholder": "输入你的回复...(回车发送)", "submit": "提交" };
|
|
15182
|
+
const automation = { "title": "自动化", "agent": "智能体", "alwaysDisabled": "始终禁用", "anyMoment": "即将执行", "back": "返回", "cancel": "取消", "create": "创建", "createFirst": "创建你的第一个调度", "delete": "删除", "deleteConfirm": "确定永久删除「{{name}}」?", "deleteTaskConfirm": "确定永久删除此任务?", "deleteTaskTitle": "删除任务", "deleteTitle": "删除调度", "dialogDesc": "配置自动化任务的调度规则和 Prompt。", "editSchedule": "编辑调度", "editSettings": "编辑设置", "features": "功能", "lastRun": "上次", "lessThanMinute": "不到 1 分钟", "manual": "手动", "manualDesc": "仅手动触发,无自动调度。", "mcpServers": "MCP 服务器", "newSchedule": "新建调度", "nextRun": "下次", "noFiles": "暂无生成文件", "noSchedules": "暂无调度", "noTasksDesc": "暂无运行记录。点击「立即触发」开始第一次运行。", "prompt": "提示词", "promptPlaceholder": "智能体需要执行什么任务?", "save": "保存", "schedule": "调度", "scheduleName": "调度名称", "scheduleNamePlaceholder": "例如:每日站会摘要", "scheduleNotFound": "调度未找到", "schedules": "调度", "selectFileToPreview": "选择文件预览", "selectTaskToPreview": "选择任务查看文件", "timedExecution": "定时(cron)", "triggerNow": "立即触发", "validation": { "nameRequired": "名称不能为空", "agentRequired": "请选择智能体", "promptRequired": "提示词不能为空" }, "cron": { "at": "在", "atMinute": "第", "custom": "自定义", "daily": "每天", "hourly": "每隔 N 小时", "weekdays": "工作日", "weekly": "每周", "nextRun": "下次执行", "nextRunIn": "距离下次执行还有", "lastRun": "上次执行", "days": { "0": "周日", "1": "周一", "2": "周二", "3": "周三", "4": "周四", "5": "周五", "6": "周六" } } };
|
|
15180
15183
|
const zhCN = {
|
|
15181
15184
|
sidebar,
|
|
15182
15185
|
skills,
|
|
@@ -15208,7 +15211,8 @@ const zhCN = {
|
|
|
15208
15211
|
fileDetail,
|
|
15209
15212
|
htmlDetail,
|
|
15210
15213
|
welcome,
|
|
15211
|
-
askUser
|
|
15214
|
+
askUser,
|
|
15215
|
+
automation
|
|
15212
15216
|
};
|
|
15213
15217
|
instance.use(initReactI18next).init({
|
|
15214
15218
|
resources: {
|
|
@@ -18846,6 +18850,8 @@ bridge.on(
|
|
|
18846
18850
|
);
|
|
18847
18851
|
bridge.on("prompt-start", (payload) => emit("prompt-start", payload));
|
|
18848
18852
|
bridge.on("prompt-end", (payload) => emit("prompt-end", payload));
|
|
18853
|
+
bridge.on("schedules-changed", (payload) => emit("schedules-changed", payload));
|
|
18854
|
+
bridge.on("task-update", (payload) => emit("task-update", payload));
|
|
18849
18855
|
void invokeIPC("registerClient", { clientId }).catch(() => {
|
|
18850
18856
|
});
|
|
18851
18857
|
function calculateUserMessageChunk(state2, update2) {
|
|
@@ -29284,35 +29290,35 @@ const createLucideIcon = (iconName, iconNode) => {
|
|
|
29284
29290
|
Component.displayName = toPascalCase(iconName);
|
|
29285
29291
|
return Component;
|
|
29286
29292
|
};
|
|
29287
|
-
const __iconNode$
|
|
29293
|
+
const __iconNode$1e = [
|
|
29288
29294
|
["path", { d: "M12 5v14", key: "s699le" }],
|
|
29289
29295
|
["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
|
|
29290
29296
|
];
|
|
29291
|
-
const ArrowDown = createLucideIcon("arrow-down", __iconNode$
|
|
29292
|
-
const __iconNode$
|
|
29297
|
+
const ArrowDown = createLucideIcon("arrow-down", __iconNode$1e);
|
|
29298
|
+
const __iconNode$1d = [
|
|
29293
29299
|
["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
|
|
29294
29300
|
["path", { d: "M19 12H5", key: "x3x0zl" }]
|
|
29295
29301
|
];
|
|
29296
|
-
const ArrowLeft = createLucideIcon("arrow-left", __iconNode$
|
|
29297
|
-
const __iconNode$
|
|
29302
|
+
const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1d);
|
|
29303
|
+
const __iconNode$1c = [
|
|
29298
29304
|
["path", { d: "m16 3 4 4-4 4", key: "1x1c3m" }],
|
|
29299
29305
|
["path", { d: "M20 7H4", key: "zbl0bi" }],
|
|
29300
29306
|
["path", { d: "m8 21-4-4 4-4", key: "h9nckh" }],
|
|
29301
29307
|
["path", { d: "M4 17h16", key: "g4d7ey" }]
|
|
29302
29308
|
];
|
|
29303
|
-
const ArrowRightLeft = createLucideIcon("arrow-right-left", __iconNode$
|
|
29304
|
-
const __iconNode$
|
|
29309
|
+
const ArrowRightLeft = createLucideIcon("arrow-right-left", __iconNode$1c);
|
|
29310
|
+
const __iconNode$1b = [
|
|
29305
29311
|
["path", { d: "M5 3h14", key: "7usisc" }],
|
|
29306
29312
|
["path", { d: "m18 13-6-6-6 6", key: "1kf1n9" }],
|
|
29307
29313
|
["path", { d: "M12 7v14", key: "1akyts" }]
|
|
29308
29314
|
];
|
|
29309
|
-
const ArrowUpToLine = createLucideIcon("arrow-up-to-line", __iconNode$
|
|
29310
|
-
const __iconNode$
|
|
29315
|
+
const ArrowUpToLine = createLucideIcon("arrow-up-to-line", __iconNode$1b);
|
|
29316
|
+
const __iconNode$1a = [
|
|
29311
29317
|
["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
|
|
29312
29318
|
["path", { d: "M12 19V5", key: "x0mq9r" }]
|
|
29313
29319
|
];
|
|
29314
|
-
const ArrowUp = createLucideIcon("arrow-up", __iconNode$
|
|
29315
|
-
const __iconNode$
|
|
29320
|
+
const ArrowUp = createLucideIcon("arrow-up", __iconNode$1a);
|
|
29321
|
+
const __iconNode$19 = [
|
|
29316
29322
|
["path", { d: "M12 7v6", key: "lw1j43" }],
|
|
29317
29323
|
["path", { d: "M15 10H9", key: "o6yqo3" }],
|
|
29318
29324
|
[
|
|
@@ -29323,8 +29329,8 @@ const __iconNode$16 = [
|
|
|
29323
29329
|
}
|
|
29324
29330
|
]
|
|
29325
29331
|
];
|
|
29326
|
-
const BookmarkPlus = createLucideIcon("bookmark-plus", __iconNode$
|
|
29327
|
-
const __iconNode$
|
|
29332
|
+
const BookmarkPlus = createLucideIcon("bookmark-plus", __iconNode$19);
|
|
29333
|
+
const __iconNode$18 = [
|
|
29328
29334
|
["path", { d: "M12 8V4H8", key: "hb8ula" }],
|
|
29329
29335
|
["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
|
|
29330
29336
|
["path", { d: "M2 14h2", key: "vft8re" }],
|
|
@@ -29332,8 +29338,8 @@ const __iconNode$15 = [
|
|
|
29332
29338
|
["path", { d: "M15 13v2", key: "1xurst" }],
|
|
29333
29339
|
["path", { d: "M9 13v2", key: "rq6x2g" }]
|
|
29334
29340
|
];
|
|
29335
|
-
const Bot = createLucideIcon("bot", __iconNode$
|
|
29336
|
-
const __iconNode$
|
|
29341
|
+
const Bot = createLucideIcon("bot", __iconNode$18);
|
|
29342
|
+
const __iconNode$17 = [
|
|
29337
29343
|
["path", { d: "M12 18V5", key: "adv99a" }],
|
|
29338
29344
|
["path", { d: "M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4", key: "1e3is1" }],
|
|
29339
29345
|
["path", { d: "M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5", key: "1gqd8o" }],
|
|
@@ -29343,57 +29349,63 @@ const __iconNode$14 = [
|
|
|
29343
29349
|
["path", { d: "M6 18a4 4 0 0 1-2-7.464", key: "k1g0md" }],
|
|
29344
29350
|
["path", { d: "M6.003 5.125a4 4 0 0 0-2.526 5.77", key: "q97ue3" }]
|
|
29345
29351
|
];
|
|
29346
|
-
const Brain = createLucideIcon("brain", __iconNode$
|
|
29347
|
-
const __iconNode$
|
|
29348
|
-
const Check = createLucideIcon("check", __iconNode$
|
|
29349
|
-
const __iconNode$
|
|
29350
|
-
const ChevronDown = createLucideIcon("chevron-down", __iconNode$
|
|
29351
|
-
const __iconNode$
|
|
29352
|
-
const ChevronLeft = createLucideIcon("chevron-left", __iconNode$
|
|
29353
|
-
const __iconNode$
|
|
29354
|
-
const ChevronRight = createLucideIcon("chevron-right", __iconNode$
|
|
29355
|
-
const __iconNode
|
|
29356
|
-
const ChevronUp = createLucideIcon("chevron-up", __iconNode
|
|
29357
|
-
const __iconNode$
|
|
29352
|
+
const Brain = createLucideIcon("brain", __iconNode$17);
|
|
29353
|
+
const __iconNode$16 = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
|
|
29354
|
+
const Check = createLucideIcon("check", __iconNode$16);
|
|
29355
|
+
const __iconNode$15 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
|
|
29356
|
+
const ChevronDown = createLucideIcon("chevron-down", __iconNode$15);
|
|
29357
|
+
const __iconNode$14 = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
|
|
29358
|
+
const ChevronLeft = createLucideIcon("chevron-left", __iconNode$14);
|
|
29359
|
+
const __iconNode$13 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
|
|
29360
|
+
const ChevronRight = createLucideIcon("chevron-right", __iconNode$13);
|
|
29361
|
+
const __iconNode$12 = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
|
|
29362
|
+
const ChevronUp = createLucideIcon("chevron-up", __iconNode$12);
|
|
29363
|
+
const __iconNode$11 = [
|
|
29358
29364
|
["path", { d: "m7 20 5-5 5 5", key: "13a0gw" }],
|
|
29359
29365
|
["path", { d: "m7 4 5 5 5-5", key: "1kwcof" }]
|
|
29360
29366
|
];
|
|
29361
|
-
const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$
|
|
29362
|
-
const __iconNode$
|
|
29367
|
+
const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$11);
|
|
29368
|
+
const __iconNode$10 = [
|
|
29363
29369
|
["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
|
|
29364
29370
|
["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
|
|
29365
29371
|
];
|
|
29366
|
-
const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$
|
|
29367
|
-
const __iconNode
|
|
29372
|
+
const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$10);
|
|
29373
|
+
const __iconNode$$ = [
|
|
29368
29374
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
29369
29375
|
["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
|
|
29370
29376
|
["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
|
|
29371
29377
|
];
|
|
29372
|
-
const CircleAlert = createLucideIcon("circle-alert", __iconNode
|
|
29373
|
-
const __iconNode$
|
|
29378
|
+
const CircleAlert = createLucideIcon("circle-alert", __iconNode$$);
|
|
29379
|
+
const __iconNode$_ = [
|
|
29374
29380
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
29375
29381
|
["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
|
|
29376
29382
|
];
|
|
29377
|
-
const CircleCheck = createLucideIcon("circle-check", __iconNode$
|
|
29378
|
-
const __iconNode$
|
|
29383
|
+
const CircleCheck = createLucideIcon("circle-check", __iconNode$_);
|
|
29384
|
+
const __iconNode$Z = [
|
|
29379
29385
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
29380
29386
|
["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
|
|
29381
29387
|
["path", { d: "M12 17h.01", key: "p32p05" }]
|
|
29382
29388
|
];
|
|
29383
|
-
const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$
|
|
29384
|
-
const __iconNode$
|
|
29385
|
-
const CircleSmall = createLucideIcon("circle-small", __iconNode$
|
|
29386
|
-
const __iconNode$
|
|
29387
|
-
|
|
29388
|
-
|
|
29389
|
+
const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$Z);
|
|
29390
|
+
const __iconNode$Y = [["circle", { cx: "12", cy: "12", r: "6", key: "1vlfrh" }]];
|
|
29391
|
+
const CircleSmall = createLucideIcon("circle-small", __iconNode$Y);
|
|
29392
|
+
const __iconNode$X = [
|
|
29393
|
+
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
29394
|
+
["path", { d: "m15 9-6 6", key: "1uzhvr" }],
|
|
29395
|
+
["path", { d: "m9 9 6 6", key: "z0biqf" }]
|
|
29396
|
+
];
|
|
29397
|
+
const CircleX = createLucideIcon("circle-x", __iconNode$X);
|
|
29398
|
+
const __iconNode$W = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
|
|
29399
|
+
const Circle = createLucideIcon("circle", __iconNode$W);
|
|
29400
|
+
const __iconNode$V = [
|
|
29389
29401
|
["path", { d: "M11 14h10", key: "1w8e9d" }],
|
|
29390
29402
|
["path", { d: "M16 4h2a2 2 0 0 1 2 2v1.344", key: "1e62lh" }],
|
|
29391
29403
|
["path", { d: "m17 18 4-4-4-4", key: "z2g111" }],
|
|
29392
29404
|
["path", { d: "M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113", key: "bjbb7m" }],
|
|
29393
29405
|
["rect", { x: "8", y: "2", width: "8", height: "4", rx: "1", key: "ublpy" }]
|
|
29394
29406
|
];
|
|
29395
|
-
const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$
|
|
29396
|
-
const __iconNode$
|
|
29407
|
+
const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$V);
|
|
29408
|
+
const __iconNode$U = [
|
|
29397
29409
|
["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
|
|
29398
29410
|
[
|
|
29399
29411
|
"path",
|
|
@@ -29403,25 +29415,31 @@ const __iconNode$S = [
|
|
|
29403
29415
|
}
|
|
29404
29416
|
]
|
|
29405
29417
|
];
|
|
29406
|
-
const Clipboard = createLucideIcon("clipboard", __iconNode$
|
|
29407
|
-
const __iconNode$
|
|
29418
|
+
const Clipboard = createLucideIcon("clipboard", __iconNode$U);
|
|
29419
|
+
const __iconNode$T = [
|
|
29420
|
+
["path", { d: "M12 6v6l4 2", key: "mmk7yg" }],
|
|
29421
|
+
["path", { d: "M22 12a10 10 0 1 0-11 9.95", key: "17dhok" }],
|
|
29422
|
+
["path", { d: "m22 16-5.5 5.5L14 19", key: "1eibut" }]
|
|
29423
|
+
];
|
|
29424
|
+
const ClockCheck = createLucideIcon("clock-check", __iconNode$T);
|
|
29425
|
+
const __iconNode$S = [
|
|
29408
29426
|
["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
|
|
29409
29427
|
["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
|
|
29410
29428
|
];
|
|
29411
|
-
const Copy = createLucideIcon("copy", __iconNode$
|
|
29412
|
-
const __iconNode$
|
|
29429
|
+
const Copy = createLucideIcon("copy", __iconNode$S);
|
|
29430
|
+
const __iconNode$R = [
|
|
29413
29431
|
["path", { d: "M12 15V3", key: "m9g1x1" }],
|
|
29414
29432
|
["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
|
|
29415
29433
|
["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
|
|
29416
29434
|
];
|
|
29417
|
-
const Download = createLucideIcon("download", __iconNode$
|
|
29418
|
-
const __iconNode$
|
|
29435
|
+
const Download = createLucideIcon("download", __iconNode$R);
|
|
29436
|
+
const __iconNode$Q = [
|
|
29419
29437
|
["path", { d: "M15 3h6v6", key: "1q9fwt" }],
|
|
29420
29438
|
["path", { d: "M10 14 21 3", key: "gplh6r" }],
|
|
29421
29439
|
["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
|
|
29422
29440
|
];
|
|
29423
|
-
const ExternalLink = createLucideIcon("external-link", __iconNode$
|
|
29424
|
-
const __iconNode$
|
|
29441
|
+
const ExternalLink = createLucideIcon("external-link", __iconNode$Q);
|
|
29442
|
+
const __iconNode$P = [
|
|
29425
29443
|
[
|
|
29426
29444
|
"path",
|
|
29427
29445
|
{
|
|
@@ -29433,8 +29451,8 @@ const __iconNode$O = [
|
|
|
29433
29451
|
["path", { d: "M10 12.5 8 15l2 2.5", key: "1tg20x" }],
|
|
29434
29452
|
["path", { d: "m14 12.5 2 2.5-2 2.5", key: "yinavb" }]
|
|
29435
29453
|
];
|
|
29436
|
-
const FileCode = createLucideIcon("file-code", __iconNode$
|
|
29437
|
-
const __iconNode$
|
|
29454
|
+
const FileCode = createLucideIcon("file-code", __iconNode$P);
|
|
29455
|
+
const __iconNode$O = [
|
|
29438
29456
|
[
|
|
29439
29457
|
"path",
|
|
29440
29458
|
{
|
|
@@ -29446,8 +29464,8 @@ const __iconNode$N = [
|
|
|
29446
29464
|
["path", { d: "M9 15h6", key: "cctwl0" }],
|
|
29447
29465
|
["path", { d: "M12 18v-6", key: "17g6i2" }]
|
|
29448
29466
|
];
|
|
29449
|
-
const FilePlus = createLucideIcon("file-plus", __iconNode$
|
|
29450
|
-
const __iconNode$
|
|
29467
|
+
const FilePlus = createLucideIcon("file-plus", __iconNode$O);
|
|
29468
|
+
const __iconNode$N = [
|
|
29451
29469
|
[
|
|
29452
29470
|
"path",
|
|
29453
29471
|
{
|
|
@@ -29460,8 +29478,8 @@ const __iconNode$M = [
|
|
|
29460
29478
|
["path", { d: "M16 13H8", key: "t4e002" }],
|
|
29461
29479
|
["path", { d: "M16 17H8", key: "z1uh3a" }]
|
|
29462
29480
|
];
|
|
29463
|
-
const FileText = createLucideIcon("file-text", __iconNode$
|
|
29464
|
-
const __iconNode$
|
|
29481
|
+
const FileText = createLucideIcon("file-text", __iconNode$N);
|
|
29482
|
+
const __iconNode$M = [
|
|
29465
29483
|
[
|
|
29466
29484
|
"path",
|
|
29467
29485
|
{
|
|
@@ -29471,8 +29489,8 @@ const __iconNode$L = [
|
|
|
29471
29489
|
],
|
|
29472
29490
|
["path", { d: "M2 10h20", key: "1ir3d8" }]
|
|
29473
29491
|
];
|
|
29474
|
-
const FolderClosed = createLucideIcon("folder-closed", __iconNode$
|
|
29475
|
-
const __iconNode$
|
|
29492
|
+
const FolderClosed = createLucideIcon("folder-closed", __iconNode$M);
|
|
29493
|
+
const __iconNode$L = [
|
|
29476
29494
|
[
|
|
29477
29495
|
"path",
|
|
29478
29496
|
{
|
|
@@ -29481,8 +29499,8 @@ const __iconNode$K = [
|
|
|
29481
29499
|
}
|
|
29482
29500
|
]
|
|
29483
29501
|
];
|
|
29484
|
-
const FolderOpen = createLucideIcon("folder-open", __iconNode$
|
|
29485
|
-
const __iconNode$
|
|
29502
|
+
const FolderOpen = createLucideIcon("folder-open", __iconNode$L);
|
|
29503
|
+
const __iconNode$K = [
|
|
29486
29504
|
["path", { d: "M12 10v6", key: "1bos4e" }],
|
|
29487
29505
|
["path", { d: "M9 13h6", key: "1uhe8q" }],
|
|
29488
29506
|
[
|
|
@@ -29493,8 +29511,8 @@ const __iconNode$J = [
|
|
|
29493
29511
|
}
|
|
29494
29512
|
]
|
|
29495
29513
|
];
|
|
29496
|
-
const FolderPlus = createLucideIcon("folder-plus", __iconNode$
|
|
29497
|
-
const __iconNode$
|
|
29514
|
+
const FolderPlus = createLucideIcon("folder-plus", __iconNode$K);
|
|
29515
|
+
const __iconNode$J = [
|
|
29498
29516
|
[
|
|
29499
29517
|
"path",
|
|
29500
29518
|
{
|
|
@@ -29503,8 +29521,8 @@ const __iconNode$I = [
|
|
|
29503
29521
|
}
|
|
29504
29522
|
]
|
|
29505
29523
|
];
|
|
29506
|
-
const Folder$1 = createLucideIcon("folder", __iconNode$
|
|
29507
|
-
const __iconNode$
|
|
29524
|
+
const Folder$1 = createLucideIcon("folder", __iconNode$J);
|
|
29525
|
+
const __iconNode$I = [
|
|
29508
29526
|
[
|
|
29509
29527
|
"path",
|
|
29510
29528
|
{
|
|
@@ -29517,20 +29535,20 @@ const __iconNode$H = [
|
|
|
29517
29535
|
{ d: "M3 8.268a2 2 0 0 0-1 1.738V19a2 2 0 0 0 2 2h11a2 2 0 0 0 1.732-1", key: "yxbcw3" }
|
|
29518
29536
|
]
|
|
29519
29537
|
];
|
|
29520
|
-
const Folders = createLucideIcon("folders", __iconNode$
|
|
29521
|
-
const __iconNode$
|
|
29538
|
+
const Folders = createLucideIcon("folders", __iconNode$I);
|
|
29539
|
+
const __iconNode$H = [
|
|
29522
29540
|
["path", { d: "M15 6a9 9 0 0 0-9 9V3", key: "1cii5b" }],
|
|
29523
29541
|
["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
|
|
29524
29542
|
["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }]
|
|
29525
29543
|
];
|
|
29526
|
-
const GitBranch = createLucideIcon("git-branch", __iconNode$
|
|
29527
|
-
const __iconNode$
|
|
29544
|
+
const GitBranch = createLucideIcon("git-branch", __iconNode$H);
|
|
29545
|
+
const __iconNode$G = [
|
|
29528
29546
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
29529
29547
|
["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
|
|
29530
29548
|
["path", { d: "M2 12h20", key: "9i4pu4" }]
|
|
29531
29549
|
];
|
|
29532
|
-
const Globe = createLucideIcon("globe", __iconNode$
|
|
29533
|
-
const __iconNode$
|
|
29550
|
+
const Globe = createLucideIcon("globe", __iconNode$G);
|
|
29551
|
+
const __iconNode$F = [
|
|
29534
29552
|
["circle", { cx: "9", cy: "12", r: "1", key: "1vctgf" }],
|
|
29535
29553
|
["circle", { cx: "9", cy: "5", r: "1", key: "hp0tcf" }],
|
|
29536
29554
|
["circle", { cx: "9", cy: "19", r: "1", key: "fkjjf6" }],
|
|
@@ -29538,8 +29556,8 @@ const __iconNode$E = [
|
|
|
29538
29556
|
["circle", { cx: "15", cy: "5", r: "1", key: "19l28e" }],
|
|
29539
29557
|
["circle", { cx: "15", cy: "19", r: "1", key: "f4zoj3" }]
|
|
29540
29558
|
];
|
|
29541
|
-
const GripVertical = createLucideIcon("grip-vertical", __iconNode$
|
|
29542
|
-
const __iconNode$
|
|
29559
|
+
const GripVertical = createLucideIcon("grip-vertical", __iconNode$F);
|
|
29560
|
+
const __iconNode$E = [
|
|
29543
29561
|
["path", { d: "m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9", key: "1hayfq" }],
|
|
29544
29562
|
["path", { d: "m18 15 4-4", key: "16gjal" }],
|
|
29545
29563
|
[
|
|
@@ -29550,8 +29568,8 @@ const __iconNode$D = [
|
|
|
29550
29568
|
}
|
|
29551
29569
|
]
|
|
29552
29570
|
];
|
|
29553
|
-
const Hammer = createLucideIcon("hammer", __iconNode$
|
|
29554
|
-
const __iconNode$
|
|
29571
|
+
const Hammer = createLucideIcon("hammer", __iconNode$E);
|
|
29572
|
+
const __iconNode$D = [
|
|
29555
29573
|
["path", { d: "M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8", key: "5wwlr5" }],
|
|
29556
29574
|
[
|
|
29557
29575
|
"path",
|
|
@@ -29561,27 +29579,27 @@ const __iconNode$C = [
|
|
|
29561
29579
|
}
|
|
29562
29580
|
]
|
|
29563
29581
|
];
|
|
29564
|
-
const House = createLucideIcon("house", __iconNode$
|
|
29565
|
-
const __iconNode$
|
|
29582
|
+
const House = createLucideIcon("house", __iconNode$D);
|
|
29583
|
+
const __iconNode$C = [
|
|
29566
29584
|
["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
|
|
29567
29585
|
["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
|
|
29568
29586
|
["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
|
|
29569
29587
|
];
|
|
29570
|
-
const Image$1 = createLucideIcon("image", __iconNode$
|
|
29571
|
-
const __iconNode$
|
|
29588
|
+
const Image$1 = createLucideIcon("image", __iconNode$C);
|
|
29589
|
+
const __iconNode$B = [
|
|
29572
29590
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
29573
29591
|
["path", { d: "M12 16v-4", key: "1dtifu" }],
|
|
29574
29592
|
["path", { d: "M12 8h.01", key: "e9boi3" }]
|
|
29575
29593
|
];
|
|
29576
|
-
const Info$1 = createLucideIcon("info", __iconNode$
|
|
29577
|
-
const __iconNode$
|
|
29594
|
+
const Info$1 = createLucideIcon("info", __iconNode$B);
|
|
29595
|
+
const __iconNode$A = [
|
|
29578
29596
|
["path", { d: "m16 6 4 14", key: "ji33uf" }],
|
|
29579
29597
|
["path", { d: "M12 6v14", key: "1n7gus" }],
|
|
29580
29598
|
["path", { d: "M8 8v12", key: "1gg7y9" }],
|
|
29581
29599
|
["path", { d: "M4 4v16", key: "6qkkli" }]
|
|
29582
29600
|
];
|
|
29583
|
-
const Library = createLucideIcon("library", __iconNode$
|
|
29584
|
-
const __iconNode$
|
|
29601
|
+
const Library = createLucideIcon("library", __iconNode$A);
|
|
29602
|
+
const __iconNode$z = [
|
|
29585
29603
|
[
|
|
29586
29604
|
"path",
|
|
29587
29605
|
{
|
|
@@ -29592,23 +29610,23 @@ const __iconNode$y = [
|
|
|
29592
29610
|
["path", { d: "M9 18h6", key: "x1upvd" }],
|
|
29593
29611
|
["path", { d: "M10 22h4", key: "ceow96" }]
|
|
29594
29612
|
];
|
|
29595
|
-
const Lightbulb = createLucideIcon("lightbulb", __iconNode$
|
|
29596
|
-
const __iconNode$
|
|
29613
|
+
const Lightbulb = createLucideIcon("lightbulb", __iconNode$z);
|
|
29614
|
+
const __iconNode$y = [
|
|
29597
29615
|
["path", { d: "M9 17H7A5 5 0 0 1 7 7", key: "10o201" }],
|
|
29598
29616
|
["path", { d: "M15 7h2a5 5 0 0 1 4 8", key: "1d3206" }],
|
|
29599
29617
|
["line", { x1: "8", x2: "12", y1: "12", y2: "12", key: "rvw6j4" }],
|
|
29600
29618
|
["line", { x1: "2", x2: "22", y1: "2", y2: "22", key: "a6p6uj" }]
|
|
29601
29619
|
];
|
|
29602
|
-
const Link2Off = createLucideIcon("link-2-off", __iconNode$
|
|
29603
|
-
const __iconNode$
|
|
29620
|
+
const Link2Off = createLucideIcon("link-2-off", __iconNode$y);
|
|
29621
|
+
const __iconNode$x = [
|
|
29604
29622
|
["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
|
|
29605
29623
|
["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
|
|
29606
29624
|
["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
|
|
29607
29625
|
];
|
|
29608
|
-
const Link2 = createLucideIcon("link-2", __iconNode$
|
|
29609
|
-
const __iconNode$
|
|
29610
|
-
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$
|
|
29611
|
-
const __iconNode$
|
|
29626
|
+
const Link2 = createLucideIcon("link-2", __iconNode$x);
|
|
29627
|
+
const __iconNode$w = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
|
|
29628
|
+
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$w);
|
|
29629
|
+
const __iconNode$v = [
|
|
29612
29630
|
[
|
|
29613
29631
|
"path",
|
|
29614
29632
|
{
|
|
@@ -29619,8 +29637,8 @@ const __iconNode$u = [
|
|
|
29619
29637
|
["path", { d: "M8 12h8", key: "1wcyev" }],
|
|
29620
29638
|
["path", { d: "M12 8v8", key: "napkw2" }]
|
|
29621
29639
|
];
|
|
29622
|
-
const MessageCirclePlus = createLucideIcon("message-circle-plus", __iconNode$
|
|
29623
|
-
const __iconNode$
|
|
29640
|
+
const MessageCirclePlus = createLucideIcon("message-circle-plus", __iconNode$v);
|
|
29641
|
+
const __iconNode$u = [
|
|
29624
29642
|
[
|
|
29625
29643
|
"path",
|
|
29626
29644
|
{
|
|
@@ -29629,8 +29647,8 @@ const __iconNode$t = [
|
|
|
29629
29647
|
}
|
|
29630
29648
|
]
|
|
29631
29649
|
];
|
|
29632
|
-
const MessageCircle = createLucideIcon("message-circle", __iconNode$
|
|
29633
|
-
const __iconNode$
|
|
29650
|
+
const MessageCircle = createLucideIcon("message-circle", __iconNode$u);
|
|
29651
|
+
const __iconNode$t = [
|
|
29634
29652
|
[
|
|
29635
29653
|
"path",
|
|
29636
29654
|
{
|
|
@@ -29641,8 +29659,8 @@ const __iconNode$s = [
|
|
|
29641
29659
|
["path", { d: "M12 8v6", key: "1ib9pf" }],
|
|
29642
29660
|
["path", { d: "M9 11h6", key: "1fldmi" }]
|
|
29643
29661
|
];
|
|
29644
|
-
const MessageSquarePlus = createLucideIcon("message-square-plus", __iconNode$
|
|
29645
|
-
const __iconNode$
|
|
29662
|
+
const MessageSquarePlus = createLucideIcon("message-square-plus", __iconNode$t);
|
|
29663
|
+
const __iconNode$s = [
|
|
29646
29664
|
[
|
|
29647
29665
|
"path",
|
|
29648
29666
|
{
|
|
@@ -29651,10 +29669,10 @@ const __iconNode$r = [
|
|
|
29651
29669
|
}
|
|
29652
29670
|
]
|
|
29653
29671
|
];
|
|
29654
|
-
const MessageSquare = createLucideIcon("message-square", __iconNode$
|
|
29655
|
-
const __iconNode$
|
|
29656
|
-
const Minus = createLucideIcon("minus", __iconNode$
|
|
29657
|
-
const __iconNode$
|
|
29672
|
+
const MessageSquare = createLucideIcon("message-square", __iconNode$s);
|
|
29673
|
+
const __iconNode$r = [["path", { d: "M5 12h14", key: "1ays0h" }]];
|
|
29674
|
+
const Minus = createLucideIcon("minus", __iconNode$r);
|
|
29675
|
+
const __iconNode$q = [
|
|
29658
29676
|
["path", { d: "M12 2v20", key: "t6zp3m" }],
|
|
29659
29677
|
["path", { d: "m15 19-3 3-3-3", key: "11eu04" }],
|
|
29660
29678
|
["path", { d: "m19 9 3 3-3 3", key: "1mg7y2" }],
|
|
@@ -29662,8 +29680,8 @@ const __iconNode$p = [
|
|
|
29662
29680
|
["path", { d: "m5 9-3 3 3 3", key: "j64kie" }],
|
|
29663
29681
|
["path", { d: "m9 5 3-3 3 3", key: "l8vdw6" }]
|
|
29664
29682
|
];
|
|
29665
|
-
const Move = createLucideIcon("move", __iconNode$
|
|
29666
|
-
const __iconNode$
|
|
29683
|
+
const Move = createLucideIcon("move", __iconNode$q);
|
|
29684
|
+
const __iconNode$p = [
|
|
29667
29685
|
["path", { d: "M2 6h4", key: "aawbzj" }],
|
|
29668
29686
|
["path", { d: "M2 10h4", key: "l0bgd4" }],
|
|
29669
29687
|
["path", { d: "M2 14h4", key: "1gsvsf" }],
|
|
@@ -29671,8 +29689,8 @@ const __iconNode$o = [
|
|
|
29671
29689
|
["rect", { width: "16", height: "20", x: "4", y: "2", rx: "2", key: "1nb95v" }],
|
|
29672
29690
|
["path", { d: "M16 2v20", key: "rotuqe" }]
|
|
29673
29691
|
];
|
|
29674
|
-
const Notebook = createLucideIcon("notebook", __iconNode$
|
|
29675
|
-
const __iconNode$
|
|
29692
|
+
const Notebook = createLucideIcon("notebook", __iconNode$p);
|
|
29693
|
+
const __iconNode$o = [
|
|
29676
29694
|
["path", { d: "m15 9-6 6", key: "1uzhvr" }],
|
|
29677
29695
|
[
|
|
29678
29696
|
"path",
|
|
@@ -29683,8 +29701,8 @@ const __iconNode$n = [
|
|
|
29683
29701
|
],
|
|
29684
29702
|
["path", { d: "m9 9 6 6", key: "z0biqf" }]
|
|
29685
29703
|
];
|
|
29686
|
-
const OctagonX = createLucideIcon("octagon-x", __iconNode$
|
|
29687
|
-
const __iconNode$
|
|
29704
|
+
const OctagonX = createLucideIcon("octagon-x", __iconNode$o);
|
|
29705
|
+
const __iconNode$n = [
|
|
29688
29706
|
["path", { d: "M12 22V12", key: "d0xqtd" }],
|
|
29689
29707
|
["path", { d: "M20.27 18.27 22 20", key: "er2am" }],
|
|
29690
29708
|
[
|
|
@@ -29698,8 +29716,8 @@ const __iconNode$m = [
|
|
|
29698
29716
|
["path", { d: "m7.5 4.27 8.997 5.148", key: "9yrvtv" }],
|
|
29699
29717
|
["circle", { cx: "18.5", cy: "16.5", r: "2.5", key: "ke13xx" }]
|
|
29700
29718
|
];
|
|
29701
|
-
const PackageSearch = createLucideIcon("package-search", __iconNode$
|
|
29702
|
-
const __iconNode$
|
|
29719
|
+
const PackageSearch = createLucideIcon("package-search", __iconNode$n);
|
|
29720
|
+
const __iconNode$m = [
|
|
29703
29721
|
[
|
|
29704
29722
|
"path",
|
|
29705
29723
|
{
|
|
@@ -29708,8 +29726,8 @@ const __iconNode$l = [
|
|
|
29708
29726
|
}
|
|
29709
29727
|
]
|
|
29710
29728
|
];
|
|
29711
|
-
const Paperclip = createLucideIcon("paperclip", __iconNode$
|
|
29712
|
-
const __iconNode$
|
|
29729
|
+
const Paperclip = createLucideIcon("paperclip", __iconNode$m);
|
|
29730
|
+
const __iconNode$l = [
|
|
29713
29731
|
[
|
|
29714
29732
|
"path",
|
|
29715
29733
|
{
|
|
@@ -29719,7 +29737,17 @@ const __iconNode$k = [
|
|
|
29719
29737
|
],
|
|
29720
29738
|
["path", { d: "m15 5 4 4", key: "1mk7zo" }]
|
|
29721
29739
|
];
|
|
29722
|
-
const Pencil = createLucideIcon("pencil", __iconNode$
|
|
29740
|
+
const Pencil = createLucideIcon("pencil", __iconNode$l);
|
|
29741
|
+
const __iconNode$k = [
|
|
29742
|
+
[
|
|
29743
|
+
"path",
|
|
29744
|
+
{
|
|
29745
|
+
d: "M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",
|
|
29746
|
+
key: "10ikf1"
|
|
29747
|
+
}
|
|
29748
|
+
]
|
|
29749
|
+
];
|
|
29750
|
+
const Play = createLucideIcon("play", __iconNode$k);
|
|
29723
29751
|
const __iconNode$j = [
|
|
29724
29752
|
["path", { d: "M5 12h14", key: "1ays0h" }],
|
|
29725
29753
|
["path", { d: "M12 5v14", key: "s699le" }]
|
|
@@ -41226,6 +41254,17 @@ function Sidebar() {
|
|
|
41226
41254
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal select-none uppercase", children: t2("sidebar.skills") })
|
|
41227
41255
|
]
|
|
41228
41256
|
}
|
|
41257
|
+
),
|
|
41258
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41259
|
+
"div",
|
|
41260
|
+
{
|
|
41261
|
+
onClick: () => handleNavigate("/automation"),
|
|
41262
|
+
className: `mt-0.5 group flex h-8 cursor-default items-center gap-2 rounded-md px-1.5 text-xs font-normal transition-colors ${currentPath.startsWith("/automation") ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground/95"}`,
|
|
41263
|
+
children: [
|
|
41264
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ClockCheck, { className: "size-3.5" }),
|
|
41265
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal select-none uppercase", children: t2("sidebar.automation", "Automation") })
|
|
41266
|
+
]
|
|
41267
|
+
}
|
|
41229
41268
|
)
|
|
41230
41269
|
] }),
|
|
41231
41270
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3 pb-2 pt-2", children: [
|
|
@@ -41943,7 +41982,7 @@ function Welcome() {
|
|
|
41943
41982
|
children: [
|
|
41944
41983
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "absolute bottom-3 right-4 text-[11px] text-muted-foreground/40 z-10 pointer-events-none", children: [
|
|
41945
41984
|
"v",
|
|
41946
|
-
"0.1.
|
|
41985
|
+
"0.1.29"
|
|
41947
41986
|
] }),
|
|
41948
41987
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41949
41988
|
"div",
|
|
@@ -68611,7 +68650,7 @@ var lr$2 = (e2) => {
|
|
|
68611
68650
|
for (; t2 > 0 && e2[t2 - 1] === `
|
|
68612
68651
|
`; ) t2--;
|
|
68613
68652
|
return e2.slice(0, t2);
|
|
68614
|
-
}, cr$1 = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-OFNGDK62-
|
|
68653
|
+
}, cr$1 = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-OFNGDK62-DQWoSdTY.js"), true ? [] : void 0, import.meta.url).then((e2) => ({ default: e2.HighlightedCodeBlockBody }))), st$4 = ({ code: e2, language: t2, className: o4, children: n2, isIncomplete: r3 = false, startLine: s16, lineNumbers: a2, ...l6 }) => {
|
|
68615
68654
|
let i3 = y$9(), d2 = reactExports.useMemo(() => lr$2(e2), [e2]), c2 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: d2.split(`
|
|
68616
68655
|
`).map((p3) => [{ content: p3, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [d2]);
|
|
68617
68656
|
return jsxRuntimeExports.jsx(nt$4.Provider, { value: { code: e2 }, children: jsxRuntimeExports.jsxs(ot$4, { isIncomplete: r3, language: t2, children: [jsxRuntimeExports.jsx(rt$3, { language: t2 }), n2 ? jsxRuntimeExports.jsx("div", { className: i3("pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end"), children: jsxRuntimeExports.jsx("div", { className: i3("pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur"), "data-streamdown": "code-block-actions", children: n2 }) }) : null, jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: jsxRuntimeExports.jsx(At$2, { className: o4, language: t2, lineNumbers: a2, result: c2, startLine: s16, ...l6 }), children: jsxRuntimeExports.jsx(cr$1, { className: o4, code: d2, language: t2, lineNumbers: a2, raw: c2, startLine: s16, ...l6 }) })] }) });
|
|
@@ -93452,12 +93491,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
|
|
|
93452
93491
|
registerLayoutLoaders([
|
|
93453
93492
|
{
|
|
93454
93493
|
name: "dagre",
|
|
93455
|
-
loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-KV5264BT-
|
|
93494
|
+
loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-KV5264BT-4I0h4wyh.js"), true ? __vite__mapDeps([0,1,2,3,4,5]) : void 0, import.meta.url), "loader")
|
|
93456
93495
|
},
|
|
93457
93496
|
...[
|
|
93458
93497
|
{
|
|
93459
93498
|
name: "cose-bilkent",
|
|
93460
|
-
loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-
|
|
93499
|
+
loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-lCfWcP6y.js"), true ? __vite__mapDeps([6,7]) : void 0, import.meta.url), "loader")
|
|
93461
93500
|
}
|
|
93462
93501
|
]
|
|
93463
93502
|
]);
|
|
@@ -93913,7 +93952,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
|
|
|
93913
93952
|
}, "detector");
|
|
93914
93953
|
var loader = /* @__PURE__ */ __name(async () => {
|
|
93915
93954
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93916
|
-
const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-
|
|
93955
|
+
const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-Co_b_6bH.js");
|
|
93917
93956
|
return { diagram: diagram22 };
|
|
93918
93957
|
}, true ? __vite__mapDeps([8,9]) : void 0, import.meta.url);
|
|
93919
93958
|
return { id, diagram: diagram2 };
|
|
@@ -93933,7 +93972,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
93933
93972
|
}, "detector");
|
|
93934
93973
|
var loader2 = /* @__PURE__ */ __name(async () => {
|
|
93935
93974
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93936
|
-
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-
|
|
93975
|
+
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-Dfg0LLup.js");
|
|
93937
93976
|
return { diagram: diagram22 };
|
|
93938
93977
|
}, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
|
|
93939
93978
|
return { id: id2, diagram: diagram2 };
|
|
@@ -93959,7 +93998,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
93959
93998
|
}, "detector");
|
|
93960
93999
|
var loader3 = /* @__PURE__ */ __name(async () => {
|
|
93961
94000
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93962
|
-
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-
|
|
94001
|
+
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-Dfg0LLup.js");
|
|
93963
94002
|
return { diagram: diagram22 };
|
|
93964
94003
|
}, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
|
|
93965
94004
|
return { id: id3, diagram: diagram2 };
|
|
@@ -93976,7 +94015,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
|
|
|
93976
94015
|
}, "detector");
|
|
93977
94016
|
var loader4 = /* @__PURE__ */ __name(async () => {
|
|
93978
94017
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93979
|
-
const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-
|
|
94018
|
+
const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-Bk9QFZ27.js");
|
|
93980
94019
|
return { diagram: diagram22 };
|
|
93981
94020
|
}, true ? __vite__mapDeps([15,12,13,14]) : void 0, import.meta.url);
|
|
93982
94021
|
return { id: id4, diagram: diagram2 };
|
|
@@ -93993,7 +94032,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
|
|
|
93993
94032
|
}, "detector");
|
|
93994
94033
|
var loader5 = /* @__PURE__ */ __name(async () => {
|
|
93995
94034
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93996
|
-
const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-
|
|
94035
|
+
const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-C74WBszH.js");
|
|
93997
94036
|
return { diagram: diagram22 };
|
|
93998
94037
|
}, true ? __vite__mapDeps([16,17,18,19,4,2]) : void 0, import.meta.url);
|
|
93999
94038
|
return { id: id5, diagram: diagram2 };
|
|
@@ -94010,7 +94049,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
|
|
|
94010
94049
|
}, "detector");
|
|
94011
94050
|
var loader6 = /* @__PURE__ */ __name(async () => {
|
|
94012
94051
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94013
|
-
const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-
|
|
94052
|
+
const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-lTjaJTs0.js");
|
|
94014
94053
|
return { diagram: diagram22 };
|
|
94015
94054
|
}, true ? __vite__mapDeps([20,21,22,23]) : void 0, import.meta.url);
|
|
94016
94055
|
return { id: id6, diagram: diagram2 };
|
|
@@ -94027,7 +94066,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
|
|
|
94027
94066
|
}, "detector");
|
|
94028
94067
|
var loader7 = /* @__PURE__ */ __name(async () => {
|
|
94029
94068
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94030
|
-
const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-
|
|
94069
|
+
const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-CR4ZLAM1.js");
|
|
94031
94070
|
return { diagram: diagram22 };
|
|
94032
94071
|
}, true ? __vite__mapDeps([24,19,4,2]) : void 0, import.meta.url);
|
|
94033
94072
|
return { id: id7, diagram: diagram2 };
|
|
@@ -94043,7 +94082,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
|
|
|
94043
94082
|
}, "detector");
|
|
94044
94083
|
var loader8 = /* @__PURE__ */ __name(async () => {
|
|
94045
94084
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94046
|
-
const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-
|
|
94085
|
+
const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-C8AxK_-F.js");
|
|
94047
94086
|
return { diagram: diagram22 };
|
|
94048
94087
|
}, true ? __vite__mapDeps([25,17,19,4,2,26,27,22]) : void 0, import.meta.url);
|
|
94049
94088
|
return { id: id8, diagram: diagram2 };
|
|
@@ -94059,7 +94098,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
|
|
|
94059
94098
|
}, "detector");
|
|
94060
94099
|
var loader9 = /* @__PURE__ */ __name(async () => {
|
|
94061
94100
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94062
|
-
const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-
|
|
94101
|
+
const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-BdiZmi7w.js");
|
|
94063
94102
|
return { diagram: diagram22 };
|
|
94064
94103
|
}, true ? __vite__mapDeps([28,21,22,23]) : void 0, import.meta.url);
|
|
94065
94104
|
return { id: id9, diagram: diagram2 };
|
|
@@ -94076,7 +94115,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
|
|
|
94076
94115
|
}, "detector");
|
|
94077
94116
|
var loader10 = /* @__PURE__ */ __name(async () => {
|
|
94078
94117
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94079
|
-
const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND-
|
|
94118
|
+
const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND-J9z4uuMK.js");
|
|
94080
94119
|
return { diagram: diagram22 };
|
|
94081
94120
|
}, true ? __vite__mapDeps([29,22,27,21,23]) : void 0, import.meta.url);
|
|
94082
94121
|
return { id: id10, diagram: diagram2 };
|
|
@@ -94093,7 +94132,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
|
|
|
94093
94132
|
}, "detector");
|
|
94094
94133
|
var loader11 = /* @__PURE__ */ __name(async () => {
|
|
94095
94134
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94096
|
-
const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-
|
|
94135
|
+
const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-BHIfl5Tz.js");
|
|
94097
94136
|
return { diagram: diagram22 };
|
|
94098
94137
|
}, true ? __vite__mapDeps([30,12,13]) : void 0, import.meta.url);
|
|
94099
94138
|
return { id: id11, diagram: diagram2 };
|
|
@@ -94110,7 +94149,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
|
|
|
94110
94149
|
}, "detector");
|
|
94111
94150
|
var loader12 = /* @__PURE__ */ __name(async () => {
|
|
94112
94151
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94113
|
-
const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-
|
|
94152
|
+
const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-COKEbCYM.js");
|
|
94114
94153
|
return { diagram: diagram22 };
|
|
94115
94154
|
}, true ? __vite__mapDeps([31,9,18]) : void 0, import.meta.url);
|
|
94116
94155
|
return { id: id12, diagram: diagram2 };
|
|
@@ -94130,7 +94169,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
94130
94169
|
}, "detector");
|
|
94131
94170
|
var loader13 = /* @__PURE__ */ __name(async () => {
|
|
94132
94171
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94133
|
-
const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-
|
|
94172
|
+
const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-OFMeoPav.js");
|
|
94134
94173
|
return { diagram: diagram22 };
|
|
94135
94174
|
}, true ? __vite__mapDeps([32,33,11,9,12,13]) : void 0, import.meta.url);
|
|
94136
94175
|
return { id: id13, diagram: diagram2 };
|
|
@@ -94150,7 +94189,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
94150
94189
|
}, "detector");
|
|
94151
94190
|
var loader14 = /* @__PURE__ */ __name(async () => {
|
|
94152
94191
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94153
|
-
const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-
|
|
94192
|
+
const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-OFMeoPav.js");
|
|
94154
94193
|
return { diagram: diagram22 };
|
|
94155
94194
|
}, true ? __vite__mapDeps([34,33,11,9,12,13]) : void 0, import.meta.url);
|
|
94156
94195
|
return { id: id14, diagram: diagram2 };
|
|
@@ -94170,7 +94209,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
94170
94209
|
}, "detector");
|
|
94171
94210
|
var loader15 = /* @__PURE__ */ __name(async () => {
|
|
94172
94211
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94173
|
-
const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-
|
|
94212
|
+
const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-7zRGBf7O.js");
|
|
94174
94213
|
return { diagram: diagram22 };
|
|
94175
94214
|
}, true ? __vite__mapDeps([35,36,12,13,1,2,3,4]) : void 0, import.meta.url);
|
|
94176
94215
|
return { id: id15, diagram: diagram2 };
|
|
@@ -94193,7 +94232,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
94193
94232
|
}, "detector");
|
|
94194
94233
|
var loader16 = /* @__PURE__ */ __name(async () => {
|
|
94195
94234
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94196
|
-
const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2-
|
|
94235
|
+
const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2-BqHJ_ZBX.js");
|
|
94197
94236
|
return { diagram: diagram22 };
|
|
94198
94237
|
}, true ? __vite__mapDeps([37,36,12,13]) : void 0, import.meta.url);
|
|
94199
94238
|
return { id: id16, diagram: diagram2 };
|
|
@@ -94210,7 +94249,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
|
|
|
94210
94249
|
}, "detector");
|
|
94211
94250
|
var loader17 = /* @__PURE__ */ __name(async () => {
|
|
94212
94251
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94213
|
-
const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-
|
|
94252
|
+
const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-Ds2OL3Lo.js");
|
|
94214
94253
|
return { diagram: diagram22 };
|
|
94215
94254
|
}, true ? __vite__mapDeps([38,11,9,26]) : void 0, import.meta.url);
|
|
94216
94255
|
return { id: id17, diagram: diagram2 };
|
|
@@ -94280,7 +94319,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
|
|
|
94280
94319
|
}, "detector");
|
|
94281
94320
|
var loader18 = /* @__PURE__ */ __name(async () => {
|
|
94282
94321
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94283
|
-
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-
|
|
94322
|
+
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-Dfg0LLup.js");
|
|
94284
94323
|
return { diagram: diagram22 };
|
|
94285
94324
|
}, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
|
|
94286
94325
|
return { id: id18, diagram: diagram2 };
|
|
@@ -94297,7 +94336,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
|
|
|
94297
94336
|
}, "detector");
|
|
94298
94337
|
var loader19 = /* @__PURE__ */ __name(async () => {
|
|
94299
94338
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94300
|
-
const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-
|
|
94339
|
+
const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-AvZAT5J-.js");
|
|
94301
94340
|
return { diagram: diagram22 };
|
|
94302
94341
|
}, true ? __vite__mapDeps([39,26]) : void 0, import.meta.url);
|
|
94303
94342
|
return { id: id19, diagram: diagram2 };
|
|
@@ -94314,7 +94353,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
|
|
|
94314
94353
|
}, "detector");
|
|
94315
94354
|
var loader20 = /* @__PURE__ */ __name(async () => {
|
|
94316
94355
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94317
|
-
const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-
|
|
94356
|
+
const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-C3U3xkIJ.js");
|
|
94318
94357
|
return { diagram: diagram22 };
|
|
94319
94358
|
}, true ? __vite__mapDeps([40,12,13]) : void 0, import.meta.url);
|
|
94320
94359
|
return { id: id20, diagram: diagram2 };
|
|
@@ -94331,7 +94370,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
|
|
|
94331
94370
|
}, "detector");
|
|
94332
94371
|
var loader21 = /* @__PURE__ */ __name(async () => {
|
|
94333
94372
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94334
|
-
const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-
|
|
94373
|
+
const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-CZ1CZVyP.js");
|
|
94335
94374
|
return { diagram: diagram22 };
|
|
94336
94375
|
}, true ? __vite__mapDeps([41,11]) : void 0, import.meta.url);
|
|
94337
94376
|
return { id: id21, diagram: diagram2 };
|
|
@@ -94348,7 +94387,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
|
|
|
94348
94387
|
}, "detector");
|
|
94349
94388
|
var loader22 = /* @__PURE__ */ __name(async () => {
|
|
94350
94389
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94351
|
-
const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-
|
|
94390
|
+
const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-SthTR8cL.js");
|
|
94352
94391
|
return { diagram: diagram22 };
|
|
94353
94392
|
}, true ? __vite__mapDeps([42,27,22]) : void 0, import.meta.url);
|
|
94354
94393
|
return { id: id22, diagram: diagram2 };
|
|
@@ -94365,7 +94404,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
|
|
|
94365
94404
|
}, "detector");
|
|
94366
94405
|
var loader23 = /* @__PURE__ */ __name(async () => {
|
|
94367
94406
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94368
|
-
const { diagram: diagram22 } = await import("./diagram-TYMM5635-
|
|
94407
|
+
const { diagram: diagram22 } = await import("./diagram-TYMM5635-aF8hIDx1.js");
|
|
94369
94408
|
return { diagram: diagram22 };
|
|
94370
94409
|
}, true ? __vite__mapDeps([43,17,19,4,2]) : void 0, import.meta.url);
|
|
94371
94410
|
return { id: id23, diagram: diagram2 };
|
|
@@ -94381,7 +94420,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
|
|
|
94381
94420
|
}, "detector");
|
|
94382
94421
|
var loader24 = /* @__PURE__ */ __name(async () => {
|
|
94383
94422
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94384
|
-
const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-
|
|
94423
|
+
const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-Di6wZV6-.js");
|
|
94385
94424
|
return { diagram: diagram22 };
|
|
94386
94425
|
}, true ? __vite__mapDeps([44,17,19,4,2]) : void 0, import.meta.url);
|
|
94387
94426
|
return { id: id24, diagram: diagram2 };
|
|
@@ -94397,7 +94436,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
|
|
|
94397
94436
|
}, "detector");
|
|
94398
94437
|
var loader25 = /* @__PURE__ */ __name(async () => {
|
|
94399
94438
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94400
|
-
const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-
|
|
94439
|
+
const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-6liCvTXv.js");
|
|
94401
94440
|
return { diagram: diagram22 };
|
|
94402
94441
|
}, true ? __vite__mapDeps([45,11,5,1,2,14]) : void 0, import.meta.url);
|
|
94403
94442
|
return { id: id25, diagram: diagram2 };
|
|
@@ -94414,7 +94453,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
|
|
|
94414
94453
|
}, "detector");
|
|
94415
94454
|
var loader26 = /* @__PURE__ */ __name(async () => {
|
|
94416
94455
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94417
|
-
const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-
|
|
94456
|
+
const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-C1mEpAlt.js");
|
|
94418
94457
|
return { diagram: diagram22 };
|
|
94419
94458
|
}, true ? __vite__mapDeps([46,17,18,19,4,2]) : void 0, import.meta.url);
|
|
94420
94459
|
return { id: id26, diagram: diagram2 };
|
|
@@ -94431,7 +94470,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
|
|
|
94431
94470
|
}, "detector");
|
|
94432
94471
|
var loader27 = /* @__PURE__ */ __name(async () => {
|
|
94433
94472
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94434
|
-
const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-
|
|
94473
|
+
const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-C31yFVWH.js");
|
|
94435
94474
|
return { diagram: diagram22 };
|
|
94436
94475
|
}, true ? __vite__mapDeps([47,17,19,4,2,7]) : void 0, import.meta.url);
|
|
94437
94476
|
return { id: id27, diagram: diagram2 };
|
|
@@ -94448,7 +94487,7 @@ var detector28 = /* @__PURE__ */ __name((txt) => {
|
|
|
94448
94487
|
}, "detector");
|
|
94449
94488
|
var loader28 = /* @__PURE__ */ __name(async () => {
|
|
94450
94489
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94451
|
-
const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-
|
|
94490
|
+
const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-uXL-4FGw.js");
|
|
94452
94491
|
return { diagram: diagram22 };
|
|
94453
94492
|
}, true ? [] : void 0, import.meta.url);
|
|
94454
94493
|
return { id: id28, diagram: diagram2 };
|
|
@@ -94464,7 +94503,7 @@ var detector29 = /* @__PURE__ */ __name((txt) => {
|
|
|
94464
94503
|
}, "detector");
|
|
94465
94504
|
var loader29 = /* @__PURE__ */ __name(async () => {
|
|
94466
94505
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94467
|
-
const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-
|
|
94506
|
+
const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-oSTndBDY.js");
|
|
94468
94507
|
return { diagram: diagram22 };
|
|
94469
94508
|
}, true ? [] : void 0, import.meta.url);
|
|
94470
94509
|
return { id: id29, diagram: diagram2 };
|
|
@@ -94481,7 +94520,7 @@ var detector30 = /* @__PURE__ */ __name((txt) => {
|
|
|
94481
94520
|
}, "detector");
|
|
94482
94521
|
var loader30 = /* @__PURE__ */ __name(async () => {
|
|
94483
94522
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94484
|
-
const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-
|
|
94523
|
+
const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-C_g_DZm9.js");
|
|
94485
94524
|
return { diagram: diagram22 };
|
|
94486
94525
|
}, true ? __vite__mapDeps([48,13,17,19,4,2,23,27,22]) : void 0, import.meta.url);
|
|
94487
94526
|
return { id: id30, diagram: diagram2 };
|
|
@@ -94497,7 +94536,7 @@ var detector31 = /* @__PURE__ */ __name((text2) => {
|
|
|
94497
94536
|
}, "detector");
|
|
94498
94537
|
var loader31 = /* @__PURE__ */ __name(async () => {
|
|
94499
94538
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94500
|
-
const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-
|
|
94539
|
+
const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-Dv2kSOMM.js");
|
|
94501
94540
|
return { diagram: diagram22 };
|
|
94502
94541
|
}, true ? __vite__mapDeps([49,17,19,4,2]) : void 0, import.meta.url);
|
|
94503
94542
|
return { id: id31, diagram: diagram2 };
|
|
@@ -101355,7 +101394,7 @@ var displayWrap = function displayWrap2(node2, settings2) {
|
|
|
101355
101394
|
}
|
|
101356
101395
|
return node2;
|
|
101357
101396
|
};
|
|
101358
|
-
var buildTree = function
|
|
101397
|
+
var buildTree$1 = function buildTree(tree, expression, settings2) {
|
|
101359
101398
|
var options = optionsFromSettings(settings2);
|
|
101360
101399
|
var katexNode;
|
|
101361
101400
|
if (settings2.output === "mathml") {
|
|
@@ -109983,7 +110022,7 @@ var renderToDomTree = function renderToDomTree2(expression, options) {
|
|
|
109983
110022
|
var settings2 = new Settings(options);
|
|
109984
110023
|
try {
|
|
109985
110024
|
var tree = parseTree(expression, settings2);
|
|
109986
|
-
return buildTree(tree, expression, settings2);
|
|
110025
|
+
return buildTree$1(tree, expression, settings2);
|
|
109987
110026
|
} catch (error) {
|
|
109988
110027
|
return renderError(error, expression, settings2);
|
|
109989
110028
|
}
|
|
@@ -137981,8 +138020,8 @@ function Chat({ session: session2 }) {
|
|
|
137981
138020
|
/* @__PURE__ */ jsxRuntimeExports.jsx(AskUserDialog, { sessionId: session2.id })
|
|
137982
138021
|
] });
|
|
137983
138022
|
}
|
|
137984
|
-
const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "gif", "webp", "avif", "bmp", "svg", "ico"];
|
|
137985
|
-
const FILE_EXT_MAP = {
|
|
138023
|
+
const IMAGE_EXTENSIONS$1 = ["png", "jpg", "jpeg", "gif", "webp", "avif", "bmp", "svg", "ico"];
|
|
138024
|
+
const FILE_EXT_MAP$1 = {
|
|
137986
138025
|
pdf: "pdf",
|
|
137987
138026
|
docx: "docx",
|
|
137988
138027
|
pptx: "pptx",
|
|
@@ -137991,11 +138030,11 @@ const FILE_EXT_MAP = {
|
|
|
137991
138030
|
html: "html",
|
|
137992
138031
|
htm: "html"
|
|
137993
138032
|
};
|
|
137994
|
-
function getFileKind(filename) {
|
|
138033
|
+
function getFileKind$1(filename) {
|
|
137995
138034
|
if (!filename) return null;
|
|
137996
138035
|
const ext = filename.split(".").pop()?.toLowerCase() || "";
|
|
137997
|
-
if (IMAGE_EXTENSIONS.includes(ext)) return "image";
|
|
137998
|
-
if (ext in FILE_EXT_MAP) return FILE_EXT_MAP[ext];
|
|
138036
|
+
if (IMAGE_EXTENSIONS$1.includes(ext)) return "image";
|
|
138037
|
+
if (ext in FILE_EXT_MAP$1) return FILE_EXT_MAP$1[ext];
|
|
137999
138038
|
if (ext === "md") return "markdown";
|
|
138000
138039
|
return "text";
|
|
138001
138040
|
}
|
|
@@ -138314,7 +138353,7 @@ function SearchBar({
|
|
|
138314
138353
|
)
|
|
138315
138354
|
] });
|
|
138316
138355
|
}
|
|
138317
|
-
function CodeDetail({ projectId, file }) {
|
|
138356
|
+
function CodeDetail$1({ projectId, file }) {
|
|
138318
138357
|
const { t: t2 } = useTranslation();
|
|
138319
138358
|
const { content: content2, gitContent, loading, errorMsg } = useFile(projectId, file, { gitHead: true });
|
|
138320
138359
|
const [viewMode, setViewMode] = reactExports.useState("code");
|
|
@@ -138435,7 +138474,7 @@ function CodeDetail({ projectId, file }) {
|
|
|
138435
138474
|
/* @__PURE__ */ jsxRuntimeExports.jsx(FileViewTabs, { viewMode, viewModes, onViewModeChange: setViewMode })
|
|
138436
138475
|
] });
|
|
138437
138476
|
}
|
|
138438
|
-
function MarkdownDetail({ projectId, file }) {
|
|
138477
|
+
function MarkdownDetail$1({ projectId, file }) {
|
|
138439
138478
|
const { t: t2 } = useTranslation();
|
|
138440
138479
|
const { content: content2, gitContent, loading, errorMsg } = useFile(projectId, file, { gitHead: true });
|
|
138441
138480
|
const [viewMode, setViewMode] = reactExports.useState("preview");
|
|
@@ -140631,7 +140670,7 @@ function Controls() {
|
|
|
140631
140670
|
)
|
|
140632
140671
|
] });
|
|
140633
140672
|
}
|
|
140634
|
-
function ImageDetail({ projectId, file }) {
|
|
140673
|
+
function ImageDetail$1({ projectId, file }) {
|
|
140635
140674
|
const { content: content2, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
140636
140675
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
140637
140676
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
@@ -171686,7 +171725,7 @@ function PdfView({ data }) {
|
|
|
171686
171725
|
) }) })
|
|
171687
171726
|
] });
|
|
171688
171727
|
}
|
|
171689
|
-
function PdfDetail({ projectId, file }) {
|
|
171728
|
+
function PdfDetail$1({ projectId, file }) {
|
|
171690
171729
|
const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
171691
171730
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
171692
171731
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
@@ -178022,7 +178061,7 @@ function DocxView({ data }) {
|
|
|
178022
178061
|
)
|
|
178023
178062
|
] });
|
|
178024
178063
|
}
|
|
178025
|
-
function DocxDetail({ projectId, file }) {
|
|
178064
|
+
function DocxDetail$1({ projectId, file }) {
|
|
178026
178065
|
const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
178027
178066
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
178028
178067
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
@@ -182134,7 +182173,7 @@ function PptxView({ data }) {
|
|
|
182134
182173
|
)
|
|
182135
182174
|
] });
|
|
182136
182175
|
}
|
|
182137
|
-
function PptxDetail({ projectId, file }) {
|
|
182176
|
+
function PptxDetail$1({ projectId, file }) {
|
|
182138
182177
|
const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
182139
182178
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
182140
182179
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
@@ -208901,13 +208940,13 @@ function XlsxView({ data }) {
|
|
|
208901
208940
|
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1 w-full min-h-0 overflow-hidden", children: loading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-muted-foreground text-center mt-10", children: t2("fileDetail.loading") }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: containerRef, className: "xlsx-preview p-2" }) })
|
|
208902
208941
|
] });
|
|
208903
208942
|
}
|
|
208904
|
-
function XlsxDetail({ projectId, file }) {
|
|
208943
|
+
function XlsxDetail$1({ projectId, file }) {
|
|
208905
208944
|
const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
208906
208945
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
208907
208946
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
208908
208947
|
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(XlsxView, { data: arrayBuffer, filename: file }) });
|
|
208909
208948
|
}
|
|
208910
|
-
function HtmlDetail({ projectId, file }) {
|
|
208949
|
+
function HtmlDetail$1({ projectId, file }) {
|
|
208911
208950
|
const { t: t2 } = useTranslation();
|
|
208912
208951
|
const iframeRef = reactExports.useRef(null);
|
|
208913
208952
|
const [hasError, setHasError] = reactExports.useState(false);
|
|
@@ -209156,9 +209195,9 @@ function FallbackDetail({ projectId, file }) {
|
|
|
209156
209195
|
)
|
|
209157
209196
|
] });
|
|
209158
209197
|
}
|
|
209159
|
-
function FileDetail({ projectId, file, onClose }) {
|
|
209198
|
+
function FileDetail$1({ projectId, file, onClose }) {
|
|
209160
209199
|
const { t: t2 } = useTranslation();
|
|
209161
|
-
const fileKind = getFileKind(file);
|
|
209200
|
+
const fileKind = getFileKind$1(file);
|
|
209162
209201
|
const [fileModified, setFileModified] = reactExports.useState(false);
|
|
209163
209202
|
const [refreshKey, setRefreshKey] = reactExports.useState(0);
|
|
209164
209203
|
reactExports.useEffect(() => {
|
|
@@ -209223,7 +209262,7 @@ function FileDetail({ projectId, file, onClose }) {
|
|
|
209223
209262
|
]
|
|
209224
209263
|
}
|
|
209225
209264
|
),
|
|
209226
|
-
projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative flex-1 min-h-0 overflow-hidden", children: fileKind === "text" ? /* @__PURE__ */ jsxRuntimeExports.jsx(CodeDetail, { projectId, file }, refreshKey) : fileKind === "markdown" ? /* @__PURE__ */ jsxRuntimeExports.jsx(MarkdownDetail, { projectId, file }, refreshKey) : fileKind === "image" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ImageDetail, { projectId, file }, refreshKey) : fileKind === "pdf" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PdfDetail, { projectId, file }, refreshKey) : fileKind === "docx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(DocxDetail, { projectId, file }, refreshKey) : fileKind === "pptx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PptxDetail, { projectId, file }, refreshKey) : fileKind === "xlsx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(XlsxDetail, { projectId, file }, refreshKey) : fileKind === "html" ? /* @__PURE__ */ jsxRuntimeExports.jsx(HtmlDetail, { projectId, file }, refreshKey) : /* @__PURE__ */ jsxRuntimeExports.jsx(FallbackDetail, { projectId, file }) })
|
|
209265
|
+
projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative flex-1 min-h-0 overflow-hidden", children: fileKind === "text" ? /* @__PURE__ */ jsxRuntimeExports.jsx(CodeDetail$1, { projectId, file }, refreshKey) : fileKind === "markdown" ? /* @__PURE__ */ jsxRuntimeExports.jsx(MarkdownDetail$1, { projectId, file }, refreshKey) : fileKind === "image" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ImageDetail$1, { projectId, file }, refreshKey) : fileKind === "pdf" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PdfDetail$1, { projectId, file }, refreshKey) : fileKind === "docx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(DocxDetail$1, { projectId, file }, refreshKey) : fileKind === "pptx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PptxDetail$1, { projectId, file }, refreshKey) : fileKind === "xlsx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(XlsxDetail$1, { projectId, file }, refreshKey) : fileKind === "html" ? /* @__PURE__ */ jsxRuntimeExports.jsx(HtmlDetail$1, { projectId, file }, refreshKey) : /* @__PURE__ */ jsxRuntimeExports.jsx(FallbackDetail, { projectId, file }) })
|
|
209227
209266
|
] });
|
|
209228
209267
|
}
|
|
209229
209268
|
var zs = Object.defineProperty;
|
|
@@ -217915,7 +217954,7 @@ function Detail({ detailType, projectId, file, terminalId, onClose }) {
|
|
|
217915
217954
|
const { t: t2 } = useTranslation();
|
|
217916
217955
|
if (!detailType) return null;
|
|
217917
217956
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full min-h-0 overflow-hidden bg-background", children: [
|
|
217918
|
-
detailType === "file" && projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx(FileDetail, { projectId, file, onClose }),
|
|
217957
|
+
detailType === "file" && projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx(FileDetail$1, { projectId, file, onClose }),
|
|
217919
217958
|
detailType === "terminal" && projectId && terminalId && /* @__PURE__ */ jsxRuntimeExports.jsx(TerminalDetail, { terminalId, projectId, onClose }),
|
|
217920
217959
|
(!detailType || detailType === "file" && (!projectId || !file) || detailType === "terminal" && (!projectId || !terminalId)) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center text-xs text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t2("detail.noContent", "No content") }) })
|
|
217921
217960
|
] });
|
|
@@ -219305,7 +219344,7 @@ function TerminalPanel({
|
|
|
219305
219344
|
)) }) })
|
|
219306
219345
|
] });
|
|
219307
219346
|
}
|
|
219308
|
-
function Panel({
|
|
219347
|
+
function Panel$1({
|
|
219309
219348
|
tab: tab2,
|
|
219310
219349
|
onTabChange,
|
|
219311
219350
|
projectId,
|
|
@@ -221589,7 +221628,7 @@ function Session({ session: session2 }) {
|
|
|
221589
221628
|
minSize: 250,
|
|
221590
221629
|
maxSize: 400,
|
|
221591
221630
|
children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
221592
|
-
Panel,
|
|
221631
|
+
Panel$1,
|
|
221593
221632
|
{
|
|
221594
221633
|
tab: panelTab,
|
|
221595
221634
|
onTabChange: (tab2) => setPanelTab(tab2),
|
|
@@ -233317,7 +233356,8 @@ const schema$3 = object({
|
|
|
233317
233356
|
baseUrl: string().trim().min(1, "settings.agents.validation.enterBaseUrl"),
|
|
233318
233357
|
apiKey: string().trim().min(1, "settings.agents.validation.enterApiKey"),
|
|
233319
233358
|
headersRaw: string().refine(isValidStringMap$2, "settings.agents.validation.jsonObject"),
|
|
233320
|
-
contextWindowTokens: string().refine(isValidContextWindow, "settings.agents.validation.positiveInteger")
|
|
233359
|
+
contextWindowTokens: string().refine(isValidContextWindow, "settings.agents.validation.positiveInteger"),
|
|
233360
|
+
modelIdTemplate: string()
|
|
233321
233361
|
});
|
|
233322
233362
|
function SettingsAgentApiDialog({
|
|
233323
233363
|
open: open2,
|
|
@@ -233335,7 +233375,8 @@ function SettingsAgentApiDialog({
|
|
|
233335
233375
|
baseUrl: "",
|
|
233336
233376
|
apiKey: "",
|
|
233337
233377
|
headersRaw: "",
|
|
233338
|
-
contextWindowTokens: ""
|
|
233378
|
+
contextWindowTokens: "",
|
|
233379
|
+
modelIdTemplate: ""
|
|
233339
233380
|
}
|
|
233340
233381
|
});
|
|
233341
233382
|
reactExports.useEffect(() => {
|
|
@@ -233346,7 +233387,8 @@ function SettingsAgentApiDialog({
|
|
|
233346
233387
|
baseUrl: initialAgent?.baseUrl ?? "",
|
|
233347
233388
|
apiKey: initialAgent?.apiKey ?? "",
|
|
233348
233389
|
headersRaw: initialAgent && Object.keys(initialAgent.headers || {}).length > 0 ? JSON.stringify(initialAgent.headers) : "",
|
|
233349
|
-
contextWindowTokens: initialAgent?.contextWindowTokens?.toString() ?? ""
|
|
233390
|
+
contextWindowTokens: initialAgent?.contextWindowTokens?.toString() ?? "",
|
|
233391
|
+
modelIdTemplate: initialAgent?.modelIdTemplate ?? ""
|
|
233350
233392
|
});
|
|
233351
233393
|
}, [initialAgent, open2, form]);
|
|
233352
233394
|
const onSubmit = async (data) => {
|
|
@@ -233358,7 +233400,8 @@ function SettingsAgentApiDialog({
|
|
|
233358
233400
|
baseUrl: data.baseUrl.trim(),
|
|
233359
233401
|
apiKey: data.apiKey.trim(),
|
|
233360
233402
|
headers: parseStringMap$2(data.headersRaw),
|
|
233361
|
-
contextWindowTokens: data.contextWindowTokens.trim() ? Number(data.contextWindowTokens) : void 0
|
|
233403
|
+
contextWindowTokens: data.contextWindowTokens.trim() ? Number(data.contextWindowTokens) : void 0,
|
|
233404
|
+
modelIdTemplate: data.modelIdTemplate.trim() || void 0
|
|
233362
233405
|
});
|
|
233363
233406
|
};
|
|
233364
233407
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-lg", children: [
|
|
@@ -233370,75 +233413,77 @@ function SettingsAgentApiDialog({
|
|
|
233370
233413
|
) })
|
|
233371
233414
|
] }),
|
|
233372
233415
|
/* @__PURE__ */ jsxRuntimeExports.jsx("form", { id: "form-api-agent", onSubmit: form.handleSubmit(onSubmit), children: /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { className: "py-2", children: [
|
|
233373
|
-
/* @__PURE__ */ jsxRuntimeExports.
|
|
233374
|
-
|
|
233375
|
-
|
|
233376
|
-
|
|
233377
|
-
|
|
233378
|
-
|
|
233379
|
-
/* @__PURE__ */ jsxRuntimeExports.
|
|
233380
|
-
|
|
233381
|
-
Input,
|
|
233382
|
-
{
|
|
233383
|
-
...field,
|
|
233384
|
-
id: "api-id",
|
|
233385
|
-
placeholder: t2("settings.agents.agentId"),
|
|
233386
|
-
"aria-invalid": fieldState.invalid,
|
|
233387
|
-
disabled: !!initialAgent?.id,
|
|
233388
|
-
className: "h-8 text-xs! text-foreground/70 focus-visible:ring-0.5"
|
|
233389
|
-
}
|
|
233390
|
-
),
|
|
233391
|
-
fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233392
|
-
FieldError,
|
|
233393
|
-
{
|
|
233394
|
-
errors: [
|
|
233395
|
-
{
|
|
233396
|
-
message: t2(
|
|
233397
|
-
fieldState.error?.message ?? "",
|
|
233398
|
-
fieldState.error?.message ?? ""
|
|
233399
|
-
)
|
|
233400
|
-
}
|
|
233401
|
-
]
|
|
233402
|
-
}
|
|
233403
|
-
)
|
|
233404
|
-
] })
|
|
233405
|
-
}
|
|
233406
|
-
),
|
|
233407
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233408
|
-
Controller,
|
|
233409
|
-
{
|
|
233410
|
-
name: "provider",
|
|
233411
|
-
control: form.control,
|
|
233412
|
-
render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
|
|
233413
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-provider", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.apiProvider", "Provider") }),
|
|
233414
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { name: field.name, value: field.value, onValueChange: field.onChange, children: [
|
|
233416
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
233417
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233418
|
+
Controller,
|
|
233419
|
+
{
|
|
233420
|
+
name: "id",
|
|
233421
|
+
control: form.control,
|
|
233422
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
|
|
233423
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-id", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.agentId") }),
|
|
233415
233424
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233416
|
-
|
|
233425
|
+
Input,
|
|
233417
233426
|
{
|
|
233418
|
-
|
|
233427
|
+
...field,
|
|
233428
|
+
id: "api-id",
|
|
233429
|
+
placeholder: t2("settings.agents.agentId"),
|
|
233419
233430
|
"aria-invalid": fieldState.invalid,
|
|
233420
|
-
|
|
233421
|
-
|
|
233431
|
+
disabled: !!initialAgent?.id,
|
|
233432
|
+
className: "h-8 text-xs! text-foreground/70 focus-visible:ring-0.5"
|
|
233422
233433
|
}
|
|
233423
233434
|
),
|
|
233424
|
-
|
|
233425
|
-
|
|
233426
|
-
|
|
233427
|
-
|
|
233428
|
-
|
|
233429
|
-
|
|
233435
|
+
fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233436
|
+
FieldError,
|
|
233437
|
+
{
|
|
233438
|
+
errors: [
|
|
233439
|
+
{
|
|
233440
|
+
message: t2(
|
|
233441
|
+
fieldState.error?.message ?? "",
|
|
233442
|
+
fieldState.error?.message ?? ""
|
|
233443
|
+
)
|
|
233444
|
+
}
|
|
233445
|
+
]
|
|
233446
|
+
}
|
|
233447
|
+
)
|
|
233448
|
+
] })
|
|
233449
|
+
}
|
|
233450
|
+
),
|
|
233451
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233452
|
+
Controller,
|
|
233453
|
+
{
|
|
233454
|
+
name: "provider",
|
|
233455
|
+
control: form.control,
|
|
233456
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
|
|
233457
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-provider", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.apiProvider", "Provider") }),
|
|
233458
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { name: field.name, value: field.value, onValueChange: field.onChange, children: [
|
|
233459
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233460
|
+
SelectTrigger,
|
|
233430
233461
|
{
|
|
233431
|
-
|
|
233432
|
-
|
|
233433
|
-
|
|
233434
|
-
)
|
|
233462
|
+
id: "api-provider",
|
|
233463
|
+
"aria-invalid": fieldState.invalid,
|
|
233464
|
+
className: "w-full text-[11px]! font-mono",
|
|
233465
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {})
|
|
233435
233466
|
}
|
|
233436
|
-
|
|
233437
|
-
|
|
233438
|
-
|
|
233439
|
-
|
|
233440
|
-
|
|
233441
|
-
|
|
233467
|
+
),
|
|
233468
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "openai-compatible", children: "openai-compatible" }) })
|
|
233469
|
+
] }),
|
|
233470
|
+
fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233471
|
+
FieldError,
|
|
233472
|
+
{
|
|
233473
|
+
errors: [
|
|
233474
|
+
{
|
|
233475
|
+
message: t2(
|
|
233476
|
+
fieldState.error?.message ?? "",
|
|
233477
|
+
fieldState.error?.message ?? ""
|
|
233478
|
+
)
|
|
233479
|
+
}
|
|
233480
|
+
]
|
|
233481
|
+
}
|
|
233482
|
+
)
|
|
233483
|
+
] })
|
|
233484
|
+
}
|
|
233485
|
+
)
|
|
233486
|
+
] }),
|
|
233442
233487
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233443
233488
|
Controller,
|
|
233444
233489
|
{
|
|
@@ -233519,7 +233564,7 @@ function SettingsAgentApiDialog({
|
|
|
233519
233564
|
id: "api-headers",
|
|
233520
233565
|
placeholder: '{ "name": "value" }',
|
|
233521
233566
|
"aria-invalid": fieldState.invalid,
|
|
233522
|
-
className: "text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
|
|
233567
|
+
className: "text-[11px]! min-h-14 font-mono text-foreground/70 focus-visible:ring-0.5"
|
|
233523
233568
|
}
|
|
233524
233569
|
),
|
|
233525
233570
|
fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
@@ -233596,6 +233641,39 @@ function SettingsAgentApiDialog({
|
|
|
233596
233641
|
)
|
|
233597
233642
|
] })
|
|
233598
233643
|
}
|
|
233644
|
+
),
|
|
233645
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233646
|
+
Controller,
|
|
233647
|
+
{
|
|
233648
|
+
name: "modelIdTemplate",
|
|
233649
|
+
control: form.control,
|
|
233650
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
|
|
233651
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-model-template", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.modelIdTemplate", "Model Id Template") }),
|
|
233652
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233653
|
+
Input,
|
|
233654
|
+
{
|
|
233655
|
+
...field,
|
|
233656
|
+
id: "api-model-template",
|
|
233657
|
+
placeholder: "{id}",
|
|
233658
|
+
"aria-invalid": fieldState.invalid,
|
|
233659
|
+
className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
|
|
233660
|
+
}
|
|
233661
|
+
),
|
|
233662
|
+
fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233663
|
+
FieldError,
|
|
233664
|
+
{
|
|
233665
|
+
errors: [
|
|
233666
|
+
{
|
|
233667
|
+
message: t2(
|
|
233668
|
+
fieldState.error?.message ?? "",
|
|
233669
|
+
fieldState.error?.message ?? ""
|
|
233670
|
+
)
|
|
233671
|
+
}
|
|
233672
|
+
]
|
|
233673
|
+
}
|
|
233674
|
+
)
|
|
233675
|
+
] })
|
|
233676
|
+
}
|
|
233599
233677
|
)
|
|
233600
233678
|
] }) }),
|
|
233601
233679
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
|
|
@@ -235271,7 +235349,7 @@ function SkillsLayout() {
|
|
|
235271
235349
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
235272
235350
|
"div",
|
|
235273
235351
|
{
|
|
235274
|
-
className: "h-12 shrink-0 border-b border-border flex items-center px-
|
|
235352
|
+
className: "h-12 shrink-0 border-b border-border flex items-center px-4",
|
|
235275
235353
|
style: { WebkitAppRegion: "drag" },
|
|
235276
235354
|
children: /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: t2("skills.title") })
|
|
235277
235355
|
}
|
|
@@ -235683,6 +235761,1188 @@ function SkillsSh() {
|
|
|
235683
235761
|
}) }) : !isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col items-center justify-center py-20 text-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: t2("skills.skillsSh.noResults") }) }) : null }) })
|
|
235684
235762
|
] });
|
|
235685
235763
|
}
|
|
235764
|
+
const HOURS = Array.from({ length: 24 }, (_2, i3) => i3);
|
|
235765
|
+
const MINUTES = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
|
|
235766
|
+
const INTERVALS = [1, 2, 3, 4, 6, 8, 12];
|
|
235767
|
+
const DAYS_OF_WEEK_VALUES = ["1", "2", "3", "4", "5", "6", "0"];
|
|
235768
|
+
function detectPreset(expr) {
|
|
235769
|
+
const parts = expr.trim().split(/\s+/);
|
|
235770
|
+
if (parts.length !== 5) return "custom";
|
|
235771
|
+
const [min2, hr2, dom, mon, dow] = parts;
|
|
235772
|
+
if (hr2.startsWith("*/") && dom === "*" && mon === "*" && dow === "*") {
|
|
235773
|
+
const n2 = parseInt(hr2.slice(2));
|
|
235774
|
+
if (!isNaN(n2) && INTERVALS.includes(n2)) return "hourly";
|
|
235775
|
+
}
|
|
235776
|
+
const h3 = parseInt(hr2), m2 = parseInt(min2);
|
|
235777
|
+
if (isNaN(h3) || isNaN(m2)) return "custom";
|
|
235778
|
+
if (dom === "*" && mon === "*" && dow === "*") return "daily";
|
|
235779
|
+
if (dom === "*" && mon === "*" && dow === "1-5") return "weekdays";
|
|
235780
|
+
if (dom === "*" && mon === "*" && /^\d$/.test(dow)) return "weekly";
|
|
235781
|
+
return "custom";
|
|
235782
|
+
}
|
|
235783
|
+
function parseParts(expr) {
|
|
235784
|
+
const parts = expr.trim().split(/\s+/);
|
|
235785
|
+
if (parts.length !== 5) return { hour: 9, minute: 0, interval: 2, dow: "1" };
|
|
235786
|
+
const [min2, hr2] = parts;
|
|
235787
|
+
const dow = parts[4];
|
|
235788
|
+
if (hr2.startsWith("*/")) return { hour: 9, minute: parseInt(min2) || 0, interval: parseInt(hr2.slice(2)) || 2, dow: /^\d$/.test(dow) ? dow : "1" };
|
|
235789
|
+
return { hour: parseInt(hr2) || 9, minute: parseInt(min2) || 0, interval: 2, dow: /^\d$/.test(dow) ? dow : "1" };
|
|
235790
|
+
}
|
|
235791
|
+
function buildCron(preset, hour, minute, interval2, dow) {
|
|
235792
|
+
switch (preset) {
|
|
235793
|
+
case "daily":
|
|
235794
|
+
return `${minute} ${hour} * * *`;
|
|
235795
|
+
case "weekdays":
|
|
235796
|
+
return `${minute} ${hour} * * 1-5`;
|
|
235797
|
+
case "weekly":
|
|
235798
|
+
return `${minute} ${hour} * * ${dow}`;
|
|
235799
|
+
case "hourly":
|
|
235800
|
+
return `${minute} */${interval2} * * *`;
|
|
235801
|
+
default:
|
|
235802
|
+
return `${minute} ${hour} * * *`;
|
|
235803
|
+
}
|
|
235804
|
+
}
|
|
235805
|
+
function CronEditor({ value, onChange, timezone }) {
|
|
235806
|
+
const { t: t2 } = useTranslation();
|
|
235807
|
+
const [preset, setPreset] = reactExports.useState(() => detectPreset(value));
|
|
235808
|
+
const [parts, setParts] = reactExports.useState(() => parseParts(value));
|
|
235809
|
+
reactExports.useEffect(() => {
|
|
235810
|
+
const detected = detectPreset(value);
|
|
235811
|
+
if (detected !== "custom") {
|
|
235812
|
+
setPreset(detected);
|
|
235813
|
+
setParts(parseParts(value));
|
|
235814
|
+
}
|
|
235815
|
+
}, [value]);
|
|
235816
|
+
const handlePresetChange = (p3) => {
|
|
235817
|
+
setPreset(p3);
|
|
235818
|
+
if (p3 !== "custom") {
|
|
235819
|
+
onChange(buildCron(p3, parts.hour, parts.minute, parts.interval, parts.dow));
|
|
235820
|
+
}
|
|
235821
|
+
};
|
|
235822
|
+
const updateParts = (patch2) => {
|
|
235823
|
+
const next2 = { ...parts, ...patch2 };
|
|
235824
|
+
setParts(next2);
|
|
235825
|
+
if (preset !== "custom") {
|
|
235826
|
+
onChange(buildCron(preset, next2.hour, next2.minute, next2.interval, next2.dow));
|
|
235827
|
+
}
|
|
235828
|
+
};
|
|
235829
|
+
const presetItems = [
|
|
235830
|
+
{ value: "daily", label: t2("automation.cron.daily", "Every day") },
|
|
235831
|
+
{ value: "weekdays", label: t2("automation.cron.weekdays", "Weekdays") },
|
|
235832
|
+
{ value: "weekly", label: t2("automation.cron.weekly", "Every week") },
|
|
235833
|
+
{ value: "hourly", label: t2("automation.cron.hourly", "Every N hours") },
|
|
235834
|
+
{ value: "custom", label: t2("automation.cron.custom", "Custom") }
|
|
235835
|
+
];
|
|
235836
|
+
const intervalItems = INTERVALS.map((n2) => ({ value: String(n2), label: `${n2}h` }));
|
|
235837
|
+
const minuteItems = MINUTES.map((m2) => ({ value: String(m2), label: `${String(m2).padStart(2, "0")}` }));
|
|
235838
|
+
const hourItems = HOURS.map((h3) => ({ value: String(h3), label: String(h3).padStart(2, "0") }));
|
|
235839
|
+
const dowItems = DAYS_OF_WEEK_VALUES.map((v4) => ({
|
|
235840
|
+
value: v4,
|
|
235841
|
+
label: t2(`automation.cron.days.${v4}`, ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][parseInt(v4)])
|
|
235842
|
+
}));
|
|
235843
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2.5", children: [
|
|
235844
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
235845
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: presetItems, value: preset, onValueChange: (v4) => {
|
|
235846
|
+
if (v4) handlePresetChange(v4);
|
|
235847
|
+
}, children: [
|
|
235848
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-8 text-xs! w-32 shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235849
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: presetItems.map((p3) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: p3.value, children: p3.label }, p3.value)) })
|
|
235850
|
+
] }),
|
|
235851
|
+
preset === "custom" ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
235852
|
+
Input,
|
|
235853
|
+
{
|
|
235854
|
+
value,
|
|
235855
|
+
onChange: (e2) => onChange(e2.target.value),
|
|
235856
|
+
placeholder: "min hour day month weekday",
|
|
235857
|
+
className: "h-8 text-xs! font-mono text-foreground/70 focus-visible:ring-0.5 flex-1"
|
|
235858
|
+
}
|
|
235859
|
+
) : preset === "hourly" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
235860
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: intervalItems, value: String(parts.interval), onValueChange: (v4) => {
|
|
235861
|
+
if (v4) updateParts({ interval: parseInt(v4) });
|
|
235862
|
+
}, children: [
|
|
235863
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235864
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: intervalItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235865
|
+
] }),
|
|
235866
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: t2("automation.cron.atMinute", "at min") }),
|
|
235867
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: minuteItems, value: String(parts.minute), onValueChange: (v4) => {
|
|
235868
|
+
if (v4) updateParts({ minute: parseInt(v4) });
|
|
235869
|
+
}, children: [
|
|
235870
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235871
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: minuteItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235872
|
+
] })
|
|
235873
|
+
] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
235874
|
+
preset === "weekly" && /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: dowItems, value: parts.dow, onValueChange: (v4) => {
|
|
235875
|
+
if (v4) updateParts({ dow: v4 });
|
|
235876
|
+
}, children: [
|
|
235877
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-18", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235878
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: dowItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235879
|
+
] }),
|
|
235880
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: t2("automation.cron.at", "at") }),
|
|
235881
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: hourItems, value: String(parts.hour), onValueChange: (v4) => {
|
|
235882
|
+
if (v4) updateParts({ hour: parseInt(v4) });
|
|
235883
|
+
}, children: [
|
|
235884
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235885
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: hourItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235886
|
+
] }),
|
|
235887
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: ":" }),
|
|
235888
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: minuteItems, value: String(parts.minute), onValueChange: (v4) => {
|
|
235889
|
+
if (v4) updateParts({ minute: parseInt(v4) });
|
|
235890
|
+
}, children: [
|
|
235891
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235892
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: minuteItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235893
|
+
] })
|
|
235894
|
+
] })
|
|
235895
|
+
] }),
|
|
235896
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-[11px] text-muted-foreground", children: [
|
|
235897
|
+
value,
|
|
235898
|
+
" · ",
|
|
235899
|
+
t2("automation.cron.nextRun", "Next run"),
|
|
235900
|
+
": ",
|
|
235901
|
+
formatNextCron(value),
|
|
235902
|
+
timezone && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-1 text-muted-foreground/50", children: [
|
|
235903
|
+
"(",
|
|
235904
|
+
timezone,
|
|
235905
|
+
")"
|
|
235906
|
+
] })
|
|
235907
|
+
] })
|
|
235908
|
+
] });
|
|
235909
|
+
}
|
|
235910
|
+
function formatNextCron(expr) {
|
|
235911
|
+
try {
|
|
235912
|
+
const next2 = getNextCronDate(expr);
|
|
235913
|
+
if (!next2) return "—";
|
|
235914
|
+
return next2.toLocaleString(void 0, { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" });
|
|
235915
|
+
} catch {
|
|
235916
|
+
return "—";
|
|
235917
|
+
}
|
|
235918
|
+
}
|
|
235919
|
+
function getNextCronDate(expr) {
|
|
235920
|
+
const parts = expr.trim().split(/\s+/);
|
|
235921
|
+
if (parts.length !== 5) return null;
|
|
235922
|
+
const [minF, hrF, , , dowF] = parts;
|
|
235923
|
+
const now2 = /* @__PURE__ */ new Date();
|
|
235924
|
+
for (let d2 = 0; d2 < 8; d2++) {
|
|
235925
|
+
const candidate = new Date(now2.getTime() + d2 * 864e5);
|
|
235926
|
+
const dow = candidate.getDay();
|
|
235927
|
+
if (dowF !== "*") {
|
|
235928
|
+
if (dowF === "1-5" && (dow === 0 || dow === 6)) continue;
|
|
235929
|
+
else if (/^\d$/.test(dowF) && dow !== parseInt(dowF)) continue;
|
|
235930
|
+
else if (dowF.includes(",") && !dowF.split(",").map(Number).includes(dow)) continue;
|
|
235931
|
+
}
|
|
235932
|
+
if (hrF.startsWith("*/")) {
|
|
235933
|
+
const interval2 = parseInt(hrF.slice(2)) || 1;
|
|
235934
|
+
const minute = parseInt(minF) || 0;
|
|
235935
|
+
for (let h3 = 0; h3 < 24; h3 += interval2) {
|
|
235936
|
+
candidate.setHours(h3, minute, 0, 0);
|
|
235937
|
+
if (candidate > now2) return candidate;
|
|
235938
|
+
}
|
|
235939
|
+
} else {
|
|
235940
|
+
const h3 = parseInt(hrF), m2 = parseInt(minF);
|
|
235941
|
+
if (isNaN(h3) || isNaN(m2)) return null;
|
|
235942
|
+
candidate.setHours(h3, m2, 0, 0);
|
|
235943
|
+
if (candidate > now2) return candidate;
|
|
235944
|
+
}
|
|
235945
|
+
}
|
|
235946
|
+
return null;
|
|
235947
|
+
}
|
|
235948
|
+
function SettingDialog({ schedule: schedule2, open: open2, onOpenChange, onSuccess }) {
|
|
235949
|
+
const isEdit = !!schedule2;
|
|
235950
|
+
const { t: t2 } = useTranslation();
|
|
235951
|
+
const { toast: toast2 } = useMessage();
|
|
235952
|
+
const configuredAgents = useAppStore((s16) => s16.configuredAgents);
|
|
235953
|
+
const configuredMcpServers = useAppStore((s16) => s16.configuredMcpServers);
|
|
235954
|
+
const enabledAgents = reactExports.useMemo(() => configuredAgents.filter((a2) => !a2.disabled), [configuredAgents]);
|
|
235955
|
+
const enabledMcpServers = reactExports.useMemo(() => configuredMcpServers.filter((s16) => !s16.disabled), [configuredMcpServers]);
|
|
235956
|
+
const [timezone, setTimezone] = reactExports.useState("");
|
|
235957
|
+
reactExports.useEffect(() => {
|
|
235958
|
+
request.getServerTimezone().then(setTimezone).catch(() => {
|
|
235959
|
+
});
|
|
235960
|
+
}, []);
|
|
235961
|
+
const [name2, setName] = reactExports.useState(isEdit ? schedule2.name : "");
|
|
235962
|
+
const [agentId, setAgentId] = reactExports.useState(isEdit ? schedule2.agentId : enabledAgents[0]?.id ?? "");
|
|
235963
|
+
const [prompt, setPrompt] = reactExports.useState(isEdit ? schedule2.prompt : "");
|
|
235964
|
+
const [cronType, setCronType] = reactExports.useState(isEdit ? schedule2.cron.type : "cron");
|
|
235965
|
+
const [cronExpr, setCronExpr] = reactExports.useState(isEdit ? schedule2.cron.expr ?? "0 9 * * 1-5" : "0 9 * * 1-5");
|
|
235966
|
+
const [features, setFeatures] = reactExports.useState(isEdit ? schedule2.features ?? ["skills"] : ["skills"]);
|
|
235967
|
+
const [mcpServerIds, setMcpServerIds] = reactExports.useState(isEdit ? schedule2.mcpServers ?? [] : enabledMcpServers.map((s16) => s16.id));
|
|
235968
|
+
const [saving, setSaving] = reactExports.useState(false);
|
|
235969
|
+
reactExports.useEffect(() => {
|
|
235970
|
+
if (!open2) return;
|
|
235971
|
+
if (schedule2) {
|
|
235972
|
+
setName(schedule2.name);
|
|
235973
|
+
setAgentId(schedule2.agentId);
|
|
235974
|
+
setPrompt(schedule2.prompt);
|
|
235975
|
+
setCronType(schedule2.cron.type);
|
|
235976
|
+
setCronExpr(schedule2.cron.expr ?? "0 9 * * 1-5");
|
|
235977
|
+
setFeatures(schedule2.features ?? ["skills"]);
|
|
235978
|
+
setMcpServerIds(schedule2.mcpServers ?? []);
|
|
235979
|
+
} else {
|
|
235980
|
+
setName("");
|
|
235981
|
+
setAgentId(enabledAgents[0]?.id ?? "");
|
|
235982
|
+
setPrompt("");
|
|
235983
|
+
setCronType("cron");
|
|
235984
|
+
setCronExpr("0 9 * * 1-5");
|
|
235985
|
+
setFeatures(["skills"]);
|
|
235986
|
+
setMcpServerIds(enabledMcpServers.map((s16) => s16.id));
|
|
235987
|
+
}
|
|
235988
|
+
}, [schedule2, open2]);
|
|
235989
|
+
const handleSave = async () => {
|
|
235990
|
+
if (!name2.trim()) return void toast2.error(t2("automation.validation.nameRequired", "Name is required"));
|
|
235991
|
+
if (!agentId) return void toast2.error(t2("automation.validation.agentRequired", "Agent is required"));
|
|
235992
|
+
if (!prompt.trim()) return void toast2.error(t2("automation.validation.promptRequired", "Prompt is required"));
|
|
235993
|
+
setSaving(true);
|
|
235994
|
+
try {
|
|
235995
|
+
if (isEdit) {
|
|
235996
|
+
await request.updateSchedule({
|
|
235997
|
+
scheduleId: schedule2.id,
|
|
235998
|
+
updates: {
|
|
235999
|
+
name: name2.trim(),
|
|
236000
|
+
agentId,
|
|
236001
|
+
prompt: prompt.trim(),
|
|
236002
|
+
cron: { type: cronType, expr: cronType === "cron" ? cronExpr.trim() : void 0 },
|
|
236003
|
+
features,
|
|
236004
|
+
mcpServers: mcpServerIds
|
|
236005
|
+
}
|
|
236006
|
+
});
|
|
236007
|
+
} else {
|
|
236008
|
+
await request.createSchedule({
|
|
236009
|
+
name: name2.trim(),
|
|
236010
|
+
agentId,
|
|
236011
|
+
prompt: prompt.trim(),
|
|
236012
|
+
cron: { type: cronType, expr: cronType === "cron" ? cronExpr.trim() : void 0 },
|
|
236013
|
+
features,
|
|
236014
|
+
mcpServers: mcpServerIds
|
|
236015
|
+
});
|
|
236016
|
+
}
|
|
236017
|
+
onSuccess();
|
|
236018
|
+
onOpenChange(false);
|
|
236019
|
+
} catch (err) {
|
|
236020
|
+
toast2.error(String(err));
|
|
236021
|
+
} finally {
|
|
236022
|
+
setSaving(false);
|
|
236023
|
+
}
|
|
236024
|
+
};
|
|
236025
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange: (open22, eventDetails) => {
|
|
236026
|
+
if (!open22 && (eventDetails?.reason === "escape-key" || eventDetails?.reason === "outside-press")) return;
|
|
236027
|
+
onOpenChange(open22);
|
|
236028
|
+
}, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-3xl", children: [
|
|
236029
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
|
|
236030
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: isEdit ? t2("automation.editSchedule", "Edit Schedule") : t2("automation.newSchedule", "New Schedule") }),
|
|
236031
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: t2("automation.dialogDesc", "Configure the automated task schedule and prompt.") })
|
|
236032
|
+
] }),
|
|
236033
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-5", children: [
|
|
236034
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
|
|
236035
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-[2fr_1fr] gap-3", children: [
|
|
236036
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
|
|
236037
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "auto-name", className: "text-[11px] text-muted-foreground", children: t2("automation.scheduleName", "Schedule Name") }),
|
|
236038
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236039
|
+
Input,
|
|
236040
|
+
{
|
|
236041
|
+
id: "auto-name",
|
|
236042
|
+
placeholder: t2("automation.scheduleNamePlaceholder", "e.g. Morning Standup Summary"),
|
|
236043
|
+
value: name2,
|
|
236044
|
+
onChange: (e2) => setName(e2.target.value),
|
|
236045
|
+
className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
|
|
236046
|
+
}
|
|
236047
|
+
)
|
|
236048
|
+
] }),
|
|
236049
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
|
|
236050
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "auto-agent", className: "text-[11px] text-muted-foreground", children: t2("automation.agent", "Agent") }),
|
|
236051
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: agentId, onValueChange: (v4) => {
|
|
236052
|
+
if (v4) setAgentId(v4);
|
|
236053
|
+
}, children: [
|
|
236054
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "auto-agent", className: "w-full text-[11px]! text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
236055
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: enabledAgents.map((a2) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: a2.id, children: a2.id }, a2.id)) })
|
|
236056
|
+
] })
|
|
236057
|
+
] })
|
|
236058
|
+
] }),
|
|
236059
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
|
|
236060
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "auto-prompt", className: "text-[11px] text-muted-foreground", children: t2("automation.prompt", "Prompt") }),
|
|
236061
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236062
|
+
Textarea,
|
|
236063
|
+
{
|
|
236064
|
+
id: "auto-prompt",
|
|
236065
|
+
placeholder: t2("automation.promptPlaceholder", "What should the agent do?"),
|
|
236066
|
+
value: prompt,
|
|
236067
|
+
onChange: (e2) => setPrompt(e2.target.value),
|
|
236068
|
+
className: "text-xs! min-h-46 flex-1 text-foreground/70 focus-visible:ring-0.5"
|
|
236069
|
+
}
|
|
236070
|
+
)
|
|
236071
|
+
] })
|
|
236072
|
+
] }),
|
|
236073
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
|
|
236074
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
236075
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: t2("automation.features", "Features") }),
|
|
236076
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
236077
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded border bg-secondary/50 px-2 h-7", children: [
|
|
236078
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `text-xs truncate ${features.includes("skills") ? "text-muted-foreground" : "text-muted-foreground/50"}`, children: t2("constant.feature.skills", "Skills") }),
|
|
236079
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236080
|
+
Switch,
|
|
236081
|
+
{
|
|
236082
|
+
size: "sm",
|
|
236083
|
+
checked: features.includes("skills"),
|
|
236084
|
+
onCheckedChange: (c2) => setFeatures(c2 ? ["skills"] : [])
|
|
236085
|
+
}
|
|
236086
|
+
)
|
|
236087
|
+
] }),
|
|
236088
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded border bg-secondary/50 px-2 h-7", children: [
|
|
236089
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs truncate text-muted-foreground/50", children: [
|
|
236090
|
+
t2("constant.feature.askUser", "Ask User"),
|
|
236091
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-[10px] ml-1", children: [
|
|
236092
|
+
"(",
|
|
236093
|
+
t2("automation.alwaysDisabled", "always disabled"),
|
|
236094
|
+
")"
|
|
236095
|
+
] })
|
|
236096
|
+
] }),
|
|
236097
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { size: "sm", checked: false, disabled: true })
|
|
236098
|
+
] })
|
|
236099
|
+
] })
|
|
236100
|
+
] }),
|
|
236101
|
+
configuredMcpServers.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
236102
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: t2("automation.mcpServers", "MCP Servers") }),
|
|
236103
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: configuredMcpServers.length > 5 ? "grid grid-cols-2 gap-1" : "flex flex-col gap-1", children: configuredMcpServers.map((s16) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded border bg-secondary/50 px-2 h-7", children: [
|
|
236104
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `text-xs truncate ${mcpServerIds.includes(s16.id) ? "text-muted-foreground" : "text-muted-foreground/50"}`, title: s16.id, children: s16.id }),
|
|
236105
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236106
|
+
Switch,
|
|
236107
|
+
{
|
|
236108
|
+
size: "sm",
|
|
236109
|
+
checked: mcpServerIds.includes(s16.id),
|
|
236110
|
+
onCheckedChange: (c2) => {
|
|
236111
|
+
setMcpServerIds((prev2) => c2 ? [...prev2, s16.id] : prev2.filter((id32) => id32 !== s16.id));
|
|
236112
|
+
}
|
|
236113
|
+
}
|
|
236114
|
+
)
|
|
236115
|
+
] }, s16.id)) })
|
|
236116
|
+
] }),
|
|
236117
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
|
|
236118
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { className: "text-[11px] text-muted-foreground", children: t2("automation.schedule", "Schedule") }),
|
|
236119
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
236120
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "flex items-center gap-2 text-[11px] text-foreground/70 cursor-pointer", children: [
|
|
236121
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { checked: cronType === "cron", onCheckedChange: (c2) => setCronType(c2 ? "cron" : "manual") }),
|
|
236122
|
+
t2("automation.timedExecution", "Timed (cron)")
|
|
236123
|
+
] }),
|
|
236124
|
+
cronType === "cron" ? /* @__PURE__ */ jsxRuntimeExports.jsx(CronEditor, { value: cronExpr, onChange: setCronExpr, timezone }) : /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] text-muted-foreground", children: t2("automation.manualDesc", "Manual trigger only. No automatic scheduling.") })
|
|
236125
|
+
] })
|
|
236126
|
+
] })
|
|
236127
|
+
] })
|
|
236128
|
+
] }),
|
|
236129
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
|
|
236130
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onOpenChange(false), className: "h-7 text-xs", children: t2("automation.cancel", "Cancel") }),
|
|
236131
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { type: "button", size: "sm", disabled: saving, onClick: handleSave, className: "h-7 text-xs", children: [
|
|
236132
|
+
saving && /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin mr-1" }),
|
|
236133
|
+
isEdit ? t2("automation.save", "Save") : t2("automation.create", "Create")
|
|
236134
|
+
] })
|
|
236135
|
+
] })
|
|
236136
|
+
] }) });
|
|
236137
|
+
}
|
|
236138
|
+
function Automation() {
|
|
236139
|
+
const { t: t2 } = useTranslation();
|
|
236140
|
+
const navigate = useNavigate();
|
|
236141
|
+
const { confirm: confirm2, toast: toast2 } = useMessage();
|
|
236142
|
+
const [schedules, setSchedules] = reactExports.useState([]);
|
|
236143
|
+
const [loading, setLoading] = reactExports.useState(true);
|
|
236144
|
+
const [newDialogOpen, setNewDialogOpen] = reactExports.useState(false);
|
|
236145
|
+
const [editSchedule, setEditSchedule] = reactExports.useState(null);
|
|
236146
|
+
const [timezone, setTimezone] = reactExports.useState("");
|
|
236147
|
+
reactExports.useEffect(() => {
|
|
236148
|
+
request.getServerTimezone().then(setTimezone).catch(() => {
|
|
236149
|
+
});
|
|
236150
|
+
}, []);
|
|
236151
|
+
const loadSchedules = reactExports.useCallback(async () => {
|
|
236152
|
+
try {
|
|
236153
|
+
const list2 = await request.listSchedules();
|
|
236154
|
+
setSchedules(list2 ?? []);
|
|
236155
|
+
} catch (err) {
|
|
236156
|
+
console.error("Failed to load schedules:", err);
|
|
236157
|
+
} finally {
|
|
236158
|
+
setLoading(false);
|
|
236159
|
+
}
|
|
236160
|
+
}, []);
|
|
236161
|
+
reactExports.useEffect(() => {
|
|
236162
|
+
void loadSchedules();
|
|
236163
|
+
}, [loadSchedules]);
|
|
236164
|
+
reactExports.useEffect(() => {
|
|
236165
|
+
const handleChanged = () => void loadSchedules();
|
|
236166
|
+
subscribe$1.on("schedules-changed", handleChanged);
|
|
236167
|
+
return () => subscribe$1.off("schedules-changed", handleChanged);
|
|
236168
|
+
}, [loadSchedules]);
|
|
236169
|
+
const handleTrigger = async (scheduleId) => {
|
|
236170
|
+
try {
|
|
236171
|
+
const task = await request.triggerSchedule({ scheduleId });
|
|
236172
|
+
navigate(`/automation/schedule/${scheduleId}/task/${task.id}`);
|
|
236173
|
+
} catch (err) {
|
|
236174
|
+
toast2.error(String(err));
|
|
236175
|
+
}
|
|
236176
|
+
};
|
|
236177
|
+
const handleDelete2 = async (schedule2) => {
|
|
236178
|
+
await confirm2({
|
|
236179
|
+
title: t2("automation.deleteTitle", "Delete Schedule"),
|
|
236180
|
+
content: t2("automation.deleteConfirm", 'Delete "{{name}}" permanently?', { name: schedule2.name }),
|
|
236181
|
+
buttons: [
|
|
236182
|
+
{ text: t2("automation.cancel", "Cancel"), value: null, variant: "outline" },
|
|
236183
|
+
{
|
|
236184
|
+
text: t2("automation.delete", "Delete"),
|
|
236185
|
+
value: async () => {
|
|
236186
|
+
await request.deleteSchedule({ scheduleId: schedule2.id });
|
|
236187
|
+
await loadSchedules();
|
|
236188
|
+
return "deleted";
|
|
236189
|
+
},
|
|
236190
|
+
variant: "destructive"
|
|
236191
|
+
}
|
|
236192
|
+
]
|
|
236193
|
+
});
|
|
236194
|
+
};
|
|
236195
|
+
const formatNextRun = (schedule2) => {
|
|
236196
|
+
if (!schedule2.nextRunAt) return "-";
|
|
236197
|
+
const diff = schedule2.nextRunAt - Date.now();
|
|
236198
|
+
if (diff <= 0) return t2("automation.anyMoment", "Any moment now");
|
|
236199
|
+
if (diff < 60 * 1e3) return t2("automation.lessThanMinute", "Less than 1 min");
|
|
236200
|
+
if (diff < 60 * 60 * 1e3) return `${Math.ceil(diff / 6e4)} min`;
|
|
236201
|
+
const hours = Math.floor(diff / 36e5);
|
|
236202
|
+
const mins = Math.ceil(diff % 36e5 / 6e4);
|
|
236203
|
+
return `${hours}h ${mins}m`;
|
|
236204
|
+
};
|
|
236205
|
+
const getScheduleLabel = (schedule2) => {
|
|
236206
|
+
if (schedule2.cron.type === "manual") return t2("automation.manual", "Manual");
|
|
236207
|
+
return schedule2.cron.expr ?? "-";
|
|
236208
|
+
};
|
|
236209
|
+
if (loading) {
|
|
236210
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
|
|
236211
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-12 shrink-0 border-b border-border flex items-center px-6", style: { WebkitAppRegion: "drag" }, children: [
|
|
236212
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: t2("automation.title", "Automation") }),
|
|
236213
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs text-muted-foreground font-normal ml-1.5", children: [
|
|
236214
|
+
"· schedules: ",
|
|
236215
|
+
schedules.length
|
|
236216
|
+
] })
|
|
236217
|
+
] }),
|
|
236218
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-1 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-6 animate-spin text-muted-foreground" }) })
|
|
236219
|
+
] });
|
|
236220
|
+
}
|
|
236221
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
|
|
236222
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236223
|
+
"div",
|
|
236224
|
+
{
|
|
236225
|
+
className: "h-12 shrink-0 border-b border-border flex items-center justify-between pl-4 pr-2",
|
|
236226
|
+
style: { WebkitAppRegion: "drag" },
|
|
236227
|
+
children: [
|
|
236228
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
236229
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: t2("automation.title", "Automation") }),
|
|
236230
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs text-muted-foreground font-normal", children: [
|
|
236231
|
+
"· ",
|
|
236232
|
+
t2("automation.schedules", "schedules"),
|
|
236233
|
+
": ",
|
|
236234
|
+
schedules.length
|
|
236235
|
+
] })
|
|
236236
|
+
] }),
|
|
236237
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { WebkitAppRegion: "no-drag" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "default", size: "sm", className: "h-7 text-xs", onClick: () => setNewDialogOpen(true), children: [
|
|
236238
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-3" }),
|
|
236239
|
+
t2("automation.newSchedule", "New Schedule")
|
|
236240
|
+
] }) })
|
|
236241
|
+
]
|
|
236242
|
+
}
|
|
236243
|
+
),
|
|
236244
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-5 py-4 w-full max-w-4xl mx-auto", children: schedules.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center py-16 text-sm text-muted-foreground", children: [
|
|
236245
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-1", children: t2("automation.noSchedules", "No schedules yet") }),
|
|
236246
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "sm", className: "h-7 text-xs mt-2", onClick: () => setNewDialogOpen(true), children: [
|
|
236247
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-3 mr-1" }),
|
|
236248
|
+
t2("automation.createFirst", "Create your first schedule")
|
|
236249
|
+
] })
|
|
236250
|
+
] }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ItemGroup, { className: "gap-0", children: schedules.map((schedule2, index2) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
|
|
236251
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236252
|
+
Item,
|
|
236253
|
+
{
|
|
236254
|
+
size: "sm",
|
|
236255
|
+
className: "hover:bg-muted",
|
|
236256
|
+
onClick: () => navigate(`/automation/schedule/${schedule2.id}`),
|
|
236257
|
+
children: [
|
|
236258
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ItemContent, { children: [
|
|
236259
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ItemTitle, { className: "truncate", children: [
|
|
236260
|
+
schedule2.name,
|
|
236261
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-normal text-muted-foreground ml-2 uppercase", children: schedule2.agentId })
|
|
236262
|
+
] }),
|
|
236263
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ItemDescription, { className: "line-clamp-1 text-xs", children: [
|
|
236264
|
+
getScheduleLabel(schedule2),
|
|
236265
|
+
schedule2.lastRunAt && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
236266
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1.5", children: "·" }),
|
|
236267
|
+
t2("automation.cron.lastRun", "Last run"),
|
|
236268
|
+
": ",
|
|
236269
|
+
new Date(schedule2.lastRunAt).toLocaleString()
|
|
236270
|
+
] }),
|
|
236271
|
+
schedule2.nextRunAt && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
236272
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1.5", children: "·" }),
|
|
236273
|
+
t2("automation.cron.nextRun", "Next run"),
|
|
236274
|
+
": ",
|
|
236275
|
+
new Date(schedule2.nextRunAt).toLocaleString(),
|
|
236276
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1.5", children: "·" }),
|
|
236277
|
+
t2("automation.cron.nextRunIn", "Next run in"),
|
|
236278
|
+
" ",
|
|
236279
|
+
formatNextRun(schedule2),
|
|
236280
|
+
timezone && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground/50 ml-0.5", children: [
|
|
236281
|
+
"(",
|
|
236282
|
+
timezone,
|
|
236283
|
+
")"
|
|
236284
|
+
] })
|
|
236285
|
+
] })
|
|
236286
|
+
] })
|
|
236287
|
+
] }),
|
|
236288
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ItemActions, { className: "gap-0.5", children: [
|
|
236289
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236290
|
+
Button,
|
|
236291
|
+
{
|
|
236292
|
+
variant: "ghost",
|
|
236293
|
+
size: "icon",
|
|
236294
|
+
className: "size-7 text-foreground/50 hover:text-foreground hover:bg-accent",
|
|
236295
|
+
onClick: (e2) => {
|
|
236296
|
+
e2.stopPropagation();
|
|
236297
|
+
void handleTrigger(schedule2.id);
|
|
236298
|
+
},
|
|
236299
|
+
title: t2("automation.triggerNow", "Trigger now"),
|
|
236300
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Play, { className: "size-3.5" })
|
|
236301
|
+
}
|
|
236302
|
+
),
|
|
236303
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236304
|
+
Button,
|
|
236305
|
+
{
|
|
236306
|
+
variant: "ghost",
|
|
236307
|
+
size: "icon",
|
|
236308
|
+
className: "size-7 text-foreground/50 hover:text-foreground hover:bg-accent",
|
|
236309
|
+
onClick: (e2) => {
|
|
236310
|
+
e2.stopPropagation();
|
|
236311
|
+
setEditSchedule(schedule2);
|
|
236312
|
+
},
|
|
236313
|
+
title: t2("automation.editSettings", "Edit settings"),
|
|
236314
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings2, { className: "size-3.5" })
|
|
236315
|
+
}
|
|
236316
|
+
),
|
|
236317
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236318
|
+
Button,
|
|
236319
|
+
{
|
|
236320
|
+
variant: "ghost",
|
|
236321
|
+
size: "icon",
|
|
236322
|
+
className: "size-7 text-destructive/50 hover:text-destructive hover:bg-destructive/10",
|
|
236323
|
+
onClick: (e2) => {
|
|
236324
|
+
e2.stopPropagation();
|
|
236325
|
+
void handleDelete2(schedule2);
|
|
236326
|
+
},
|
|
236327
|
+
title: t2("automation.delete", "Delete"),
|
|
236328
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5" })
|
|
236329
|
+
}
|
|
236330
|
+
)
|
|
236331
|
+
] })
|
|
236332
|
+
]
|
|
236333
|
+
}
|
|
236334
|
+
),
|
|
236335
|
+
index2 < schedules.length - 1 && /* @__PURE__ */ jsxRuntimeExports.jsx(ItemSeparator, {})
|
|
236336
|
+
] }, schedule2.id)) }) }) }),
|
|
236337
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236338
|
+
SettingDialog,
|
|
236339
|
+
{
|
|
236340
|
+
open: newDialogOpen,
|
|
236341
|
+
onOpenChange: setNewDialogOpen,
|
|
236342
|
+
onSuccess: () => void loadSchedules()
|
|
236343
|
+
}
|
|
236344
|
+
),
|
|
236345
|
+
editSchedule && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236346
|
+
SettingDialog,
|
|
236347
|
+
{
|
|
236348
|
+
schedule: editSchedule,
|
|
236349
|
+
open: editSchedule !== null,
|
|
236350
|
+
onOpenChange: (open2) => {
|
|
236351
|
+
if (!open2) setEditSchedule(null);
|
|
236352
|
+
},
|
|
236353
|
+
onSuccess: () => void loadSchedules()
|
|
236354
|
+
}
|
|
236355
|
+
)
|
|
236356
|
+
] });
|
|
236357
|
+
}
|
|
236358
|
+
function Schedule() {
|
|
236359
|
+
const { scheduleId } = useParams();
|
|
236360
|
+
const { t: t2 } = useTranslation();
|
|
236361
|
+
const navigate = useNavigate();
|
|
236362
|
+
const location2 = useLocation();
|
|
236363
|
+
const { confirm: confirm2 } = useMessage();
|
|
236364
|
+
const hasTaskRoute = location2.pathname.includes("/task/");
|
|
236365
|
+
const [schedule2, setSchedule] = reactExports.useState(null);
|
|
236366
|
+
const [tasks, setTasks] = reactExports.useState([]);
|
|
236367
|
+
const [loading, setLoading] = reactExports.useState(true);
|
|
236368
|
+
const [editDialogOpen, setEditDialogOpen] = reactExports.useState(false);
|
|
236369
|
+
const [timezone, setTimezone] = reactExports.useState("");
|
|
236370
|
+
reactExports.useEffect(() => {
|
|
236371
|
+
request.getServerTimezone().then(setTimezone).catch(() => {
|
|
236372
|
+
});
|
|
236373
|
+
}, []);
|
|
236374
|
+
const loadData = reactExports.useCallback(async () => {
|
|
236375
|
+
if (!scheduleId) return;
|
|
236376
|
+
try {
|
|
236377
|
+
const [scheduleData, tasksData] = await Promise.all([
|
|
236378
|
+
request.listSchedules().then((list2) => list2.find((s16) => s16.id === scheduleId)),
|
|
236379
|
+
request.getTasks({ scheduleId })
|
|
236380
|
+
]);
|
|
236381
|
+
setSchedule(scheduleData ?? null);
|
|
236382
|
+
setTasks(tasksData ?? []);
|
|
236383
|
+
} catch {
|
|
236384
|
+
} finally {
|
|
236385
|
+
setLoading(false);
|
|
236386
|
+
}
|
|
236387
|
+
}, [scheduleId]);
|
|
236388
|
+
reactExports.useEffect(() => {
|
|
236389
|
+
void loadData();
|
|
236390
|
+
}, [loadData]);
|
|
236391
|
+
reactExports.useEffect(() => {
|
|
236392
|
+
const h3 = () => void loadData();
|
|
236393
|
+
subscribe$1.on("schedules-changed", h3);
|
|
236394
|
+
return () => subscribe$1.off("schedules-changed", h3);
|
|
236395
|
+
}, [loadData]);
|
|
236396
|
+
reactExports.useEffect(() => {
|
|
236397
|
+
const h3 = (p3) => {
|
|
236398
|
+
if (p3.scheduleId === scheduleId) {
|
|
236399
|
+
setTasks((prev2) => {
|
|
236400
|
+
const idx = prev2.findIndex((t22) => t22.id === p3.task.id);
|
|
236401
|
+
if (idx >= 0) {
|
|
236402
|
+
const n2 = [...prev2];
|
|
236403
|
+
n2[idx] = p3.task;
|
|
236404
|
+
return n2;
|
|
236405
|
+
}
|
|
236406
|
+
return [p3.task, ...prev2];
|
|
236407
|
+
});
|
|
236408
|
+
}
|
|
236409
|
+
};
|
|
236410
|
+
subscribe$1.on("task-update", h3);
|
|
236411
|
+
return () => subscribe$1.off("task-update", h3);
|
|
236412
|
+
}, [scheduleId]);
|
|
236413
|
+
const handleTrigger = async () => {
|
|
236414
|
+
if (!scheduleId) return;
|
|
236415
|
+
try {
|
|
236416
|
+
await request.triggerSchedule({ scheduleId });
|
|
236417
|
+
} catch {
|
|
236418
|
+
}
|
|
236419
|
+
};
|
|
236420
|
+
const handleDeleteTask = async (task) => {
|
|
236421
|
+
if (!scheduleId) return;
|
|
236422
|
+
await confirm2({
|
|
236423
|
+
title: t2("automation.deleteTaskTitle", "Delete Task"),
|
|
236424
|
+
content: t2("automation.deleteTaskConfirm", "Delete this task permanently?"),
|
|
236425
|
+
buttons: [
|
|
236426
|
+
{ text: t2("automation.cancel", "Cancel"), value: null, variant: "outline" },
|
|
236427
|
+
{
|
|
236428
|
+
text: t2("automation.delete", "Delete"),
|
|
236429
|
+
value: async () => {
|
|
236430
|
+
await request.deleteTask({ scheduleId, taskId: task.id });
|
|
236431
|
+
setTasks((prev2) => prev2.filter((t22) => t22.id !== task.id));
|
|
236432
|
+
return "deleted";
|
|
236433
|
+
},
|
|
236434
|
+
variant: "destructive"
|
|
236435
|
+
}
|
|
236436
|
+
]
|
|
236437
|
+
});
|
|
236438
|
+
};
|
|
236439
|
+
const getTaskIcon = (task) => {
|
|
236440
|
+
switch (task.status) {
|
|
236441
|
+
case "running":
|
|
236442
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin text-blue-500" });
|
|
236443
|
+
case "success":
|
|
236444
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "size-3.5 text-green-500" });
|
|
236445
|
+
case "error":
|
|
236446
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleX, { className: "size-3.5 text-red-500" });
|
|
236447
|
+
}
|
|
236448
|
+
};
|
|
236449
|
+
if (loading) {
|
|
236450
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
|
|
236451
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-12 shrink-0 border-b border-border flex items-center px-6", style: { WebkitAppRegion: "drag" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: "—" }) }),
|
|
236452
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-1 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-6 animate-spin text-muted-foreground" }) })
|
|
236453
|
+
] });
|
|
236454
|
+
}
|
|
236455
|
+
if (!schedule2) {
|
|
236456
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col items-center justify-center relative overflow-hidden gap-3", children: [
|
|
236457
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute left-0 top-0 right-0 h-12", style: { WebkitAppRegion: "drag" } }),
|
|
236458
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-normal text-muted-foreground", children: t2("automation.scheduleNotFound", "Schedule not found") }),
|
|
236459
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "sm", className: "h-7 text-xs", onClick: () => navigate("/automation"), children: [
|
|
236460
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "size-3" }),
|
|
236461
|
+
t2("automation.back", "Back")
|
|
236462
|
+
] })
|
|
236463
|
+
] });
|
|
236464
|
+
}
|
|
236465
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
|
|
236466
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-12 shrink-0 border-b border-border flex items-center gap-1 px-2", style: { WebkitAppRegion: "drag" }, children: [
|
|
236467
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { WebkitAppRegion: "no-drag" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "icon", className: "size-7 shrink-0", onClick: () => navigate("/automation"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "size-3.5" }) }) }),
|
|
236468
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
|
|
236469
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium truncate", children: schedule2.name }),
|
|
236470
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: "px-1 text-[10px] uppercase shrink-0", children: schedule2.agentId })
|
|
236471
|
+
] }),
|
|
236472
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs text-muted-foreground hidden sm:block shrink-0 mr-2", children: [
|
|
236473
|
+
schedule2.cron.type === "cron" ? schedule2.cron.expr : t2("automation.manual", "Manual"),
|
|
236474
|
+
schedule2.nextRunAt && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
236475
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1", children: "·" }),
|
|
236476
|
+
t2("automation.cron.nextRun", "Next"),
|
|
236477
|
+
": ",
|
|
236478
|
+
new Date(schedule2.nextRunAt).toLocaleString(),
|
|
236479
|
+
timezone && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground/50 ml-0.5", children: [
|
|
236480
|
+
"(",
|
|
236481
|
+
timezone,
|
|
236482
|
+
")"
|
|
236483
|
+
] })
|
|
236484
|
+
] })
|
|
236485
|
+
] }),
|
|
236486
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", style: { WebkitAppRegion: "no-drag" }, children: [
|
|
236487
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "icon", className: "size-7", onClick: () => setEditDialogOpen(true), title: t2("automation.editSettings", "Edit settings"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings2, { className: "size-3.5" }) }),
|
|
236488
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "default", size: "sm", className: "h-7 text-xs shrink-0", onClick: handleTrigger, children: [
|
|
236489
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Play, { className: "size-3 mr-1" }),
|
|
236490
|
+
t2("automation.triggerNow", "Trigger now")
|
|
236491
|
+
] })
|
|
236492
|
+
] })
|
|
236493
|
+
] }),
|
|
236494
|
+
tasks.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-1 flex-col items-center justify-center gap-2 text-center px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t2("automation.noTasksDesc", 'No runs yet. Click "Trigger now" to start the first run.') }) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(ResizablePanelGroup, { className: "flex-1 min-h-0", children: [
|
|
236495
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "taskList", groupResizeBehavior: "preserve-pixel-size", defaultSize: 200, minSize: 180, maxSize: 400, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-full flex flex-col", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: [...tasks].sort((a2, b2) => b2.startedAt - a2.startedAt).map((task) => {
|
|
236496
|
+
const isActive = location2.pathname.endsWith(`/task/${task.id}`);
|
|
236497
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
|
|
236498
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236499
|
+
ContextMenuTrigger,
|
|
236500
|
+
{
|
|
236501
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
|
|
236502
|
+
className: `group border-b border-border flex h-10 cursor-default items-center px-3 text-xs font-normal transition-colors ${isActive ? "bg-accent/70 hover:bg-accent text-accent-foreground/95" : "text-foreground/70 hover:bg-accent hover:text-foreground"}`,
|
|
236503
|
+
onClick: () => navigate(`/automation/schedule/${scheduleId}/task/${task.id}`),
|
|
236504
|
+
children: [
|
|
236505
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-baseline gap-2", children: [
|
|
236506
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "truncate", children: new Date(task.startedAt).toLocaleDateString() }),
|
|
236507
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground truncate text-[11px]", children: new Date(task.startedAt).toLocaleTimeString() })
|
|
236508
|
+
] }),
|
|
236509
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0 ml-2", children: getTaskIcon(task) })
|
|
236510
|
+
]
|
|
236511
|
+
}
|
|
236512
|
+
),
|
|
236513
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236514
|
+
ContextMenuItem,
|
|
236515
|
+
{
|
|
236516
|
+
variant: "destructive",
|
|
236517
|
+
onClick: () => void handleDeleteTask(task),
|
|
236518
|
+
children: [
|
|
236519
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5 mr-2" }),
|
|
236520
|
+
t2("automation.delete", "Delete")
|
|
236521
|
+
]
|
|
236522
|
+
}
|
|
236523
|
+
) })
|
|
236524
|
+
] }, task.id);
|
|
236525
|
+
}) }) }) }) }),
|
|
236526
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizableHandle, { className: "bg-border/70" }),
|
|
236527
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "right", children: hasTaskRoute ? /* @__PURE__ */ jsxRuntimeExports.jsx(Outlet, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col items-center justify-center h-full gap-2 text-center px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t2("automation.selectTaskToPreview", "Select a task to preview files") }) }) })
|
|
236528
|
+
] }),
|
|
236529
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236530
|
+
SettingDialog,
|
|
236531
|
+
{
|
|
236532
|
+
schedule: schedule2,
|
|
236533
|
+
open: editDialogOpen,
|
|
236534
|
+
onOpenChange: setEditDialogOpen,
|
|
236535
|
+
onSuccess: () => void loadData()
|
|
236536
|
+
}
|
|
236537
|
+
)
|
|
236538
|
+
] });
|
|
236539
|
+
}
|
|
236540
|
+
const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "gif", "webp", "avif", "bmp", "svg", "ico"];
|
|
236541
|
+
const FILE_EXT_MAP = {
|
|
236542
|
+
pdf: "pdf",
|
|
236543
|
+
docx: "docx",
|
|
236544
|
+
pptx: "pptx",
|
|
236545
|
+
xlsx: "xlsx",
|
|
236546
|
+
xls: "xlsx",
|
|
236547
|
+
html: "html",
|
|
236548
|
+
htm: "html"
|
|
236549
|
+
};
|
|
236550
|
+
function getFileKind(filename) {
|
|
236551
|
+
if (!filename) return null;
|
|
236552
|
+
const ext = filename.split(".").pop()?.toLowerCase() || "";
|
|
236553
|
+
if (IMAGE_EXTENSIONS.includes(ext)) return "image";
|
|
236554
|
+
if (ext in FILE_EXT_MAP) return FILE_EXT_MAP[ext];
|
|
236555
|
+
if (ext === "md") return "markdown";
|
|
236556
|
+
return "text";
|
|
236557
|
+
}
|
|
236558
|
+
function CodeDetail({ fileName, content: content2 }) {
|
|
236559
|
+
const displayContent = reactExports.useMemo(() => {
|
|
236560
|
+
if (fileName.endsWith(".json")) {
|
|
236561
|
+
try {
|
|
236562
|
+
return JSON.stringify(JSON.parse(content2), null, 2);
|
|
236563
|
+
} catch {
|
|
236564
|
+
return content2;
|
|
236565
|
+
}
|
|
236566
|
+
}
|
|
236567
|
+
return content2;
|
|
236568
|
+
}, [fileName, content2]);
|
|
236569
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(CodeView, { className: "min-h-full", content: displayContent, filename: fileName }) });
|
|
236570
|
+
}
|
|
236571
|
+
function MarkdownDetail({ fileName, content: content2 }) {
|
|
236572
|
+
const { t: t2 } = useTranslation();
|
|
236573
|
+
const [viewMode, setViewMode] = reactExports.useState("preview");
|
|
236574
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative h-full overflow-hidden", children: [
|
|
236575
|
+
viewMode === "preview" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 max-w-3xl", children: /* @__PURE__ */ jsxRuntimeExports.jsx(StreamMarkdown, { children: content2 }) }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(CodeView, { className: "min-h-full", content: content2, filename: fileName }) }),
|
|
236576
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute bottom-4 left-0 right-0 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236577
|
+
Tabs,
|
|
236578
|
+
{
|
|
236579
|
+
value: viewMode,
|
|
236580
|
+
onValueChange: (v4) => setViewMode(v4),
|
|
236581
|
+
className: "pointer-events-auto",
|
|
236582
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(TabsList, { className: "h-8 border border-border shadow-lg", children: [
|
|
236583
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "preview", className: "text-xs min-w-18", children: t2("fileDetail.preview", "Preview") }),
|
|
236584
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "code", className: "text-xs min-w-18", children: t2("fileDetail.code", "Code") })
|
|
236585
|
+
] })
|
|
236586
|
+
}
|
|
236587
|
+
) })
|
|
236588
|
+
] });
|
|
236589
|
+
}
|
|
236590
|
+
function ImageDetail({ fileName }) {
|
|
236591
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
|
|
236592
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "size-8" }),
|
|
236593
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236594
|
+
] }) });
|
|
236595
|
+
}
|
|
236596
|
+
function PdfDetail({ fileName }) {
|
|
236597
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
|
|
236598
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
|
|
236599
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236600
|
+
] }) });
|
|
236601
|
+
}
|
|
236602
|
+
function DocxDetail({ fileName }) {
|
|
236603
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
|
|
236604
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
|
|
236605
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236606
|
+
] }) });
|
|
236607
|
+
}
|
|
236608
|
+
function PptxDetail({ fileName }) {
|
|
236609
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
|
|
236610
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
|
|
236611
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236612
|
+
] }) });
|
|
236613
|
+
}
|
|
236614
|
+
function XlsxDetail({ fileName }) {
|
|
236615
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
|
|
236616
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
|
|
236617
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236618
|
+
] }) });
|
|
236619
|
+
}
|
|
236620
|
+
function HtmlDetail({ content: content2 }) {
|
|
236621
|
+
const srcDoc = reactExports.useMemo(() => {
|
|
236622
|
+
if (content2.trim().startsWith("<") && !content2.toLowerCase().includes("<!doctype") && !content2.toLowerCase().includes("<html")) {
|
|
236623
|
+
return `<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>${content2}</body></html>`;
|
|
236624
|
+
}
|
|
236625
|
+
return content2;
|
|
236626
|
+
}, [content2]);
|
|
236627
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236628
|
+
"iframe",
|
|
236629
|
+
{
|
|
236630
|
+
srcDoc,
|
|
236631
|
+
className: "w-full h-full border-0 bg-white",
|
|
236632
|
+
title: "HTML Preview",
|
|
236633
|
+
sandbox: "allow-scripts"
|
|
236634
|
+
}
|
|
236635
|
+
);
|
|
236636
|
+
}
|
|
236637
|
+
function isBinaryContent(content2) {
|
|
236638
|
+
const len = Math.min(content2.length, 512);
|
|
236639
|
+
let nullCount = 0;
|
|
236640
|
+
let nonPrintableCount = 0;
|
|
236641
|
+
for (let i3 = 0; i3 < len; i3++) {
|
|
236642
|
+
const code2 = content2.charCodeAt(i3);
|
|
236643
|
+
if (code2 === 0) nullCount++;
|
|
236644
|
+
else if (code2 < 8 || code2 > 13 && code2 < 32) nonPrintableCount++;
|
|
236645
|
+
}
|
|
236646
|
+
return nullCount > 0 || nonPrintableCount > len * 0.3;
|
|
236647
|
+
}
|
|
236648
|
+
function FileDetail({ fileName, fileContent, fileLoading, hasTask, hasFiles }) {
|
|
236649
|
+
const { t: t2 } = useTranslation();
|
|
236650
|
+
const fileKind = reactExports.useMemo(() => getFileKind(fileName), [fileName]);
|
|
236651
|
+
const isUnsupportedBinary = reactExports.useMemo(() => {
|
|
236652
|
+
if (!fileContent || !fileName) return false;
|
|
236653
|
+
if (fileKind === "image" || fileKind === "pdf" || fileKind === "docx" || fileKind === "pptx" || fileKind === "xlsx") return false;
|
|
236654
|
+
return isBinaryContent(fileContent);
|
|
236655
|
+
}, [fileContent, fileName, fileKind]);
|
|
236656
|
+
if (!hasTask) {
|
|
236657
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full text-xs text-muted-foreground", children: t2("automation.selectTaskToPreview", "Select a task to preview files") });
|
|
236658
|
+
}
|
|
236659
|
+
if (!hasFiles) {
|
|
236660
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full text-xs text-muted-foreground", children: t2("automation.noFiles", "No files generated") });
|
|
236661
|
+
}
|
|
236662
|
+
if (!fileName) {
|
|
236663
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full text-xs text-muted-foreground", children: t2("automation.selectFileToPreview", "Select a file to preview") });
|
|
236664
|
+
}
|
|
236665
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col w-full h-full min-w-0 relative overflow-hidden", children: [
|
|
236666
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-10 shrink-0 border-b border-border flex items-center justify-between gap-2 px-2 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center min-w-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 flex items-center gap-1.5", children: [
|
|
236667
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { name: fileName, className: "size-4 shrink-0 text-muted-foreground/80" }),
|
|
236668
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col min-w-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs truncate leading-tight text-foreground/60", children: fileName }) })
|
|
236669
|
+
] }) }) }),
|
|
236670
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative flex-1 min-h-0 overflow-hidden", children: fileLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-4 animate-spin text-muted-foreground" }) }) : isUnsupportedBinary ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full text-xs text-muted-foreground", children: t2("fileDetail.fileFormatNotSupported", "File format not supported for preview") }) : fileKind === "image" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ImageDetail, { fileName, content: fileContent ?? "" }) : fileKind === "markdown" ? /* @__PURE__ */ jsxRuntimeExports.jsx(MarkdownDetail, { fileName, content: fileContent ?? "" }) : fileKind === "html" ? /* @__PURE__ */ jsxRuntimeExports.jsx(HtmlDetail, { fileName, content: fileContent ?? "" }) : fileKind === "pdf" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PdfDetail, { fileName, content: fileContent ?? "" }) : fileKind === "docx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(DocxDetail, { fileName, content: fileContent ?? "" }) : fileKind === "pptx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PptxDetail, { fileName, content: fileContent ?? "" }) : fileKind === "xlsx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(XlsxDetail, { fileName, content: fileContent ?? "" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(CodeDetail, { fileName, content: fileContent ?? "" }) })
|
|
236671
|
+
] });
|
|
236672
|
+
}
|
|
236673
|
+
function buildTree2(paths) {
|
|
236674
|
+
const root2 = [];
|
|
236675
|
+
for (const fullPath of paths) {
|
|
236676
|
+
const parts = fullPath.split("/");
|
|
236677
|
+
let current = root2;
|
|
236678
|
+
for (let i3 = 0; i3 < parts.length; i3++) {
|
|
236679
|
+
const part = parts[i3];
|
|
236680
|
+
const isLast = i3 === parts.length - 1;
|
|
236681
|
+
const nodePath = parts.slice(0, i3 + 1).join("/");
|
|
236682
|
+
let existing = current.find((n2) => n2.name === part);
|
|
236683
|
+
if (!existing) {
|
|
236684
|
+
existing = {
|
|
236685
|
+
name: part,
|
|
236686
|
+
path: nodePath,
|
|
236687
|
+
isFolder: !isLast,
|
|
236688
|
+
children: !isLast ? [] : void 0
|
|
236689
|
+
};
|
|
236690
|
+
current.push(existing);
|
|
236691
|
+
}
|
|
236692
|
+
if (existing.children) current = existing.children;
|
|
236693
|
+
}
|
|
236694
|
+
}
|
|
236695
|
+
return root2;
|
|
236696
|
+
}
|
|
236697
|
+
function FileTree({
|
|
236698
|
+
nodes,
|
|
236699
|
+
depth,
|
|
236700
|
+
selectedFile,
|
|
236701
|
+
onSelectFile,
|
|
236702
|
+
openFolders,
|
|
236703
|
+
toggleFolder,
|
|
236704
|
+
onCopyRelativePath,
|
|
236705
|
+
onCopyAbsolutePath,
|
|
236706
|
+
onRevealInFinder
|
|
236707
|
+
}) {
|
|
236708
|
+
const { t: t2 } = useTranslation();
|
|
236709
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: nodes.map((node2) => {
|
|
236710
|
+
if (node2.isFolder) {
|
|
236711
|
+
const isOpen = openFolders.has(node2.path);
|
|
236712
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
|
|
236713
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236714
|
+
"div",
|
|
236715
|
+
{
|
|
236716
|
+
className: cn$5(
|
|
236717
|
+
"flex h-6 cursor-default select-none items-center gap-1.5 px-1.5 text-sx leading-none text-foreground/60 hover:bg-primary/5 hover:text-foreground"
|
|
236718
|
+
),
|
|
236719
|
+
style: { paddingLeft: `${depth * 16 + 6}px` },
|
|
236720
|
+
onClick: () => toggleFolder(node2.path),
|
|
236721
|
+
children: [
|
|
236722
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236723
|
+
ChevronRight,
|
|
236724
|
+
{
|
|
236725
|
+
className: cn$5("size-3.5 shrink-0 text-muted-foreground transition-transform", isOpen && "rotate-90")
|
|
236726
|
+
}
|
|
236727
|
+
),
|
|
236728
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Folder$1, { className: "size-4 shrink-0 text-muted-foreground/90" }),
|
|
236729
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal", children: node2.name })
|
|
236730
|
+
]
|
|
236731
|
+
}
|
|
236732
|
+
),
|
|
236733
|
+
isOpen && node2.children && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236734
|
+
FileTree,
|
|
236735
|
+
{
|
|
236736
|
+
nodes: node2.children,
|
|
236737
|
+
depth: depth + 1,
|
|
236738
|
+
selectedFile,
|
|
236739
|
+
onSelectFile,
|
|
236740
|
+
openFolders,
|
|
236741
|
+
toggleFolder,
|
|
236742
|
+
onCopyRelativePath,
|
|
236743
|
+
onCopyAbsolutePath,
|
|
236744
|
+
onRevealInFinder
|
|
236745
|
+
}
|
|
236746
|
+
)
|
|
236747
|
+
] }, node2.path);
|
|
236748
|
+
}
|
|
236749
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
|
|
236750
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236751
|
+
ContextMenuTrigger,
|
|
236752
|
+
{
|
|
236753
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
|
|
236754
|
+
className: cn$5(
|
|
236755
|
+
"flex h-6 cursor-default select-none items-center gap-1.5 px-1.5 text-sx leading-none text-foreground/60 hover:bg-primary/5 hover:text-foreground",
|
|
236756
|
+
selectedFile === node2.path && "text-foreground bg-primary/6"
|
|
236757
|
+
),
|
|
236758
|
+
style: { paddingLeft: `${depth * 16 + 6}px` },
|
|
236759
|
+
onClick: () => onSelectFile(node2.path),
|
|
236760
|
+
children: [
|
|
236761
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-3.5 shrink-0" }),
|
|
236762
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { name: node2.name, className: "size-4 shrink-0 text-muted-foreground/90" }),
|
|
236763
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal", children: node2.name })
|
|
236764
|
+
]
|
|
236765
|
+
}
|
|
236766
|
+
),
|
|
236767
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { children: [
|
|
236768
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onCopyRelativePath(node2.path), children: [
|
|
236769
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3.5 mr-2" }),
|
|
236770
|
+
t2("filePanel.copyPath", "Copy Path")
|
|
236771
|
+
] }),
|
|
236772
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onCopyAbsolutePath(node2.path), children: [
|
|
236773
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3.5 mr-2" }),
|
|
236774
|
+
t2("filePanel.copyAbsolutePath", "Copy Absolute Path")
|
|
236775
|
+
] }),
|
|
236776
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
236777
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onRevealInFinder(node2.path), children: [
|
|
236778
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3.5 mr-2" }),
|
|
236779
|
+
t2("filePanel.revealInFinder", "Reveal in Finder")
|
|
236780
|
+
] })
|
|
236781
|
+
] })
|
|
236782
|
+
] }, node2.path);
|
|
236783
|
+
}) });
|
|
236784
|
+
}
|
|
236785
|
+
function Panel({
|
|
236786
|
+
files,
|
|
236787
|
+
selectedFile,
|
|
236788
|
+
hasTask,
|
|
236789
|
+
onSelectFile,
|
|
236790
|
+
onCopyRelativePath,
|
|
236791
|
+
onCopyAbsolutePath,
|
|
236792
|
+
onRevealInFinder
|
|
236793
|
+
}) {
|
|
236794
|
+
const { t: t2 } = useTranslation();
|
|
236795
|
+
const [openFolders, setOpenFolders] = reactExports.useState(/* @__PURE__ */ new Set());
|
|
236796
|
+
const tree = reactExports.useMemo(() => buildTree2(files), [files]);
|
|
236797
|
+
reactExports.useEffect(() => {
|
|
236798
|
+
const allFolders = /* @__PURE__ */ new Set();
|
|
236799
|
+
for (const f2 of files) {
|
|
236800
|
+
const parts = f2.split("/");
|
|
236801
|
+
for (let i3 = 1; i3 < parts.length; i3++) {
|
|
236802
|
+
allFolders.add(parts.slice(0, i3).join("/"));
|
|
236803
|
+
}
|
|
236804
|
+
}
|
|
236805
|
+
setOpenFolders(allFolders);
|
|
236806
|
+
}, [files]);
|
|
236807
|
+
const toggleFolder = (path2) => {
|
|
236808
|
+
setOpenFolders((prev2) => {
|
|
236809
|
+
const next2 = new Set(prev2);
|
|
236810
|
+
if (next2.has(path2)) next2.delete(path2);
|
|
236811
|
+
else next2.add(path2);
|
|
236812
|
+
return next2;
|
|
236813
|
+
});
|
|
236814
|
+
};
|
|
236815
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full min-h-0 flex-col text-xs w-full", children: [
|
|
236816
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-10 items-center gap-0.5 border-b border-border", children: [
|
|
236817
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex text-muted-foreground items-center gap-1 px-3", children: [
|
|
236818
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Folders, { className: "size-4" }),
|
|
236819
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-medium text-nowrap", children: t2("automation.files", "Files") })
|
|
236820
|
+
] }),
|
|
236821
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-auto mr-2 flex items-center gap-0.5", children: tree.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236822
|
+
"button",
|
|
236823
|
+
{
|
|
236824
|
+
className: "flex size-6 items-center justify-center text-muted-foreground hover:text-foreground rounded",
|
|
236825
|
+
onClick: () => setOpenFolders(/* @__PURE__ */ new Set()),
|
|
236826
|
+
title: t2("filePanel.collapseFolders", "Collapse folders"),
|
|
236827
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronsDownUp, { className: "size-3.5" })
|
|
236828
|
+
}
|
|
236829
|
+
) })
|
|
236830
|
+
] }),
|
|
236831
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "py-1", children: !hasTask ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: t2("automation.selectTask", "Select a task") }) : files.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: t2("automation.noFiles", "No files") }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236832
|
+
FileTree,
|
|
236833
|
+
{
|
|
236834
|
+
nodes: tree,
|
|
236835
|
+
depth: 0,
|
|
236836
|
+
selectedFile,
|
|
236837
|
+
onSelectFile,
|
|
236838
|
+
openFolders,
|
|
236839
|
+
toggleFolder,
|
|
236840
|
+
onCopyRelativePath,
|
|
236841
|
+
onCopyAbsolutePath,
|
|
236842
|
+
onRevealInFinder
|
|
236843
|
+
}
|
|
236844
|
+
) }) })
|
|
236845
|
+
] });
|
|
236846
|
+
}
|
|
236847
|
+
function Task() {
|
|
236848
|
+
const { scheduleId, taskId } = useParams();
|
|
236849
|
+
const { t: t2 } = useTranslation();
|
|
236850
|
+
const [taskFiles, setTaskFiles] = reactExports.useState([]);
|
|
236851
|
+
const [selectedFile, setSelectedFile] = reactExports.useState(null);
|
|
236852
|
+
const [fileContent, setFileContent] = reactExports.useState(null);
|
|
236853
|
+
const [fileLoading, setFileLoading] = reactExports.useState(false);
|
|
236854
|
+
const [loading, setLoading] = reactExports.useState(true);
|
|
236855
|
+
const loadFiles = reactExports.useCallback(async () => {
|
|
236856
|
+
if (!scheduleId || !taskId) return;
|
|
236857
|
+
try {
|
|
236858
|
+
const files = await request.getTaskFiles({ scheduleId, taskId });
|
|
236859
|
+
setTaskFiles(files ?? []);
|
|
236860
|
+
const readme = (files ?? []).find((f2) => f2.toLowerCase() === "readme.md");
|
|
236861
|
+
setSelectedFile(readme ?? null);
|
|
236862
|
+
setFileContent(null);
|
|
236863
|
+
} catch {
|
|
236864
|
+
setTaskFiles([]);
|
|
236865
|
+
} finally {
|
|
236866
|
+
setLoading(false);
|
|
236867
|
+
}
|
|
236868
|
+
}, [scheduleId, taskId]);
|
|
236869
|
+
reactExports.useEffect(() => {
|
|
236870
|
+
setLoading(true);
|
|
236871
|
+
void loadFiles();
|
|
236872
|
+
}, [loadFiles]);
|
|
236873
|
+
reactExports.useEffect(() => {
|
|
236874
|
+
const handler = (payload) => {
|
|
236875
|
+
if (payload.scheduleId === scheduleId && payload.task?.id === taskId && payload.task.status !== "running") {
|
|
236876
|
+
void loadFiles();
|
|
236877
|
+
}
|
|
236878
|
+
};
|
|
236879
|
+
subscribe$1.on("task-update", handler);
|
|
236880
|
+
return () => subscribe$1.off("task-update", handler);
|
|
236881
|
+
}, [scheduleId, taskId, loadFiles]);
|
|
236882
|
+
reactExports.useEffect(() => {
|
|
236883
|
+
if (!selectedFile || !scheduleId || !taskId) {
|
|
236884
|
+
setFileContent(null);
|
|
236885
|
+
return;
|
|
236886
|
+
}
|
|
236887
|
+
setFileLoading(true);
|
|
236888
|
+
(async () => {
|
|
236889
|
+
try {
|
|
236890
|
+
const content2 = await request.readTaskFile({ scheduleId, taskId, filePath: selectedFile });
|
|
236891
|
+
setFileContent(content2 ?? null);
|
|
236892
|
+
} catch {
|
|
236893
|
+
setFileContent("// Error loading file");
|
|
236894
|
+
} finally {
|
|
236895
|
+
setFileLoading(false);
|
|
236896
|
+
}
|
|
236897
|
+
})();
|
|
236898
|
+
}, [selectedFile, scheduleId, taskId]);
|
|
236899
|
+
if (loading) {
|
|
236900
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-5 animate-spin text-muted-foreground" }) });
|
|
236901
|
+
}
|
|
236902
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(ResizablePanelGroup, { className: "h-full", children: [
|
|
236903
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "fileDetail", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236904
|
+
FileDetail,
|
|
236905
|
+
{
|
|
236906
|
+
fileName: selectedFile,
|
|
236907
|
+
fileContent,
|
|
236908
|
+
fileLoading,
|
|
236909
|
+
hasTask: true,
|
|
236910
|
+
hasFiles: taskFiles.length > 0
|
|
236911
|
+
}
|
|
236912
|
+
) }),
|
|
236913
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizableHandle, { className: "bg-border/70" }),
|
|
236914
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "filePanel", groupResizeBehavior: "preserve-pixel-size", defaultSize: 250, minSize: 250, maxSize: 400, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236915
|
+
Panel,
|
|
236916
|
+
{
|
|
236917
|
+
files: taskFiles,
|
|
236918
|
+
selectedFile,
|
|
236919
|
+
hasTask: true,
|
|
236920
|
+
onSelectFile: setSelectedFile,
|
|
236921
|
+
onCopyRelativePath: async (file) => {
|
|
236922
|
+
try {
|
|
236923
|
+
await copyText(file);
|
|
236924
|
+
} catch {
|
|
236925
|
+
}
|
|
236926
|
+
},
|
|
236927
|
+
onCopyAbsolutePath: async (file) => {
|
|
236928
|
+
try {
|
|
236929
|
+
const abs2 = await request.getTaskFileSystemPath({ scheduleId, taskId, filePath: file });
|
|
236930
|
+
await copyText(abs2);
|
|
236931
|
+
} catch {
|
|
236932
|
+
}
|
|
236933
|
+
},
|
|
236934
|
+
onRevealInFinder: async (file) => {
|
|
236935
|
+
if (isWebUI) return;
|
|
236936
|
+
try {
|
|
236937
|
+
const abs2 = await request.getTaskFileSystemPath({ scheduleId, taskId, filePath: file });
|
|
236938
|
+
await electron.revealInFinder(abs2);
|
|
236939
|
+
} catch {
|
|
236940
|
+
}
|
|
236941
|
+
}
|
|
236942
|
+
}
|
|
236943
|
+
) })
|
|
236944
|
+
] });
|
|
236945
|
+
}
|
|
235686
236946
|
function SessionWrapper() {
|
|
235687
236947
|
const { sessionId } = useParams();
|
|
235688
236948
|
const sessionInfo = useAppStore((s16) => s16.sessions.find((x2) => x2.id === sessionId));
|
|
@@ -235715,7 +236975,9 @@ function AppRouter() {
|
|
|
235715
236975
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(Route, { path: "/skills", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsLayout, {}), children: [
|
|
235716
236976
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "installed", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsInstalled, {}) }),
|
|
235717
236977
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "skills-sh", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsSh, {}) })
|
|
235718
|
-
] })
|
|
236978
|
+
] }),
|
|
236979
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/automation", element: /* @__PURE__ */ jsxRuntimeExports.jsx(Automation, {}) }),
|
|
236980
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/automation/schedule/:scheduleId", element: /* @__PURE__ */ jsxRuntimeExports.jsx(Schedule, {}), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "task/:taskId", element: /* @__PURE__ */ jsxRuntimeExports.jsx(Task, {}) }) })
|
|
235719
236981
|
] })
|
|
235720
236982
|
] });
|
|
235721
236983
|
}
|