@zythum02/fello-server 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/out/renderer/assets/{_baseUniq-C01H-TTl.js → _baseUniq-DLyIzzT_.js} +1 -1
- package/out/renderer/assets/{arc-BXqrFYj-.js → arc-Zxienobv.js} +1 -1
- package/out/renderer/assets/{architectureDiagram-Q4EWVU46-DlFz_4yO.js → architectureDiagram-Q4EWVU46-DLh2t5mE.js} +5 -5
- package/out/renderer/assets/{blockDiagram-DXYQGD6D-B_jYpKkP.js → blockDiagram-DXYQGD6D-CtAylmzM.js} +6 -6
- package/out/renderer/assets/{c4Diagram-AHTNJAMY-DWRXz6-S.js → c4Diagram-AHTNJAMY-ntNDbqWz.js} +2 -2
- package/out/renderer/assets/{channel-iMh-jYBg.js → channel-Z4VgLguf.js} +1 -1
- package/out/renderer/assets/{chunk-4BX2VUAB-CDXuLHIo.js → chunk-4BX2VUAB-BQWjQSCS.js} +1 -1
- package/out/renderer/assets/{chunk-4TB4RGXK-Bs-z-5kA.js → chunk-4TB4RGXK-DQ4qdRMQ.js} +5 -5
- package/out/renderer/assets/{chunk-55IACEB6-DBmLw2WJ.js → chunk-55IACEB6-CLBQrnT7.js} +1 -1
- package/out/renderer/assets/{chunk-EDXVE4YY-BhsDT27O.js → chunk-EDXVE4YY-ycJtaU57.js} +1 -1
- package/out/renderer/assets/{chunk-FMBD7UC4-C_qJYK5q.js → chunk-FMBD7UC4-D3ZuAVef.js} +1 -1
- package/out/renderer/assets/{chunk-OYMX7WX6-DIh7s3uw.js → chunk-OYMX7WX6-CAHx1d_X.js} +3 -3
- package/out/renderer/assets/{chunk-QZHKN3VN-CYa45CSJ.js → chunk-QZHKN3VN-eKV97jed.js} +1 -1
- package/out/renderer/assets/{chunk-YZCP3GAM-BeF07Xv_.js → chunk-YZCP3GAM-DkaxW5D7.js} +1 -1
- package/out/renderer/assets/{classDiagram-6PBFFD2Q-B12_6ldG.js → classDiagram-6PBFFD2Q-CpuoT-Jx.js} +6 -6
- package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-B12_6ldG.js → classDiagram-v2-HSJHXN6E-CpuoT-Jx.js} +6 -6
- package/out/renderer/assets/{clone-1GZJZPn3.js → clone-C_55Gq29.js} +1 -1
- package/out/renderer/assets/{cose-bilkent-S5V4N54A-CuSnz9Ro.js → cose-bilkent-S5V4N54A-DqTN-_zY.js} +1 -1
- package/out/renderer/assets/{dagre-KV5264BT-LHPLEy9g.js → dagre-KV5264BT-NIF-wzAb.js} +6 -6
- package/out/renderer/assets/{diagram-5BDNPKRD-DWjP3Jzr.js → diagram-5BDNPKRD-Cln0uWD9.js} +6 -6
- package/out/renderer/assets/{diagram-G4DWMVQ6-CM3uASto.js → diagram-G4DWMVQ6-BlnD83ee.js} +6 -6
- package/out/renderer/assets/{diagram-MMDJMWI5-X5oh5RON.js → diagram-MMDJMWI5-B7PHcRvh.js} +5 -5
- package/out/renderer/assets/{diagram-TYMM5635-iO4Xohj9.js → diagram-TYMM5635-B-O4bvMT.js} +5 -5
- package/out/renderer/assets/{erDiagram-SMLLAGMA-4xwE7Ysd.js → erDiagram-SMLLAGMA-1ZgzBjAm.js} +4 -4
- package/out/renderer/assets/{flowDiagram-DWJPFMVM-DoIqEJWm.js → flowDiagram-DWJPFMVM-CYt7MUO6.js} +6 -6
- package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-C48vXSUK.js → ganttDiagram-T4ZO3ILL-nHro8zN9.js} +2 -2
- package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-D3YiiEhK.js → gitGraphDiagram-UUTBAWPF-4nzL1En3.js} +6 -6
- package/out/renderer/assets/{graph-CYPfPCZi.js → graph-9FzrK4FU.js} +2 -2
- package/out/renderer/assets/{highlighted-body-OFNGDK62-B6M-kMLU.js → highlighted-body-OFNGDK62-VELQyUbs.js} +1 -1
- package/out/renderer/assets/{index-Dabo17L1.js → index-DChNtXAm.js} +2207 -566
- package/out/renderer/assets/index-I1XmNFoX.css +382 -0
- package/out/renderer/assets/{infoDiagram-42DDH7IO-ur7rRidE.js → infoDiagram-42DDH7IO-BgCd2fMi.js} +4 -4
- package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-fJSipMV8.js → ishikawaDiagram-UXIWVN3A-Dc9zBgQ3.js} +1 -1
- package/out/renderer/assets/{journeyDiagram-VCZTEJTY-TxjKxXBo.js → journeyDiagram-VCZTEJTY-Cl5-PgKK.js} +4 -4
- package/out/renderer/assets/{kanban-definition-6JOO6SKY-DJwjRjlE.js → kanban-definition-6JOO6SKY-CTdiOO_t.js} +2 -2
- package/out/renderer/assets/{layout-BT1ASsLg.js → layout-pad9cNSQ.js} +4 -4
- package/out/renderer/assets/{linear-ecuEcPGt.js → linear-C9kOAOci.js} +1 -1
- package/out/renderer/assets/{min-BYCDJeWK.js → min-B7SQAamY.js} +2 -2
- package/out/renderer/assets/{mindmap-definition-QFDTVHPH-D2MxZmzw.js → mindmap-definition-QFDTVHPH-DYc59m-R.js} +3 -3
- package/out/renderer/assets/{pieDiagram-DEJITSTG-Cew7QWxE.js → pieDiagram-DEJITSTG-DyXeoEBp.js} +6 -6
- package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-CrZCtVJh.js → quadrantDiagram-34T5L4WZ-hFY-GkiJ.js} +2 -2
- package/out/renderer/assets/{requirementDiagram-MS252O5E-C69IGxW8.js → requirementDiagram-MS252O5E-ecRwwTfv.js} +3 -3
- package/out/renderer/assets/{sankeyDiagram-XADWPNL6-B2tuS_nG.js → sankeyDiagram-XADWPNL6-BTL3sclU.js} +1 -1
- package/out/renderer/assets/{sequenceDiagram-FGHM5R23-Dv_lOZN1.js → sequenceDiagram-FGHM5R23-AV2u_2fd.js} +3 -3
- package/out/renderer/assets/{stateDiagram-FHFEXIEX-D9dJAqtV.js → stateDiagram-FHFEXIEX-DoTCNWMJ.js} +8 -8
- package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-CQXoaDY1.js → stateDiagram-v2-QKLJ7IA2--Ezn8EQY.js} +4 -4
- package/out/renderer/assets/{timeline-definition-GMOUNBTQ-DnnX0Ml0.js → timeline-definition-GMOUNBTQ-CQvZXAlZ.js} +2 -2
- package/out/renderer/assets/{vennDiagram-DHZGUBPP-BCIC8HTk.js → vennDiagram-DHZGUBPP-zJ6WGEop.js} +1 -1
- package/out/renderer/assets/{wardley-RL74JXVD-B35jxdMa.js → wardley-RL74JXVD-BPlNC-BP.js} +3 -3
- package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-D3rjXear.js → wardleyDiagram-NUSXRM2D-BAQ1Om89.js} +5 -5
- package/out/renderer/assets/{xychartDiagram-5P7HB3ND-095YR9W9.js → xychartDiagram-5P7HB3ND--HADKQzk.js} +2 -2
- package/out/renderer/index.html +2 -2
- package/out/server/main.js +723 -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-NIF-wzAb.js","./graph-9FzrK4FU.js","./_baseUniq-DLyIzzT_.js","./layout-pad9cNSQ.js","./min-B7SQAamY.js","./clone-C_55Gq29.js","./cose-bilkent-S5V4N54A-DqTN-_zY.js","./cytoscape.esm-Bm8DJGmZ.js","./c4Diagram-AHTNJAMY-ntNDbqWz.js","./chunk-YZCP3GAM-DkaxW5D7.js","./flowDiagram-DWJPFMVM-CYt7MUO6.js","./chunk-FMBD7UC4-D3ZuAVef.js","./chunk-55IACEB6-CLBQrnT7.js","./chunk-EDXVE4YY-ycJtaU57.js","./channel-Z4VgLguf.js","./erDiagram-SMLLAGMA-1ZgzBjAm.js","./gitGraphDiagram-UUTBAWPF-4nzL1En3.js","./chunk-4BX2VUAB-BQWjQSCS.js","./chunk-QZHKN3VN-eKV97jed.js","./wardley-RL74JXVD-BPlNC-BP.js","./ganttDiagram-T4ZO3ILL-nHro8zN9.js","./linear-C9kOAOci.js","./init-ZxktEp_H.js","./defaultLocale-B2RvLBDe.js","./infoDiagram-42DDH7IO-BgCd2fMi.js","./pieDiagram-DEJITSTG-DyXeoEBp.js","./arc-Zxienobv.js","./ordinal-CxptdPJm.js","./quadrantDiagram-34T5L4WZ-hFY-GkiJ.js","./xychartDiagram-5P7HB3ND--HADKQzk.js","./requirementDiagram-MS252O5E-ecRwwTfv.js","./sequenceDiagram-FGHM5R23-AV2u_2fd.js","./classDiagram-6PBFFD2Q-CpuoT-Jx.js","./chunk-4TB4RGXK-DQ4qdRMQ.js","./classDiagram-v2-HSJHXN6E-CpuoT-Jx.js","./stateDiagram-FHFEXIEX-DoTCNWMJ.js","./chunk-OYMX7WX6-CAHx1d_X.js","./stateDiagram-v2-QKLJ7IA2--Ezn8EQY.js","./journeyDiagram-VCZTEJTY-Cl5-PgKK.js","./timeline-definition-GMOUNBTQ-CQvZXAlZ.js","./mindmap-definition-QFDTVHPH-DYc59m-R.js","./kanban-definition-6JOO6SKY-CTdiOO_t.js","./sankeyDiagram-XADWPNL6-BTL3sclU.js","./diagram-TYMM5635-B-O4bvMT.js","./diagram-MMDJMWI5-B7PHcRvh.js","./blockDiagram-DXYQGD6D-CtAylmzM.js","./diagram-5BDNPKRD-Cln0uWD9.js","./architectureDiagram-Q4EWVU46-DLh2t5mE.js","./diagram-G4DWMVQ6-BlnD83ee.js","./wardleyDiagram-NUSXRM2D-BAQ1Om89.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" } };
|
|
@@ -15111,8 +15111,9 @@ const contentBlock$1 = { "unsupported": "Unsupported block type: {{type}}", "dow
|
|
|
15111
15111
|
const detail$1 = { "noContent": "No content" };
|
|
15112
15112
|
const fileDetail$1 = { "fileNotFound": "File not found", "fileTooLarge": "File is too large to preview", "fileFormatNotSupported": "File format not supported for preview", "errorLoading": "Error loading file", "loading": "Loading...", "preview": "Preview", "code": "Code", "compare": "Compare", "fileModifiedNotice": "File modified. Please refresh.", "copyFileContent": "Copy File Content", "addFileToChat": "Add File to Chat", "addSelectionToChat": "Add Selection to Chat", "loadError": "Failed to load", "zoomOut": "Zoom out", "zoomIn": "Zoom in", "previousPage": "Previous page", "nextPage": "Next page", "previousSlide": "Previous slide", "nextSlide": "Next slide" };
|
|
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
|
-
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 (
|
|
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 (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", "emptyHint": "Schedule AI tasks to run automatically with cron expressions", "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": "暂无计划", "emptyHint": "通过 cron 表达式配置定时 AI 任务,让 Agent 自动执行", "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" }]
|
|
@@ -40928,6 +40956,15 @@ function Sidebar() {
|
|
|
40928
40956
|
window.addEventListener("fello:add-project", handler);
|
|
40929
40957
|
return () => window.removeEventListener("fello:add-project", handler);
|
|
40930
40958
|
}, []);
|
|
40959
|
+
const handleNewSessionRef = reactExports.useRef(void 0);
|
|
40960
|
+
reactExports.useEffect(() => {
|
|
40961
|
+
const handler = (e2) => {
|
|
40962
|
+
const projectId = e2.detail?.projectId;
|
|
40963
|
+
if (projectId) handleNewSessionRef.current?.(projectId);
|
|
40964
|
+
};
|
|
40965
|
+
window.addEventListener("fello:new-session", handler);
|
|
40966
|
+
return () => window.removeEventListener("fello:new-session", handler);
|
|
40967
|
+
}, []);
|
|
40931
40968
|
const handleNavigate = (path2) => {
|
|
40932
40969
|
setOptimisticPath(path2);
|
|
40933
40970
|
setTimeout(() => {
|
|
@@ -41069,6 +41106,7 @@ function Sidebar() {
|
|
|
41069
41106
|
setNewSessionPermissionMode("allow-all");
|
|
41070
41107
|
setNewSessionDialogOpen(true);
|
|
41071
41108
|
};
|
|
41109
|
+
handleNewSessionRef.current = openNewSessionDialog;
|
|
41072
41110
|
const handleCreateNewSession = async () => {
|
|
41073
41111
|
if (!newSessionProjectId || !newSessionAgentId) return;
|
|
41074
41112
|
const ok2 = await handleNewChat(newSessionProjectId, newSessionAgentId, {
|
|
@@ -41100,13 +41138,14 @@ function Sidebar() {
|
|
|
41100
41138
|
variant: "destructive",
|
|
41101
41139
|
value: async () => {
|
|
41102
41140
|
const store = useAppStore.getState();
|
|
41141
|
+
if (activeSessionId === session2.id) {
|
|
41142
|
+
handleNavigate("/");
|
|
41143
|
+
}
|
|
41144
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
41103
41145
|
setSessions(store.sessions.filter((s16) => s16.id !== session2.id));
|
|
41104
41146
|
const map2 = new Map(store.sessionStates);
|
|
41105
41147
|
map2.delete(session2.id);
|
|
41106
41148
|
useAppStore.setState({ sessionStates: map2 });
|
|
41107
|
-
if (activeSessionId === session2.id) {
|
|
41108
|
-
handleNavigate("/");
|
|
41109
|
-
}
|
|
41110
41149
|
await request.deleteSession(session2.id);
|
|
41111
41150
|
await refreshData();
|
|
41112
41151
|
return "deleted";
|
|
@@ -41149,22 +41188,20 @@ function Sidebar() {
|
|
|
41149
41188
|
{
|
|
41150
41189
|
text: t2("sidebar.delete"),
|
|
41151
41190
|
value: async () => {
|
|
41152
|
-
|
|
41153
|
-
const
|
|
41154
|
-
|
|
41191
|
+
const state2 = useAppStore.getState();
|
|
41192
|
+
const activeSession = state2.sessions.find((session2) => session2.id === activeSessionId);
|
|
41193
|
+
if (activeSession && activeSession.projectId === project.id) {
|
|
41194
|
+
handleNavigate("/");
|
|
41195
|
+
}
|
|
41196
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
41197
|
+
const map2 = new Map(state2.sessionStates);
|
|
41198
|
+
for (const session2 of state2.sessions) {
|
|
41155
41199
|
if (session2.projectId === project.id) map2.delete(session2.id);
|
|
41156
41200
|
}
|
|
41157
41201
|
useAppStore.setState({ sessionStates: map2 });
|
|
41158
|
-
|
|
41159
|
-
|
|
41160
|
-
|
|
41161
|
-
if (next2) {
|
|
41162
|
-
handleNavigate(`/session-view/${next2.id}`);
|
|
41163
|
-
} else {
|
|
41164
|
-
handleNavigate("/");
|
|
41165
|
-
}
|
|
41166
|
-
}
|
|
41167
|
-
return "confirm";
|
|
41202
|
+
await request.deleteProject(project.id);
|
|
41203
|
+
await refreshData();
|
|
41204
|
+
return "deleted";
|
|
41168
41205
|
},
|
|
41169
41206
|
variant: "destructive"
|
|
41170
41207
|
}
|
|
@@ -41226,6 +41263,17 @@ function Sidebar() {
|
|
|
41226
41263
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal select-none uppercase", children: t2("sidebar.skills") })
|
|
41227
41264
|
]
|
|
41228
41265
|
}
|
|
41266
|
+
),
|
|
41267
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41268
|
+
"div",
|
|
41269
|
+
{
|
|
41270
|
+
onClick: () => handleNavigate("/automation"),
|
|
41271
|
+
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"}`,
|
|
41272
|
+
children: [
|
|
41273
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ClockCheck, { className: "size-3.5" }),
|
|
41274
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal select-none uppercase", children: t2("sidebar.automation", "Automation") })
|
|
41275
|
+
]
|
|
41276
|
+
}
|
|
41229
41277
|
)
|
|
41230
41278
|
] }),
|
|
41231
41279
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3 pb-2 pt-2", children: [
|
|
@@ -41241,258 +41289,225 @@ function Sidebar() {
|
|
|
41241
41289
|
}
|
|
41242
41290
|
)
|
|
41243
41291
|
] }),
|
|
41244
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.
|
|
41245
|
-
|
|
41246
|
-
|
|
41247
|
-
|
|
41248
|
-
|
|
41249
|
-
|
|
41250
|
-
|
|
41251
|
-
{
|
|
41252
|
-
|
|
41253
|
-
|
|
41254
|
-
|
|
41255
|
-
|
|
41256
|
-
|
|
41257
|
-
|
|
41292
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-0.5 p-1.5", children: sortedProjects.map((project) => {
|
|
41293
|
+
const projectSessions = sessionsByProject[project.id] ?? [];
|
|
41294
|
+
const expanded = isProjectExpanded(project.id);
|
|
41295
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-0.5", children: [
|
|
41296
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41297
|
+
ContextMenu,
|
|
41298
|
+
{
|
|
41299
|
+
onOpenChange: (open2) => {
|
|
41300
|
+
setOpenProjectMenuId(
|
|
41301
|
+
(prev2) => open2 ? project.id : prev2 === project.id ? null : prev2
|
|
41302
|
+
);
|
|
41303
|
+
},
|
|
41304
|
+
children: [
|
|
41305
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41306
|
+
ContextMenuTrigger,
|
|
41307
|
+
{
|
|
41308
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
|
|
41309
|
+
className: `group flex h-7 cursor-default items-center gap-1.5 rounded-md px-1.5 text-xs font-normal text-sidebar-foreground/45 hover:bg-sidebar-accent/25 hover:text-sidebar-foreground/80 ${openProjectMenuId === project.id ? "bg-sidebar-accent/25 text-sidebar-foreground/80" : ""}`,
|
|
41310
|
+
onClick: () => toggleProject(project.id),
|
|
41311
|
+
onContextMenu: (e2) => {
|
|
41312
|
+
e2.stopPropagation();
|
|
41313
|
+
},
|
|
41314
|
+
children: [
|
|
41315
|
+
expanded ? /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(FolderClosed, { className: "size-3.5" }),
|
|
41316
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal font-normal uppercase select-none", children: project.title }),
|
|
41317
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41318
|
+
"button",
|
|
41319
|
+
{
|
|
41320
|
+
type: "button",
|
|
41321
|
+
onClick: (e2) => {
|
|
41322
|
+
e2.stopPropagation();
|
|
41323
|
+
openNewSessionDialog(project.id);
|
|
41324
|
+
},
|
|
41325
|
+
className: `flex size-4 items-center justify-center rounded-sm text-sidebar-foreground/40 hover:bg-sidebar-accent/25 hover:text-sidebar-foreground/70 ${projectSessions.length === 0 ? "opacity-100" : "opacity-0 group-hover:opacity-100"}`,
|
|
41326
|
+
"aria-label": t2("sidebar.createChatInProject", {
|
|
41327
|
+
defaultValue: "Create chat in {{title}}",
|
|
41328
|
+
title: project.title
|
|
41329
|
+
}),
|
|
41330
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, {})
|
|
41331
|
+
}
|
|
41332
|
+
)
|
|
41333
|
+
]
|
|
41334
|
+
}
|
|
41335
|
+
),
|
|
41336
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { onClick: (e2) => e2.stopPropagation(), className: "w-auto", children: [
|
|
41258
41337
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41259
|
-
|
|
41338
|
+
ContextMenuItem,
|
|
41260
41339
|
{
|
|
41261
|
-
|
|
41262
|
-
className: `group flex h-7 cursor-default items-center gap-1.5 rounded-md px-1.5 text-xs font-normal text-sidebar-foreground/45 hover:bg-sidebar-accent/25 hover:text-sidebar-foreground/80 ${openProjectMenuId === project.id ? "bg-sidebar-accent/25 text-sidebar-foreground/80" : ""}`,
|
|
41263
|
-
onClick: () => toggleProject(project.id),
|
|
41264
|
-
onContextMenu: (e2) => {
|
|
41340
|
+
onClick: (e2) => {
|
|
41265
41341
|
e2.stopPropagation();
|
|
41342
|
+
openNewSessionDialog(project.id);
|
|
41266
41343
|
},
|
|
41267
41344
|
children: [
|
|
41268
|
-
|
|
41269
|
-
|
|
41270
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41271
|
-
"button",
|
|
41272
|
-
{
|
|
41273
|
-
type: "button",
|
|
41274
|
-
onClick: (e2) => {
|
|
41275
|
-
e2.stopPropagation();
|
|
41276
|
-
openNewSessionDialog(project.id);
|
|
41277
|
-
},
|
|
41278
|
-
className: `flex size-4 items-center justify-center rounded-sm text-sidebar-foreground/40 hover:bg-sidebar-accent/25 hover:text-sidebar-foreground/70 ${projectSessions.length === 0 ? "opacity-100" : "opacity-0 group-hover:opacity-100"}`,
|
|
41279
|
-
"aria-label": t2("sidebar.createChatInProject", {
|
|
41280
|
-
defaultValue: "Create chat in {{title}}",
|
|
41281
|
-
title: project.title
|
|
41282
|
-
}),
|
|
41283
|
-
children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, {})
|
|
41284
|
-
}
|
|
41285
|
-
)
|
|
41345
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, {}),
|
|
41346
|
+
t2("sidebar.newChat", "New Chat")
|
|
41286
41347
|
]
|
|
41287
41348
|
}
|
|
41288
41349
|
),
|
|
41289
|
-
/* @__PURE__ */ jsxRuntimeExports.
|
|
41290
|
-
|
|
41291
|
-
|
|
41292
|
-
{
|
|
41293
|
-
onClick: (e2) => {
|
|
41294
|
-
e2.stopPropagation();
|
|
41295
|
-
openNewSessionDialog(project.id);
|
|
41296
|
-
},
|
|
41297
|
-
children: [
|
|
41298
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, {}),
|
|
41299
|
-
t2("sidebar.newChat", "New Chat")
|
|
41300
|
-
]
|
|
41301
|
-
}
|
|
41302
|
-
),
|
|
41303
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
41304
|
-
!isWebUI && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41305
|
-
ContextMenuItem,
|
|
41306
|
-
{
|
|
41307
|
-
onClick: (e2) => {
|
|
41308
|
-
e2.stopPropagation();
|
|
41309
|
-
void handleRevealProjectInFinder(project);
|
|
41310
|
-
},
|
|
41311
|
-
children: [
|
|
41312
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, {}),
|
|
41313
|
-
t2("sidebar.revealInFinder")
|
|
41314
|
-
]
|
|
41315
|
-
}
|
|
41316
|
-
),
|
|
41317
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41318
|
-
ContextMenuItem,
|
|
41319
|
-
{
|
|
41320
|
-
onClick: (e2) => {
|
|
41321
|
-
e2.stopPropagation();
|
|
41322
|
-
handleRenameProject(project);
|
|
41323
|
-
},
|
|
41324
|
-
children: [
|
|
41325
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, {}),
|
|
41326
|
-
t2("sidebar.rename")
|
|
41327
|
-
]
|
|
41328
|
-
}
|
|
41329
|
-
),
|
|
41330
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
41331
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41332
|
-
ContextMenuItem,
|
|
41333
|
-
{
|
|
41334
|
-
variant: "destructive",
|
|
41335
|
-
onClick: (e2) => {
|
|
41336
|
-
e2.stopPropagation();
|
|
41337
|
-
handleDeleteProject(project);
|
|
41338
|
-
},
|
|
41339
|
-
children: [
|
|
41340
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
|
|
41341
|
-
t2("sidebar.delete")
|
|
41342
|
-
]
|
|
41343
|
-
}
|
|
41344
|
-
)
|
|
41345
|
-
] })
|
|
41346
|
-
]
|
|
41347
|
-
}
|
|
41348
|
-
),
|
|
41349
|
-
expanded && projectSessions.map((session2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41350
|
-
ContextMenu,
|
|
41351
|
-
{
|
|
41352
|
-
onOpenChange: (open2) => {
|
|
41353
|
-
setOpenSessionMenuId(
|
|
41354
|
-
(prev2) => open2 ? session2.id : prev2 === session2.id ? null : prev2
|
|
41355
|
-
);
|
|
41356
|
-
},
|
|
41357
|
-
children: [
|
|
41358
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41359
|
-
ContextMenuTrigger,
|
|
41350
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
41351
|
+
!isWebUI && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41352
|
+
ContextMenuItem,
|
|
41360
41353
|
{
|
|
41361
|
-
|
|
41362
|
-
onClick: () => handleSelectSession(session2),
|
|
41363
|
-
className: `group flex h-8 cursor-default items-center justify-between rounded-md pl-1.5 pr-2 text-xs font-normal transition-colors ${activeSessionId === session2.id ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground/95"} ${openSessionMenuId === session2.id ? "bg-sidebar-accent" : ""}`,
|
|
41364
|
-
onContextMenu: (e2) => {
|
|
41354
|
+
onClick: (e2) => {
|
|
41365
41355
|
e2.stopPropagation();
|
|
41356
|
+
void handleRevealProjectInFinder(project);
|
|
41366
41357
|
},
|
|
41367
|
-
children:
|
|
41368
|
-
(
|
|
41369
|
-
|
|
41370
|
-
|
|
41371
|
-
const isStreaming = session2.isStreaming;
|
|
41372
|
-
const completedStatus = state2?.completedStatus;
|
|
41373
|
-
if (hasAskUser) {
|
|
41374
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleQuestionMark, { className: "size-3 shrink-0 text-sky-500" });
|
|
41375
|
-
}
|
|
41376
|
-
if (isStreaming) {
|
|
41377
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin shrink-0" });
|
|
41378
|
-
}
|
|
41379
|
-
if (completedStatus === "success" || state2?.completedAt && !completedStatus) {
|
|
41380
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 shrink-0 text-green-500" });
|
|
41381
|
-
}
|
|
41382
|
-
if (completedStatus === "error") {
|
|
41383
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3 shrink-0 text-yellow-500" });
|
|
41384
|
-
}
|
|
41385
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-3 shrink-0" });
|
|
41386
|
-
})(),
|
|
41387
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41388
|
-
Badge,
|
|
41389
|
-
{
|
|
41390
|
-
variant: "outline",
|
|
41391
|
-
className: "px-1 -ml-0.5 text-[10px] uppercase max-w-15 truncate text-center leading-normal py-0 select-none",
|
|
41392
|
-
children: configuredAgents.find((a2) => a2.id === session2.agentId)?.id || session2.agentId
|
|
41393
|
-
}
|
|
41394
|
-
),
|
|
41395
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate leading-normal select-none", children: session2.title || t2("sidebar.newChat", "New Chat") }),
|
|
41396
|
-
activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0 text-green-500" })
|
|
41397
|
-
] })
|
|
41358
|
+
children: [
|
|
41359
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, {}),
|
|
41360
|
+
t2("sidebar.revealInFinder")
|
|
41361
|
+
]
|
|
41398
41362
|
}
|
|
41399
41363
|
),
|
|
41400
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41401
|
-
|
|
41402
|
-
|
|
41403
|
-
{
|
|
41404
|
-
|
|
41405
|
-
|
|
41406
|
-
|
|
41407
|
-
|
|
41408
|
-
|
|
41409
|
-
|
|
41410
|
-
|
|
41411
|
-
|
|
41412
|
-
|
|
41413
|
-
|
|
41414
|
-
|
|
41415
|
-
|
|
41416
|
-
|
|
41417
|
-
|
|
41418
|
-
|
|
41419
|
-
|
|
41420
|
-
|
|
41421
|
-
|
|
41422
|
-
|
|
41423
|
-
|
|
41424
|
-
|
|
41425
|
-
|
|
41426
|
-
|
|
41427
|
-
|
|
41428
|
-
|
|
41429
|
-
ContextMenuItem,
|
|
41430
|
-
{
|
|
41431
|
-
onClick: (e2) => {
|
|
41432
|
-
e2.stopPropagation();
|
|
41433
|
-
request.setActiveIlinkSession({ sessionId: "" }).catch(() => {
|
|
41434
|
-
});
|
|
41435
|
-
},
|
|
41436
|
-
children: [
|
|
41437
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, {}),
|
|
41438
|
-
t2("sidebar.ilinkUnsetActive", "Unset WeChat Active")
|
|
41439
|
-
]
|
|
41440
|
-
}
|
|
41441
|
-
),
|
|
41442
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
41443
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41444
|
-
ContextMenuItem,
|
|
41445
|
-
{
|
|
41446
|
-
variant: "destructive",
|
|
41447
|
-
onClick: (e2) => {
|
|
41448
|
-
e2.stopPropagation();
|
|
41449
|
-
void handleDeleteSession(session2);
|
|
41450
|
-
},
|
|
41451
|
-
children: [
|
|
41452
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
|
|
41453
|
-
t2("sidebar.delete")
|
|
41454
|
-
]
|
|
41455
|
-
}
|
|
41456
|
-
)
|
|
41457
|
-
] })
|
|
41458
|
-
]
|
|
41459
|
-
},
|
|
41460
|
-
session2.id
|
|
41461
|
-
))
|
|
41462
|
-
] }, project.id);
|
|
41463
|
-
}),
|
|
41464
|
-
projects.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 flex flex-col items-center gap-2 px-2", children: enabledAgents.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
41465
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-center text-xs text-muted-foreground select-none", children: t2("sidebar.noAgentsHint") }),
|
|
41466
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41467
|
-
Button,
|
|
41468
|
-
{
|
|
41469
|
-
variant: "outline",
|
|
41470
|
-
size: "sm",
|
|
41471
|
-
className: "h-7 text-xs w-full",
|
|
41472
|
-
onClick: () => handleNavigate("/settings/agents"),
|
|
41473
|
-
children: [
|
|
41474
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Settings$1, { className: "size-3 mr-1" }),
|
|
41475
|
-
t2("sidebar.configureAgent")
|
|
41364
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41365
|
+
ContextMenuItem,
|
|
41366
|
+
{
|
|
41367
|
+
onClick: (e2) => {
|
|
41368
|
+
e2.stopPropagation();
|
|
41369
|
+
handleRenameProject(project);
|
|
41370
|
+
},
|
|
41371
|
+
children: [
|
|
41372
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, {}),
|
|
41373
|
+
t2("sidebar.rename")
|
|
41374
|
+
]
|
|
41375
|
+
}
|
|
41376
|
+
),
|
|
41377
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
41378
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41379
|
+
ContextMenuItem,
|
|
41380
|
+
{
|
|
41381
|
+
variant: "destructive",
|
|
41382
|
+
onClick: (e2) => {
|
|
41383
|
+
e2.stopPropagation();
|
|
41384
|
+
handleDeleteProject(project);
|
|
41385
|
+
},
|
|
41386
|
+
children: [
|
|
41387
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
|
|
41388
|
+
t2("sidebar.delete")
|
|
41389
|
+
]
|
|
41390
|
+
}
|
|
41391
|
+
)
|
|
41392
|
+
] })
|
|
41476
41393
|
]
|
|
41477
41394
|
}
|
|
41478
|
-
)
|
|
41479
|
-
|
|
41480
|
-
|
|
41481
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41482
|
-
Button,
|
|
41395
|
+
),
|
|
41396
|
+
expanded && projectSessions.map((session2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41397
|
+
ContextMenu,
|
|
41483
41398
|
{
|
|
41484
|
-
|
|
41485
|
-
|
|
41486
|
-
|
|
41487
|
-
|
|
41399
|
+
onOpenChange: (open2) => {
|
|
41400
|
+
setOpenSessionMenuId(
|
|
41401
|
+
(prev2) => open2 ? session2.id : prev2 === session2.id ? null : prev2
|
|
41402
|
+
);
|
|
41403
|
+
},
|
|
41488
41404
|
children: [
|
|
41489
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41490
|
-
|
|
41405
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41406
|
+
ContextMenuTrigger,
|
|
41407
|
+
{
|
|
41408
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
|
|
41409
|
+
onClick: () => handleSelectSession(session2),
|
|
41410
|
+
className: `group flex h-8 cursor-default items-center justify-between rounded-md pl-1.5 pr-2 text-xs font-normal transition-colors ${activeSessionId === session2.id ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground/95"} ${openSessionMenuId === session2.id ? "bg-sidebar-accent" : ""}`,
|
|
41411
|
+
onContextMenu: (e2) => {
|
|
41412
|
+
e2.stopPropagation();
|
|
41413
|
+
},
|
|
41414
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-1.5", children: [
|
|
41415
|
+
(() => {
|
|
41416
|
+
const state2 = sessionStates.get(session2.id);
|
|
41417
|
+
const hasAskUser = (state2?.askUserRequests?.length ?? 0) > 0;
|
|
41418
|
+
const isStreaming = session2.isStreaming;
|
|
41419
|
+
const completedStatus = state2?.completedStatus;
|
|
41420
|
+
if (hasAskUser) {
|
|
41421
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleQuestionMark, { className: "size-3 shrink-0 text-sky-500" });
|
|
41422
|
+
}
|
|
41423
|
+
if (isStreaming) {
|
|
41424
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin shrink-0" });
|
|
41425
|
+
}
|
|
41426
|
+
if (completedStatus === "success" || state2?.completedAt && !completedStatus) {
|
|
41427
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 shrink-0 text-green-500" });
|
|
41428
|
+
}
|
|
41429
|
+
if (completedStatus === "error") {
|
|
41430
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3 shrink-0 text-yellow-500" });
|
|
41431
|
+
}
|
|
41432
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-3 shrink-0" });
|
|
41433
|
+
})(),
|
|
41434
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41435
|
+
Badge,
|
|
41436
|
+
{
|
|
41437
|
+
variant: "outline",
|
|
41438
|
+
className: "px-1 -ml-0.5 text-[10px] uppercase max-w-15 truncate text-center leading-normal py-0 select-none",
|
|
41439
|
+
children: configuredAgents.find((a2) => a2.id === session2.agentId)?.id || session2.agentId
|
|
41440
|
+
}
|
|
41441
|
+
),
|
|
41442
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate leading-normal select-none", children: session2.title || t2("sidebar.newChat", "New Chat") }),
|
|
41443
|
+
activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0 text-green-500" })
|
|
41444
|
+
] })
|
|
41445
|
+
}
|
|
41446
|
+
),
|
|
41447
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { onClick: (e2) => e2.stopPropagation(), className: "w-auto", children: [
|
|
41448
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41449
|
+
ContextMenuItem,
|
|
41450
|
+
{
|
|
41451
|
+
onClick: (e2) => {
|
|
41452
|
+
e2.stopPropagation();
|
|
41453
|
+
handleRenameSession(session2);
|
|
41454
|
+
},
|
|
41455
|
+
children: [
|
|
41456
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, {}),
|
|
41457
|
+
t2("sidebar.rename")
|
|
41458
|
+
]
|
|
41459
|
+
}
|
|
41460
|
+
),
|
|
41461
|
+
ilinkStatus.connected && activeIlinkSessionId !== session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41462
|
+
ContextMenuItem,
|
|
41463
|
+
{
|
|
41464
|
+
onClick: (e2) => {
|
|
41465
|
+
e2.stopPropagation();
|
|
41466
|
+
request.setActiveIlinkSession({ sessionId: session2.id }).catch(() => {
|
|
41467
|
+
});
|
|
41468
|
+
},
|
|
41469
|
+
children: [
|
|
41470
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, {}),
|
|
41471
|
+
t2("sidebar.ilinkSetActive", "Set as WeChat Active")
|
|
41472
|
+
]
|
|
41473
|
+
}
|
|
41474
|
+
),
|
|
41475
|
+
ilinkStatus.connected && activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41476
|
+
ContextMenuItem,
|
|
41477
|
+
{
|
|
41478
|
+
onClick: (e2) => {
|
|
41479
|
+
e2.stopPropagation();
|
|
41480
|
+
request.setActiveIlinkSession({ sessionId: "" }).catch(() => {
|
|
41481
|
+
});
|
|
41482
|
+
},
|
|
41483
|
+
children: [
|
|
41484
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, {}),
|
|
41485
|
+
t2("sidebar.ilinkUnsetActive", "Unset WeChat Active")
|
|
41486
|
+
]
|
|
41487
|
+
}
|
|
41488
|
+
),
|
|
41489
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
41490
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41491
|
+
ContextMenuItem,
|
|
41492
|
+
{
|
|
41493
|
+
variant: "destructive",
|
|
41494
|
+
onClick: (e2) => {
|
|
41495
|
+
e2.stopPropagation();
|
|
41496
|
+
void handleDeleteSession(session2);
|
|
41497
|
+
},
|
|
41498
|
+
children: [
|
|
41499
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, {}),
|
|
41500
|
+
t2("sidebar.delete")
|
|
41501
|
+
]
|
|
41502
|
+
}
|
|
41503
|
+
)
|
|
41504
|
+
] })
|
|
41491
41505
|
]
|
|
41492
|
-
}
|
|
41493
|
-
|
|
41494
|
-
|
|
41495
|
-
|
|
41506
|
+
},
|
|
41507
|
+
session2.id
|
|
41508
|
+
))
|
|
41509
|
+
] }, project.id);
|
|
41510
|
+
}) }) }),
|
|
41496
41511
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-auto border-t border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
41497
41512
|
Button,
|
|
41498
41513
|
{
|
|
@@ -41765,6 +41780,34 @@ function SettingsLayout() {
|
|
|
41765
41780
|
] })
|
|
41766
41781
|
] });
|
|
41767
41782
|
}
|
|
41783
|
+
function Card({
|
|
41784
|
+
className,
|
|
41785
|
+
size: size2 = "default",
|
|
41786
|
+
...props
|
|
41787
|
+
}) {
|
|
41788
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41789
|
+
"div",
|
|
41790
|
+
{
|
|
41791
|
+
"data-slot": "card",
|
|
41792
|
+
"data-size": size2,
|
|
41793
|
+
className: cn$5(
|
|
41794
|
+
"group/card flex flex-col overflow-hidden rounded-xl bg-card border border-border text-sm text-card-foreground has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
|
|
41795
|
+
className
|
|
41796
|
+
),
|
|
41797
|
+
...props
|
|
41798
|
+
}
|
|
41799
|
+
);
|
|
41800
|
+
}
|
|
41801
|
+
function CardContent({ className, ...props }) {
|
|
41802
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41803
|
+
"div",
|
|
41804
|
+
{
|
|
41805
|
+
"data-slot": "card-content",
|
|
41806
|
+
className: cn$5("px-3 pb-3", className),
|
|
41807
|
+
...props
|
|
41808
|
+
}
|
|
41809
|
+
);
|
|
41810
|
+
}
|
|
41768
41811
|
const PARTICLE_COUNT = 70;
|
|
41769
41812
|
const CONNECTION_DIST = 140;
|
|
41770
41813
|
const RIPPLE_MAX_RADIUS = 200;
|
|
@@ -41918,11 +41961,13 @@ function Welcome() {
|
|
|
41918
41961
|
const [tilt, setTilt] = reactExports.useState({ x: 0, y: 0 });
|
|
41919
41962
|
const agents = useAppStore((s16) => s16.configuredAgents);
|
|
41920
41963
|
const projects = useAppStore((s16) => s16.projects);
|
|
41964
|
+
const sessions = useAppStore((s16) => s16.sessions);
|
|
41921
41965
|
const setI18n2 = useAppStore((s16) => s16.setI18n);
|
|
41922
41966
|
const enabledAgentCount = reactExports.useMemo(() => agents.filter((a2) => !a2.disabled).length, [agents]);
|
|
41923
41967
|
const hasAgents = enabledAgentCount > 0;
|
|
41924
41968
|
const hasProjects = projects.length > 0;
|
|
41925
41969
|
const allDone = hasAgents && hasProjects;
|
|
41970
|
+
const showGuide = !allDone || projects.length <= 1 && sessions.length === 0;
|
|
41926
41971
|
const handleMouseMove = reactExports.useCallback((e2) => {
|
|
41927
41972
|
const rect2 = containerRef.current?.getBoundingClientRect();
|
|
41928
41973
|
if (!rect2) return;
|
|
@@ -41943,7 +41988,7 @@ function Welcome() {
|
|
|
41943
41988
|
children: [
|
|
41944
41989
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "absolute bottom-3 right-4 text-[11px] text-muted-foreground/40 z-10 pointer-events-none", children: [
|
|
41945
41990
|
"v",
|
|
41946
|
-
"0.1.
|
|
41991
|
+
"0.1.30"
|
|
41947
41992
|
] }),
|
|
41948
41993
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41949
41994
|
"div",
|
|
@@ -41986,48 +42031,50 @@ function Welcome() {
|
|
|
41986
42031
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
41987
42032
|
"p",
|
|
41988
42033
|
{
|
|
41989
|
-
className: "mt-2 max-w-md text-sm text-muted-foreground animate-text-fade-in",
|
|
42034
|
+
className: "mt-2 max-w-md text-sm text-muted-foreground animate-text-fade-in min-h-10",
|
|
41990
42035
|
style: { animationDelay: "0.6s", animationFillMode: "both" },
|
|
41991
42036
|
children: t2("welcome.desc")
|
|
41992
42037
|
}
|
|
41993
42038
|
)
|
|
41994
42039
|
] }),
|
|
41995
|
-
|
|
41996
|
-
|
|
42040
|
+
showGuide && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
42041
|
+
Card,
|
|
41997
42042
|
{
|
|
41998
|
-
|
|
42043
|
+
size: "sm",
|
|
42044
|
+
className: "relative z-10 w-100 bg-card/80 backdrop-blur-sm animate-text-fade-in",
|
|
41999
42045
|
style: { animationDelay: "0.8s", animationFillMode: "both" },
|
|
42000
|
-
children: [
|
|
42001
|
-
/* @__PURE__ */ jsxRuntimeExports.
|
|
42002
|
-
|
|
42003
|
-
|
|
42004
|
-
|
|
42005
|
-
|
|
42006
|
-
|
|
42007
|
-
|
|
42008
|
-
|
|
42009
|
-
|
|
42010
|
-
|
|
42011
|
-
|
|
42012
|
-
|
|
42013
|
-
|
|
42014
|
-
|
|
42015
|
-
|
|
42016
|
-
|
|
42017
|
-
|
|
42018
|
-
|
|
42019
|
-
|
|
42046
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "flex flex-col gap-2.5 px-3 py-3", children: [
|
|
42047
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3", children: [
|
|
42048
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-medium text-muted-foreground/90 uppercase tracking-wide", children: t2("welcome.getStarted") }),
|
|
42049
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
42050
|
+
Tabs,
|
|
42051
|
+
{
|
|
42052
|
+
value: i18n.language,
|
|
42053
|
+
onValueChange: (lang) => {
|
|
42054
|
+
if (!lang) return;
|
|
42055
|
+
setI18n2({ language: lang });
|
|
42056
|
+
i18n.changeLanguage(lang);
|
|
42057
|
+
request.updateSettings({ i18n: { language: lang } }).catch(() => {
|
|
42058
|
+
});
|
|
42059
|
+
},
|
|
42060
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(TabsList, { children: [
|
|
42061
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "en", className: "text-[11px] h-6 px-1.5", children: "English" }),
|
|
42062
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "zh-CN", className: "text-[11px] h-6 px-1.5", children: "简体中文" })
|
|
42063
|
+
] })
|
|
42064
|
+
}
|
|
42065
|
+
)
|
|
42066
|
+
] }),
|
|
42020
42067
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
42021
42068
|
"button",
|
|
42022
42069
|
{
|
|
42023
42070
|
type: "button",
|
|
42024
42071
|
onClick: () => !hasAgents && navigate("/settings/agents"),
|
|
42025
|
-
className: `flex items-center gap-3 rounded-lg border px-
|
|
42072
|
+
className: `flex items-center gap-3 rounded-lg border px-2.5 py-2 text-left transition-all ${hasAgents ? "border-green-500/20 bg-green-500/5 cursor-default" : "border-border hover:border-primary/30 hover:bg-primary/5 cursor-default"}`,
|
|
42026
42073
|
children: [
|
|
42027
42074
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
42028
42075
|
"div",
|
|
42029
42076
|
{
|
|
42030
|
-
className: `flex size-
|
|
42077
|
+
className: `flex size-6 shrink-0 items-center justify-center rounded-md ${hasAgents ? "bg-green-500/15 text-green-600" : "bg-primary/10 text-primary"}`,
|
|
42031
42078
|
children: hasAgents ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Bot, { className: "size-3.5" })
|
|
42032
42079
|
}
|
|
42033
42080
|
),
|
|
@@ -42043,17 +42090,17 @@ function Welcome() {
|
|
|
42043
42090
|
{
|
|
42044
42091
|
type: "button",
|
|
42045
42092
|
onClick: () => {
|
|
42046
|
-
if (!hasProjects) {
|
|
42093
|
+
if (!hasProjects && hasAgents) {
|
|
42047
42094
|
window.dispatchEvent(new CustomEvent("fello:add-project"));
|
|
42048
42095
|
}
|
|
42049
42096
|
},
|
|
42050
|
-
className: `flex items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors ${hasProjects ? "border-green-500/30 bg-green-500/5 cursor-default" : !hasAgents ? "border-border/50 opacity-50 cursor-not-allowed" : "border-border hover:border-primary/40 hover:bg-primary/5 cursor-pointer"}`,
|
|
42051
42097
|
disabled: !hasAgents,
|
|
42098
|
+
className: `flex items-center gap-3 rounded-lg border px-2.5 py-2 text-left transition-all ${hasProjects ? "border-green-500/20 bg-green-500/5 cursor-default" : !hasAgents ? "border-border opacity-40 cursor-not-allowed" : "border-border hover:border-primary/30 hover:bg-primary/5 cursor-default"}`,
|
|
42052
42099
|
children: [
|
|
42053
42100
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
42054
42101
|
"div",
|
|
42055
42102
|
{
|
|
42056
|
-
className: `flex size-
|
|
42103
|
+
className: `flex size-6 shrink-0 items-center justify-center rounded-md ${hasProjects ? "bg-green-500/15 text-green-600" : "bg-primary/10 text-primary"}`,
|
|
42057
42104
|
children: hasProjects ? /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(FolderPlus, { className: "size-3.5" })
|
|
42058
42105
|
}
|
|
42059
42106
|
),
|
|
@@ -42065,11 +42112,25 @@ function Welcome() {
|
|
|
42065
42112
|
}
|
|
42066
42113
|
),
|
|
42067
42114
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
42068
|
-
"
|
|
42115
|
+
"button",
|
|
42069
42116
|
{
|
|
42070
|
-
|
|
42117
|
+
type: "button",
|
|
42118
|
+
onClick: () => {
|
|
42119
|
+
if (allDone) {
|
|
42120
|
+
const firstProject = projects[0];
|
|
42121
|
+
if (firstProject) {
|
|
42122
|
+
window.dispatchEvent(
|
|
42123
|
+
new CustomEvent("fello:new-session", {
|
|
42124
|
+
detail: { projectId: firstProject.id }
|
|
42125
|
+
})
|
|
42126
|
+
);
|
|
42127
|
+
}
|
|
42128
|
+
}
|
|
42129
|
+
},
|
|
42130
|
+
disabled: !allDone,
|
|
42131
|
+
className: `flex items-center gap-3 rounded-lg border px-2.5 py-2 text-left transition-all ${allDone ? "border-border hover:border-primary/30 hover:bg-primary/5 cursor-default" : "border-border opacity-40 cursor-not-allowed"}`,
|
|
42071
42132
|
children: [
|
|
42072
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-
|
|
42133
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-6 shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary", children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, { className: "size-3.5" }) }),
|
|
42073
42134
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
42074
42135
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs font-medium", children: t2("welcome.stepChat") }),
|
|
42075
42136
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[11px] text-muted-foreground mt-0.5", children: t2("welcome.stepChatDesc") })
|
|
@@ -42077,17 +42138,7 @@ function Welcome() {
|
|
|
42077
42138
|
]
|
|
42078
42139
|
}
|
|
42079
42140
|
)
|
|
42080
|
-
]
|
|
42081
|
-
}
|
|
42082
|
-
) : /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
42083
|
-
"div",
|
|
42084
|
-
{
|
|
42085
|
-
className: "flex items-center gap-2 text-xs text-muted-foreground/50 relative z-10 animate-text-fade-in pointer-events-none",
|
|
42086
|
-
style: { animationDelay: "1s", animationFillMode: "both" },
|
|
42087
|
-
children: [
|
|
42088
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "size-3 animate-bounce-horizontal" }),
|
|
42089
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t2("welcome.allDone") })
|
|
42090
|
-
]
|
|
42141
|
+
] })
|
|
42091
42142
|
}
|
|
42092
42143
|
)
|
|
42093
42144
|
]
|
|
@@ -68611,7 +68662,7 @@ var lr$2 = (e2) => {
|
|
|
68611
68662
|
for (; t2 > 0 && e2[t2 - 1] === `
|
|
68612
68663
|
`; ) t2--;
|
|
68613
68664
|
return e2.slice(0, t2);
|
|
68614
|
-
}, cr$1 = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-OFNGDK62-
|
|
68665
|
+
}, cr$1 = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-OFNGDK62-VELQyUbs.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
68666
|
let i3 = y$9(), d2 = reactExports.useMemo(() => lr$2(e2), [e2]), c2 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: d2.split(`
|
|
68616
68667
|
`).map((p3) => [{ content: p3, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [d2]);
|
|
68617
68668
|
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 +93503,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
|
|
|
93452
93503
|
registerLayoutLoaders([
|
|
93453
93504
|
{
|
|
93454
93505
|
name: "dagre",
|
|
93455
|
-
loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-KV5264BT-
|
|
93506
|
+
loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-KV5264BT-NIF-wzAb.js"), true ? __vite__mapDeps([0,1,2,3,4,5]) : void 0, import.meta.url), "loader")
|
|
93456
93507
|
},
|
|
93457
93508
|
...[
|
|
93458
93509
|
{
|
|
93459
93510
|
name: "cose-bilkent",
|
|
93460
|
-
loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-
|
|
93511
|
+
loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-DqTN-_zY.js"), true ? __vite__mapDeps([6,7]) : void 0, import.meta.url), "loader")
|
|
93461
93512
|
}
|
|
93462
93513
|
]
|
|
93463
93514
|
]);
|
|
@@ -93913,7 +93964,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
|
|
|
93913
93964
|
}, "detector");
|
|
93914
93965
|
var loader = /* @__PURE__ */ __name(async () => {
|
|
93915
93966
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93916
|
-
const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-
|
|
93967
|
+
const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-ntNDbqWz.js");
|
|
93917
93968
|
return { diagram: diagram22 };
|
|
93918
93969
|
}, true ? __vite__mapDeps([8,9]) : void 0, import.meta.url);
|
|
93919
93970
|
return { id, diagram: diagram2 };
|
|
@@ -93933,7 +93984,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
93933
93984
|
}, "detector");
|
|
93934
93985
|
var loader2 = /* @__PURE__ */ __name(async () => {
|
|
93935
93986
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93936
|
-
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-
|
|
93987
|
+
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-CYt7MUO6.js");
|
|
93937
93988
|
return { diagram: diagram22 };
|
|
93938
93989
|
}, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
|
|
93939
93990
|
return { id: id2, diagram: diagram2 };
|
|
@@ -93959,7 +94010,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
93959
94010
|
}, "detector");
|
|
93960
94011
|
var loader3 = /* @__PURE__ */ __name(async () => {
|
|
93961
94012
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93962
|
-
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-
|
|
94013
|
+
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-CYt7MUO6.js");
|
|
93963
94014
|
return { diagram: diagram22 };
|
|
93964
94015
|
}, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
|
|
93965
94016
|
return { id: id3, diagram: diagram2 };
|
|
@@ -93976,7 +94027,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
|
|
|
93976
94027
|
}, "detector");
|
|
93977
94028
|
var loader4 = /* @__PURE__ */ __name(async () => {
|
|
93978
94029
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93979
|
-
const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-
|
|
94030
|
+
const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-1ZgzBjAm.js");
|
|
93980
94031
|
return { diagram: diagram22 };
|
|
93981
94032
|
}, true ? __vite__mapDeps([15,12,13,14]) : void 0, import.meta.url);
|
|
93982
94033
|
return { id: id4, diagram: diagram2 };
|
|
@@ -93993,7 +94044,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
|
|
|
93993
94044
|
}, "detector");
|
|
93994
94045
|
var loader5 = /* @__PURE__ */ __name(async () => {
|
|
93995
94046
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
93996
|
-
const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-
|
|
94047
|
+
const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-4nzL1En3.js");
|
|
93997
94048
|
return { diagram: diagram22 };
|
|
93998
94049
|
}, true ? __vite__mapDeps([16,17,18,19,4,2]) : void 0, import.meta.url);
|
|
93999
94050
|
return { id: id5, diagram: diagram2 };
|
|
@@ -94010,7 +94061,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
|
|
|
94010
94061
|
}, "detector");
|
|
94011
94062
|
var loader6 = /* @__PURE__ */ __name(async () => {
|
|
94012
94063
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94013
|
-
const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-
|
|
94064
|
+
const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-nHro8zN9.js");
|
|
94014
94065
|
return { diagram: diagram22 };
|
|
94015
94066
|
}, true ? __vite__mapDeps([20,21,22,23]) : void 0, import.meta.url);
|
|
94016
94067
|
return { id: id6, diagram: diagram2 };
|
|
@@ -94027,7 +94078,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
|
|
|
94027
94078
|
}, "detector");
|
|
94028
94079
|
var loader7 = /* @__PURE__ */ __name(async () => {
|
|
94029
94080
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94030
|
-
const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-
|
|
94081
|
+
const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-BgCd2fMi.js");
|
|
94031
94082
|
return { diagram: diagram22 };
|
|
94032
94083
|
}, true ? __vite__mapDeps([24,19,4,2]) : void 0, import.meta.url);
|
|
94033
94084
|
return { id: id7, diagram: diagram2 };
|
|
@@ -94043,7 +94094,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
|
|
|
94043
94094
|
}, "detector");
|
|
94044
94095
|
var loader8 = /* @__PURE__ */ __name(async () => {
|
|
94045
94096
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94046
|
-
const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-
|
|
94097
|
+
const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-DyXeoEBp.js");
|
|
94047
94098
|
return { diagram: diagram22 };
|
|
94048
94099
|
}, true ? __vite__mapDeps([25,17,19,4,2,26,27,22]) : void 0, import.meta.url);
|
|
94049
94100
|
return { id: id8, diagram: diagram2 };
|
|
@@ -94059,7 +94110,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
|
|
|
94059
94110
|
}, "detector");
|
|
94060
94111
|
var loader9 = /* @__PURE__ */ __name(async () => {
|
|
94061
94112
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94062
|
-
const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-
|
|
94113
|
+
const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-hFY-GkiJ.js");
|
|
94063
94114
|
return { diagram: diagram22 };
|
|
94064
94115
|
}, true ? __vite__mapDeps([28,21,22,23]) : void 0, import.meta.url);
|
|
94065
94116
|
return { id: id9, diagram: diagram2 };
|
|
@@ -94076,7 +94127,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
|
|
|
94076
94127
|
}, "detector");
|
|
94077
94128
|
var loader10 = /* @__PURE__ */ __name(async () => {
|
|
94078
94129
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94079
|
-
const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND
|
|
94130
|
+
const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND--HADKQzk.js");
|
|
94080
94131
|
return { diagram: diagram22 };
|
|
94081
94132
|
}, true ? __vite__mapDeps([29,22,27,21,23]) : void 0, import.meta.url);
|
|
94082
94133
|
return { id: id10, diagram: diagram2 };
|
|
@@ -94093,7 +94144,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
|
|
|
94093
94144
|
}, "detector");
|
|
94094
94145
|
var loader11 = /* @__PURE__ */ __name(async () => {
|
|
94095
94146
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94096
|
-
const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-
|
|
94147
|
+
const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-ecRwwTfv.js");
|
|
94097
94148
|
return { diagram: diagram22 };
|
|
94098
94149
|
}, true ? __vite__mapDeps([30,12,13]) : void 0, import.meta.url);
|
|
94099
94150
|
return { id: id11, diagram: diagram2 };
|
|
@@ -94110,7 +94161,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
|
|
|
94110
94161
|
}, "detector");
|
|
94111
94162
|
var loader12 = /* @__PURE__ */ __name(async () => {
|
|
94112
94163
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94113
|
-
const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-
|
|
94164
|
+
const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-AV2u_2fd.js");
|
|
94114
94165
|
return { diagram: diagram22 };
|
|
94115
94166
|
}, true ? __vite__mapDeps([31,9,18]) : void 0, import.meta.url);
|
|
94116
94167
|
return { id: id12, diagram: diagram2 };
|
|
@@ -94130,7 +94181,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
94130
94181
|
}, "detector");
|
|
94131
94182
|
var loader13 = /* @__PURE__ */ __name(async () => {
|
|
94132
94183
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94133
|
-
const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-
|
|
94184
|
+
const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-CpuoT-Jx.js");
|
|
94134
94185
|
return { diagram: diagram22 };
|
|
94135
94186
|
}, true ? __vite__mapDeps([32,33,11,9,12,13]) : void 0, import.meta.url);
|
|
94136
94187
|
return { id: id13, diagram: diagram2 };
|
|
@@ -94150,7 +94201,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
94150
94201
|
}, "detector");
|
|
94151
94202
|
var loader14 = /* @__PURE__ */ __name(async () => {
|
|
94152
94203
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94153
|
-
const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-
|
|
94204
|
+
const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-CpuoT-Jx.js");
|
|
94154
94205
|
return { diagram: diagram22 };
|
|
94155
94206
|
}, true ? __vite__mapDeps([34,33,11,9,12,13]) : void 0, import.meta.url);
|
|
94156
94207
|
return { id: id14, diagram: diagram2 };
|
|
@@ -94170,7 +94221,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
94170
94221
|
}, "detector");
|
|
94171
94222
|
var loader15 = /* @__PURE__ */ __name(async () => {
|
|
94172
94223
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94173
|
-
const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-
|
|
94224
|
+
const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-DoTCNWMJ.js");
|
|
94174
94225
|
return { diagram: diagram22 };
|
|
94175
94226
|
}, true ? __vite__mapDeps([35,36,12,13,1,2,3,4]) : void 0, import.meta.url);
|
|
94176
94227
|
return { id: id15, diagram: diagram2 };
|
|
@@ -94193,7 +94244,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
|
|
|
94193
94244
|
}, "detector");
|
|
94194
94245
|
var loader16 = /* @__PURE__ */ __name(async () => {
|
|
94195
94246
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94196
|
-
const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2
|
|
94247
|
+
const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2--Ezn8EQY.js");
|
|
94197
94248
|
return { diagram: diagram22 };
|
|
94198
94249
|
}, true ? __vite__mapDeps([37,36,12,13]) : void 0, import.meta.url);
|
|
94199
94250
|
return { id: id16, diagram: diagram2 };
|
|
@@ -94210,7 +94261,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
|
|
|
94210
94261
|
}, "detector");
|
|
94211
94262
|
var loader17 = /* @__PURE__ */ __name(async () => {
|
|
94212
94263
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94213
|
-
const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-
|
|
94264
|
+
const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-Cl5-PgKK.js");
|
|
94214
94265
|
return { diagram: diagram22 };
|
|
94215
94266
|
}, true ? __vite__mapDeps([38,11,9,26]) : void 0, import.meta.url);
|
|
94216
94267
|
return { id: id17, diagram: diagram2 };
|
|
@@ -94280,7 +94331,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
|
|
|
94280
94331
|
}, "detector");
|
|
94281
94332
|
var loader18 = /* @__PURE__ */ __name(async () => {
|
|
94282
94333
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94283
|
-
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-
|
|
94334
|
+
const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-CYt7MUO6.js");
|
|
94284
94335
|
return { diagram: diagram22 };
|
|
94285
94336
|
}, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
|
|
94286
94337
|
return { id: id18, diagram: diagram2 };
|
|
@@ -94297,7 +94348,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
|
|
|
94297
94348
|
}, "detector");
|
|
94298
94349
|
var loader19 = /* @__PURE__ */ __name(async () => {
|
|
94299
94350
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94300
|
-
const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-
|
|
94351
|
+
const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-CQvZXAlZ.js");
|
|
94301
94352
|
return { diagram: diagram22 };
|
|
94302
94353
|
}, true ? __vite__mapDeps([39,26]) : void 0, import.meta.url);
|
|
94303
94354
|
return { id: id19, diagram: diagram2 };
|
|
@@ -94314,7 +94365,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
|
|
|
94314
94365
|
}, "detector");
|
|
94315
94366
|
var loader20 = /* @__PURE__ */ __name(async () => {
|
|
94316
94367
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94317
|
-
const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-
|
|
94368
|
+
const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-DYc59m-R.js");
|
|
94318
94369
|
return { diagram: diagram22 };
|
|
94319
94370
|
}, true ? __vite__mapDeps([40,12,13]) : void 0, import.meta.url);
|
|
94320
94371
|
return { id: id20, diagram: diagram2 };
|
|
@@ -94331,7 +94382,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
|
|
|
94331
94382
|
}, "detector");
|
|
94332
94383
|
var loader21 = /* @__PURE__ */ __name(async () => {
|
|
94333
94384
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94334
|
-
const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-
|
|
94385
|
+
const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-CTdiOO_t.js");
|
|
94335
94386
|
return { diagram: diagram22 };
|
|
94336
94387
|
}, true ? __vite__mapDeps([41,11]) : void 0, import.meta.url);
|
|
94337
94388
|
return { id: id21, diagram: diagram2 };
|
|
@@ -94348,7 +94399,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
|
|
|
94348
94399
|
}, "detector");
|
|
94349
94400
|
var loader22 = /* @__PURE__ */ __name(async () => {
|
|
94350
94401
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94351
|
-
const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-
|
|
94402
|
+
const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-BTL3sclU.js");
|
|
94352
94403
|
return { diagram: diagram22 };
|
|
94353
94404
|
}, true ? __vite__mapDeps([42,27,22]) : void 0, import.meta.url);
|
|
94354
94405
|
return { id: id22, diagram: diagram2 };
|
|
@@ -94365,7 +94416,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
|
|
|
94365
94416
|
}, "detector");
|
|
94366
94417
|
var loader23 = /* @__PURE__ */ __name(async () => {
|
|
94367
94418
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94368
|
-
const { diagram: diagram22 } = await import("./diagram-TYMM5635-
|
|
94419
|
+
const { diagram: diagram22 } = await import("./diagram-TYMM5635-B-O4bvMT.js");
|
|
94369
94420
|
return { diagram: diagram22 };
|
|
94370
94421
|
}, true ? __vite__mapDeps([43,17,19,4,2]) : void 0, import.meta.url);
|
|
94371
94422
|
return { id: id23, diagram: diagram2 };
|
|
@@ -94381,7 +94432,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
|
|
|
94381
94432
|
}, "detector");
|
|
94382
94433
|
var loader24 = /* @__PURE__ */ __name(async () => {
|
|
94383
94434
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94384
|
-
const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-
|
|
94435
|
+
const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-B7PHcRvh.js");
|
|
94385
94436
|
return { diagram: diagram22 };
|
|
94386
94437
|
}, true ? __vite__mapDeps([44,17,19,4,2]) : void 0, import.meta.url);
|
|
94387
94438
|
return { id: id24, diagram: diagram2 };
|
|
@@ -94397,7 +94448,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
|
|
|
94397
94448
|
}, "detector");
|
|
94398
94449
|
var loader25 = /* @__PURE__ */ __name(async () => {
|
|
94399
94450
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94400
|
-
const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-
|
|
94451
|
+
const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-CtAylmzM.js");
|
|
94401
94452
|
return { diagram: diagram22 };
|
|
94402
94453
|
}, true ? __vite__mapDeps([45,11,5,1,2,14]) : void 0, import.meta.url);
|
|
94403
94454
|
return { id: id25, diagram: diagram2 };
|
|
@@ -94414,7 +94465,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
|
|
|
94414
94465
|
}, "detector");
|
|
94415
94466
|
var loader26 = /* @__PURE__ */ __name(async () => {
|
|
94416
94467
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94417
|
-
const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-
|
|
94468
|
+
const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-Cln0uWD9.js");
|
|
94418
94469
|
return { diagram: diagram22 };
|
|
94419
94470
|
}, true ? __vite__mapDeps([46,17,18,19,4,2]) : void 0, import.meta.url);
|
|
94420
94471
|
return { id: id26, diagram: diagram2 };
|
|
@@ -94431,7 +94482,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
|
|
|
94431
94482
|
}, "detector");
|
|
94432
94483
|
var loader27 = /* @__PURE__ */ __name(async () => {
|
|
94433
94484
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94434
|
-
const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-
|
|
94485
|
+
const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-DLh2t5mE.js");
|
|
94435
94486
|
return { diagram: diagram22 };
|
|
94436
94487
|
}, true ? __vite__mapDeps([47,17,19,4,2,7]) : void 0, import.meta.url);
|
|
94437
94488
|
return { id: id27, diagram: diagram2 };
|
|
@@ -94448,7 +94499,7 @@ var detector28 = /* @__PURE__ */ __name((txt) => {
|
|
|
94448
94499
|
}, "detector");
|
|
94449
94500
|
var loader28 = /* @__PURE__ */ __name(async () => {
|
|
94450
94501
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94451
|
-
const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-
|
|
94502
|
+
const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-Dc9zBgQ3.js");
|
|
94452
94503
|
return { diagram: diagram22 };
|
|
94453
94504
|
}, true ? [] : void 0, import.meta.url);
|
|
94454
94505
|
return { id: id28, diagram: diagram2 };
|
|
@@ -94464,7 +94515,7 @@ var detector29 = /* @__PURE__ */ __name((txt) => {
|
|
|
94464
94515
|
}, "detector");
|
|
94465
94516
|
var loader29 = /* @__PURE__ */ __name(async () => {
|
|
94466
94517
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94467
|
-
const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-
|
|
94518
|
+
const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-zJ6WGEop.js");
|
|
94468
94519
|
return { diagram: diagram22 };
|
|
94469
94520
|
}, true ? [] : void 0, import.meta.url);
|
|
94470
94521
|
return { id: id29, diagram: diagram2 };
|
|
@@ -94481,7 +94532,7 @@ var detector30 = /* @__PURE__ */ __name((txt) => {
|
|
|
94481
94532
|
}, "detector");
|
|
94482
94533
|
var loader30 = /* @__PURE__ */ __name(async () => {
|
|
94483
94534
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94484
|
-
const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-
|
|
94535
|
+
const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-BlnD83ee.js");
|
|
94485
94536
|
return { diagram: diagram22 };
|
|
94486
94537
|
}, true ? __vite__mapDeps([48,13,17,19,4,2,23,27,22]) : void 0, import.meta.url);
|
|
94487
94538
|
return { id: id30, diagram: diagram2 };
|
|
@@ -94497,7 +94548,7 @@ var detector31 = /* @__PURE__ */ __name((text2) => {
|
|
|
94497
94548
|
}, "detector");
|
|
94498
94549
|
var loader31 = /* @__PURE__ */ __name(async () => {
|
|
94499
94550
|
const { diagram: diagram2 } = await __vitePreload(async () => {
|
|
94500
|
-
const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-
|
|
94551
|
+
const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-BAQ1Om89.js");
|
|
94501
94552
|
return { diagram: diagram22 };
|
|
94502
94553
|
}, true ? __vite__mapDeps([49,17,19,4,2]) : void 0, import.meta.url);
|
|
94503
94554
|
return { id: id31, diagram: diagram2 };
|
|
@@ -101355,7 +101406,7 @@ var displayWrap = function displayWrap2(node2, settings2) {
|
|
|
101355
101406
|
}
|
|
101356
101407
|
return node2;
|
|
101357
101408
|
};
|
|
101358
|
-
var buildTree = function
|
|
101409
|
+
var buildTree$1 = function buildTree(tree, expression, settings2) {
|
|
101359
101410
|
var options = optionsFromSettings(settings2);
|
|
101360
101411
|
var katexNode;
|
|
101361
101412
|
if (settings2.output === "mathml") {
|
|
@@ -109983,7 +110034,7 @@ var renderToDomTree = function renderToDomTree2(expression, options) {
|
|
|
109983
110034
|
var settings2 = new Settings(options);
|
|
109984
110035
|
try {
|
|
109985
110036
|
var tree = parseTree(expression, settings2);
|
|
109986
|
-
return buildTree(tree, expression, settings2);
|
|
110037
|
+
return buildTree$1(tree, expression, settings2);
|
|
109987
110038
|
} catch (error) {
|
|
109988
110039
|
return renderError(error, expression, settings2);
|
|
109989
110040
|
}
|
|
@@ -132184,24 +132235,6 @@ const TextBlock = reactExports.memo(function TextBlock2({
|
|
|
132184
132235
|
}
|
|
132185
132236
|
) });
|
|
132186
132237
|
});
|
|
132187
|
-
function Card({
|
|
132188
|
-
className,
|
|
132189
|
-
size: size2 = "default",
|
|
132190
|
-
...props
|
|
132191
|
-
}) {
|
|
132192
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
132193
|
-
"div",
|
|
132194
|
-
{
|
|
132195
|
-
"data-slot": "card",
|
|
132196
|
-
"data-size": size2,
|
|
132197
|
-
className: cn$5(
|
|
132198
|
-
"group/card flex flex-col overflow-hidden rounded-xl bg-card border border-border text-sm text-card-foreground has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
|
|
132199
|
-
className
|
|
132200
|
-
),
|
|
132201
|
-
...props
|
|
132202
|
-
}
|
|
132203
|
-
);
|
|
132204
|
-
}
|
|
132205
132238
|
const ImageBlock = reactExports.memo(function ImageBlock2({
|
|
132206
132239
|
block,
|
|
132207
132240
|
role: _role,
|
|
@@ -132316,7 +132349,7 @@ const TextResourceBlock = reactExports.memo(function TextResourceBlock2({
|
|
|
132316
132349
|
{
|
|
132317
132350
|
render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
|
|
132318
132351
|
nativeButton: false,
|
|
132319
|
-
className: "flex h-8
|
|
132352
|
+
className: "flex h-8 items-center gap-1 py-1 px-2 hover:bg-muted/50 select-none",
|
|
132320
132353
|
children: [
|
|
132321
132354
|
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-3.5 text-blue-400 shrink-0" }),
|
|
132322
132355
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-medium min-w-40 truncate flex-1", children: getBasename(resource.uri) }),
|
|
@@ -132943,7 +132976,7 @@ const ThinkingBubble = reactExports.memo(function ThinkingBubble2({
|
|
|
132943
132976
|
open: open2,
|
|
132944
132977
|
onOpenChange: setOpen,
|
|
132945
132978
|
children: [
|
|
132946
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "w-full bg-transparent border-0
|
|
132979
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "w-full bg-transparent border-0 flex select-none items-center gap-2 px-0 py-1 text-[11px] text-muted-foreground/90 hover:text-muted-foreground pointer-events-auto", children: [
|
|
132947
132980
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Lightbulb, { className: `size-3.5 ${isStreaming ? "animate-pulse" : ""}` }),
|
|
132948
132981
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: isStreaming ? t2("thinkingBubble.thinking", "Thinking...") : t2("thinkingBubble.thought", "Thought") })
|
|
132949
132982
|
] }),
|
|
@@ -133145,7 +133178,7 @@ const PlanBubble = reactExports.memo(function PlanBubble2({
|
|
|
133145
133178
|
),
|
|
133146
133179
|
defaultOpen: true,
|
|
133147
133180
|
children: [
|
|
133148
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "w-full bg-transparent border-0 flex
|
|
133181
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "w-full bg-transparent border-0 flex select-none items-center gap-2 px-3 py-2 text-xs hover:bg-secondary", children: [
|
|
133149
133182
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Notebook, { className: "size-3 text-muted-foreground" }),
|
|
133150
133183
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 flex items-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-foreground", children: t2("planBubble.title") }) }),
|
|
133151
133184
|
total > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] text-muted-foreground", children: t2("planBubble.summary", { completed, total }) })
|
|
@@ -137416,7 +137449,7 @@ function ChatInput({ session: session2 }) {
|
|
|
137416
137449
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
137417
137450
|
HoverCardTrigger,
|
|
137418
137451
|
{
|
|
137419
|
-
render: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex
|
|
137452
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 text-muted-foreground hover:text-foreground", children: [
|
|
137420
137453
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "size-3.5" }),
|
|
137421
137454
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "max-w-25 truncate", children: att.filename })
|
|
137422
137455
|
] })
|
|
@@ -137981,8 +138014,8 @@ function Chat({ session: session2 }) {
|
|
|
137981
138014
|
/* @__PURE__ */ jsxRuntimeExports.jsx(AskUserDialog, { sessionId: session2.id })
|
|
137982
138015
|
] });
|
|
137983
138016
|
}
|
|
137984
|
-
const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "gif", "webp", "avif", "bmp", "svg", "ico"];
|
|
137985
|
-
const FILE_EXT_MAP = {
|
|
138017
|
+
const IMAGE_EXTENSIONS$1 = ["png", "jpg", "jpeg", "gif", "webp", "avif", "bmp", "svg", "ico"];
|
|
138018
|
+
const FILE_EXT_MAP$1 = {
|
|
137986
138019
|
pdf: "pdf",
|
|
137987
138020
|
docx: "docx",
|
|
137988
138021
|
pptx: "pptx",
|
|
@@ -137991,11 +138024,11 @@ const FILE_EXT_MAP = {
|
|
|
137991
138024
|
html: "html",
|
|
137992
138025
|
htm: "html"
|
|
137993
138026
|
};
|
|
137994
|
-
function getFileKind(filename) {
|
|
138027
|
+
function getFileKind$1(filename) {
|
|
137995
138028
|
if (!filename) return null;
|
|
137996
138029
|
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];
|
|
138030
|
+
if (IMAGE_EXTENSIONS$1.includes(ext)) return "image";
|
|
138031
|
+
if (ext in FILE_EXT_MAP$1) return FILE_EXT_MAP$1[ext];
|
|
137999
138032
|
if (ext === "md") return "markdown";
|
|
138000
138033
|
return "text";
|
|
138001
138034
|
}
|
|
@@ -138314,7 +138347,7 @@ function SearchBar({
|
|
|
138314
138347
|
)
|
|
138315
138348
|
] });
|
|
138316
138349
|
}
|
|
138317
|
-
function CodeDetail({ projectId, file }) {
|
|
138350
|
+
function CodeDetail$1({ projectId, file }) {
|
|
138318
138351
|
const { t: t2 } = useTranslation();
|
|
138319
138352
|
const { content: content2, gitContent, loading, errorMsg } = useFile(projectId, file, { gitHead: true });
|
|
138320
138353
|
const [viewMode, setViewMode] = reactExports.useState("code");
|
|
@@ -138435,7 +138468,7 @@ function CodeDetail({ projectId, file }) {
|
|
|
138435
138468
|
/* @__PURE__ */ jsxRuntimeExports.jsx(FileViewTabs, { viewMode, viewModes, onViewModeChange: setViewMode })
|
|
138436
138469
|
] });
|
|
138437
138470
|
}
|
|
138438
|
-
function MarkdownDetail({ projectId, file }) {
|
|
138471
|
+
function MarkdownDetail$1({ projectId, file }) {
|
|
138439
138472
|
const { t: t2 } = useTranslation();
|
|
138440
138473
|
const { content: content2, gitContent, loading, errorMsg } = useFile(projectId, file, { gitHead: true });
|
|
138441
138474
|
const [viewMode, setViewMode] = reactExports.useState("preview");
|
|
@@ -140631,7 +140664,7 @@ function Controls() {
|
|
|
140631
140664
|
)
|
|
140632
140665
|
] });
|
|
140633
140666
|
}
|
|
140634
|
-
function ImageDetail({ projectId, file }) {
|
|
140667
|
+
function ImageDetail$1({ projectId, file }) {
|
|
140635
140668
|
const { content: content2, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
140636
140669
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
140637
140670
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
@@ -171686,7 +171719,7 @@ function PdfView({ data }) {
|
|
|
171686
171719
|
) }) })
|
|
171687
171720
|
] });
|
|
171688
171721
|
}
|
|
171689
|
-
function PdfDetail({ projectId, file }) {
|
|
171722
|
+
function PdfDetail$1({ projectId, file }) {
|
|
171690
171723
|
const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
171691
171724
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
171692
171725
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
@@ -178022,7 +178055,7 @@ function DocxView({ data }) {
|
|
|
178022
178055
|
)
|
|
178023
178056
|
] });
|
|
178024
178057
|
}
|
|
178025
|
-
function DocxDetail({ projectId, file }) {
|
|
178058
|
+
function DocxDetail$1({ projectId, file }) {
|
|
178026
178059
|
const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
178027
178060
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
178028
178061
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
@@ -182134,7 +182167,7 @@ function PptxView({ data }) {
|
|
|
182134
182167
|
)
|
|
182135
182168
|
] });
|
|
182136
182169
|
}
|
|
182137
|
-
function PptxDetail({ projectId, file }) {
|
|
182170
|
+
function PptxDetail$1({ projectId, file }) {
|
|
182138
182171
|
const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
182139
182172
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
182140
182173
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
@@ -208901,13 +208934,13 @@ function XlsxView({ data }) {
|
|
|
208901
208934
|
/* @__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
208935
|
] });
|
|
208903
208936
|
}
|
|
208904
|
-
function XlsxDetail({ projectId, file }) {
|
|
208937
|
+
function XlsxDetail$1({ projectId, file }) {
|
|
208905
208938
|
const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
|
|
208906
208939
|
if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
|
|
208907
208940
|
if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
|
|
208908
208941
|
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(XlsxView, { data: arrayBuffer, filename: file }) });
|
|
208909
208942
|
}
|
|
208910
|
-
function HtmlDetail({ projectId, file }) {
|
|
208943
|
+
function HtmlDetail$1({ projectId, file }) {
|
|
208911
208944
|
const { t: t2 } = useTranslation();
|
|
208912
208945
|
const iframeRef = reactExports.useRef(null);
|
|
208913
208946
|
const [hasError, setHasError] = reactExports.useState(false);
|
|
@@ -209156,9 +209189,9 @@ function FallbackDetail({ projectId, file }) {
|
|
|
209156
209189
|
)
|
|
209157
209190
|
] });
|
|
209158
209191
|
}
|
|
209159
|
-
function FileDetail({ projectId, file, onClose }) {
|
|
209192
|
+
function FileDetail$1({ projectId, file, onClose }) {
|
|
209160
209193
|
const { t: t2 } = useTranslation();
|
|
209161
|
-
const fileKind = getFileKind(file);
|
|
209194
|
+
const fileKind = getFileKind$1(file);
|
|
209162
209195
|
const [fileModified, setFileModified] = reactExports.useState(false);
|
|
209163
209196
|
const [refreshKey, setRefreshKey] = reactExports.useState(0);
|
|
209164
209197
|
reactExports.useEffect(() => {
|
|
@@ -209223,7 +209256,7 @@ function FileDetail({ projectId, file, onClose }) {
|
|
|
209223
209256
|
]
|
|
209224
209257
|
}
|
|
209225
209258
|
),
|
|
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 }) })
|
|
209259
|
+
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
209260
|
] });
|
|
209228
209261
|
}
|
|
209229
209262
|
var zs = Object.defineProperty;
|
|
@@ -217915,7 +217948,7 @@ function Detail({ detailType, projectId, file, terminalId, onClose }) {
|
|
|
217915
217948
|
const { t: t2 } = useTranslation();
|
|
217916
217949
|
if (!detailType) return null;
|
|
217917
217950
|
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 }),
|
|
217951
|
+
detailType === "file" && projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx(FileDetail$1, { projectId, file, onClose }),
|
|
217919
217952
|
detailType === "terminal" && projectId && terminalId && /* @__PURE__ */ jsxRuntimeExports.jsx(TerminalDetail, { terminalId, projectId, onClose }),
|
|
217920
217953
|
(!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
217954
|
] });
|
|
@@ -218045,12 +218078,11 @@ function TreeItem({
|
|
|
218045
218078
|
ChevronRight,
|
|
218046
218079
|
{
|
|
218047
218080
|
className: cn$5(
|
|
218048
|
-
"size-3.5 shrink-0 text-muted-foreground transition-transform",
|
|
218081
|
+
"size-3.5 shrink-0 text-muted-foreground scale-110 transition-transform",
|
|
218049
218082
|
isOpen && "rotate-90"
|
|
218050
218083
|
)
|
|
218051
218084
|
}
|
|
218052
|
-
) : /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
218053
|
-
node2.isFolder ? /* @__PURE__ */ jsxRuntimeExports.jsx(Folder$1, { className: "size-4 shrink-0 text-muted-foreground/90" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { name: node2.name, className: "size-4 shrink-0 text-muted-foreground/90" }),
|
|
218085
|
+
) : /* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { name: node2.name, className: "size-3.5 shrink-0 text-muted-foreground/90" }),
|
|
218054
218086
|
isEditing ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
218055
218087
|
"input",
|
|
218056
218088
|
{
|
|
@@ -218430,9 +218462,14 @@ const FilePanel = reactExports.memo(function FilePanel2({
|
|
|
218430
218462
|
const next2 = new Set(prev2);
|
|
218431
218463
|
if (next2.has(id32)) {
|
|
218432
218464
|
next2.delete(id32);
|
|
218465
|
+
const prefix = id32 + "/";
|
|
218466
|
+
for (const key2 of prev2) {
|
|
218467
|
+
if (key2.startsWith(prefix)) next2.delete(key2);
|
|
218468
|
+
}
|
|
218433
218469
|
} else {
|
|
218434
218470
|
next2.add(id32);
|
|
218435
218471
|
}
|
|
218472
|
+
openFoldersRef.current = next2;
|
|
218436
218473
|
return next2;
|
|
218437
218474
|
});
|
|
218438
218475
|
if (node2.isFolder && activeProjectId) {
|
|
@@ -218466,6 +218503,7 @@ const FilePanel = reactExports.memo(function FilePanel2({
|
|
|
218466
218503
|
);
|
|
218467
218504
|
const collapseAll = reactExports.useCallback(() => {
|
|
218468
218505
|
setOpenFolders(/* @__PURE__ */ new Set());
|
|
218506
|
+
openFoldersRef.current = /* @__PURE__ */ new Set();
|
|
218469
218507
|
}, []);
|
|
218470
218508
|
const handleSelect = reactExports.useCallback(
|
|
218471
218509
|
(id32, e2) => {
|
|
@@ -218556,7 +218594,11 @@ const FilePanel = reactExports.memo(function FilePanel2({
|
|
|
218556
218594
|
children: isFolder ? [] : void 0
|
|
218557
218595
|
};
|
|
218558
218596
|
if (parentId) {
|
|
218559
|
-
setOpenFolders((prev2) =>
|
|
218597
|
+
setOpenFolders((prev2) => {
|
|
218598
|
+
const next2 = new Set(prev2).add(parentId);
|
|
218599
|
+
openFoldersRef.current = next2;
|
|
218600
|
+
return next2;
|
|
218601
|
+
});
|
|
218560
218602
|
let needsFetch = false;
|
|
218561
218603
|
for (const root2 of data) {
|
|
218562
218604
|
const p3 = findNode(root2, parentId);
|
|
@@ -219122,7 +219164,7 @@ const FilePanel = reactExports.memo(function FilePanel2({
|
|
|
219122
219164
|
)
|
|
219123
219165
|
] })
|
|
219124
219166
|
] }),
|
|
219125
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
|
|
219167
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1 pl-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
|
|
219126
219168
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
219127
219169
|
ContextMenuTrigger,
|
|
219128
219170
|
{
|
|
@@ -219305,7 +219347,7 @@ function TerminalPanel({
|
|
|
219305
219347
|
)) }) })
|
|
219306
219348
|
] });
|
|
219307
219349
|
}
|
|
219308
|
-
function Panel({
|
|
219350
|
+
function Panel$1({
|
|
219309
219351
|
tab: tab2,
|
|
219310
219352
|
onTabChange,
|
|
219311
219353
|
projectId,
|
|
@@ -221589,7 +221631,7 @@ function Session({ session: session2 }) {
|
|
|
221589
221631
|
minSize: 250,
|
|
221590
221632
|
maxSize: 400,
|
|
221591
221633
|
children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
221592
|
-
Panel,
|
|
221634
|
+
Panel$1,
|
|
221593
221635
|
{
|
|
221594
221636
|
tab: panelTab,
|
|
221595
221637
|
onTabChange: (tab2) => setPanelTab(tab2),
|
|
@@ -233317,7 +233359,8 @@ const schema$3 = object({
|
|
|
233317
233359
|
baseUrl: string().trim().min(1, "settings.agents.validation.enterBaseUrl"),
|
|
233318
233360
|
apiKey: string().trim().min(1, "settings.agents.validation.enterApiKey"),
|
|
233319
233361
|
headersRaw: string().refine(isValidStringMap$2, "settings.agents.validation.jsonObject"),
|
|
233320
|
-
contextWindowTokens: string().refine(isValidContextWindow, "settings.agents.validation.positiveInteger")
|
|
233362
|
+
contextWindowTokens: string().refine(isValidContextWindow, "settings.agents.validation.positiveInteger"),
|
|
233363
|
+
modelIdTemplate: string()
|
|
233321
233364
|
});
|
|
233322
233365
|
function SettingsAgentApiDialog({
|
|
233323
233366
|
open: open2,
|
|
@@ -233335,7 +233378,8 @@ function SettingsAgentApiDialog({
|
|
|
233335
233378
|
baseUrl: "",
|
|
233336
233379
|
apiKey: "",
|
|
233337
233380
|
headersRaw: "",
|
|
233338
|
-
contextWindowTokens: ""
|
|
233381
|
+
contextWindowTokens: "",
|
|
233382
|
+
modelIdTemplate: ""
|
|
233339
233383
|
}
|
|
233340
233384
|
});
|
|
233341
233385
|
reactExports.useEffect(() => {
|
|
@@ -233346,7 +233390,8 @@ function SettingsAgentApiDialog({
|
|
|
233346
233390
|
baseUrl: initialAgent?.baseUrl ?? "",
|
|
233347
233391
|
apiKey: initialAgent?.apiKey ?? "",
|
|
233348
233392
|
headersRaw: initialAgent && Object.keys(initialAgent.headers || {}).length > 0 ? JSON.stringify(initialAgent.headers) : "",
|
|
233349
|
-
contextWindowTokens: initialAgent?.contextWindowTokens?.toString() ?? ""
|
|
233393
|
+
contextWindowTokens: initialAgent?.contextWindowTokens?.toString() ?? "",
|
|
233394
|
+
modelIdTemplate: initialAgent?.modelIdTemplate ?? ""
|
|
233350
233395
|
});
|
|
233351
233396
|
}, [initialAgent, open2, form]);
|
|
233352
233397
|
const onSubmit = async (data) => {
|
|
@@ -233358,7 +233403,8 @@ function SettingsAgentApiDialog({
|
|
|
233358
233403
|
baseUrl: data.baseUrl.trim(),
|
|
233359
233404
|
apiKey: data.apiKey.trim(),
|
|
233360
233405
|
headers: parseStringMap$2(data.headersRaw),
|
|
233361
|
-
contextWindowTokens: data.contextWindowTokens.trim() ? Number(data.contextWindowTokens) : void 0
|
|
233406
|
+
contextWindowTokens: data.contextWindowTokens.trim() ? Number(data.contextWindowTokens) : void 0,
|
|
233407
|
+
modelIdTemplate: data.modelIdTemplate.trim() || void 0
|
|
233362
233408
|
});
|
|
233363
233409
|
};
|
|
233364
233410
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-lg", children: [
|
|
@@ -233370,75 +233416,84 @@ function SettingsAgentApiDialog({
|
|
|
233370
233416
|
) })
|
|
233371
233417
|
] }),
|
|
233372
233418
|
/* @__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: [
|
|
233419
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
233420
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233421
|
+
Controller,
|
|
233422
|
+
{
|
|
233423
|
+
name: "id",
|
|
233424
|
+
control: form.control,
|
|
233425
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
|
|
233426
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-id", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.agentId") }),
|
|
233415
233427
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233416
|
-
|
|
233428
|
+
Input,
|
|
233417
233429
|
{
|
|
233418
|
-
|
|
233430
|
+
...field,
|
|
233431
|
+
id: "api-id",
|
|
233432
|
+
placeholder: t2("settings.agents.agentId"),
|
|
233419
233433
|
"aria-invalid": fieldState.invalid,
|
|
233420
|
-
|
|
233421
|
-
|
|
233434
|
+
disabled: !!initialAgent?.id,
|
|
233435
|
+
className: "h-8 text-xs! text-foreground/70 focus-visible:ring-0.5"
|
|
233422
233436
|
}
|
|
233423
233437
|
),
|
|
233424
|
-
|
|
233425
|
-
|
|
233426
|
-
|
|
233427
|
-
|
|
233428
|
-
|
|
233429
|
-
|
|
233438
|
+
fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233439
|
+
FieldError,
|
|
233440
|
+
{
|
|
233441
|
+
errors: [
|
|
233442
|
+
{
|
|
233443
|
+
message: t2(
|
|
233444
|
+
fieldState.error?.message ?? "",
|
|
233445
|
+
fieldState.error?.message ?? ""
|
|
233446
|
+
)
|
|
233447
|
+
}
|
|
233448
|
+
]
|
|
233449
|
+
}
|
|
233450
|
+
)
|
|
233451
|
+
] })
|
|
233452
|
+
}
|
|
233453
|
+
),
|
|
233454
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233455
|
+
Controller,
|
|
233456
|
+
{
|
|
233457
|
+
name: "provider",
|
|
233458
|
+
control: form.control,
|
|
233459
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
|
|
233460
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233461
|
+
FieldLabel,
|
|
233462
|
+
{
|
|
233463
|
+
htmlFor: "api-provider",
|
|
233464
|
+
className: "text-[11px] text-muted-foreground",
|
|
233465
|
+
children: t2("settings.agents.apiProvider", "Provider")
|
|
233466
|
+
}
|
|
233467
|
+
),
|
|
233468
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { name: field.name, value: field.value, onValueChange: field.onChange, children: [
|
|
233469
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233470
|
+
SelectTrigger,
|
|
233430
233471
|
{
|
|
233431
|
-
|
|
233432
|
-
|
|
233433
|
-
|
|
233434
|
-
)
|
|
233472
|
+
id: "api-provider",
|
|
233473
|
+
"aria-invalid": fieldState.invalid,
|
|
233474
|
+
className: "w-full text-[11px]! font-mono",
|
|
233475
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {})
|
|
233435
233476
|
}
|
|
233436
|
-
|
|
233437
|
-
|
|
233438
|
-
|
|
233439
|
-
|
|
233440
|
-
|
|
233441
|
-
|
|
233477
|
+
),
|
|
233478
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "openai-compatible", children: "openai-compatible" }) })
|
|
233479
|
+
] }),
|
|
233480
|
+
fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233481
|
+
FieldError,
|
|
233482
|
+
{
|
|
233483
|
+
errors: [
|
|
233484
|
+
{
|
|
233485
|
+
message: t2(
|
|
233486
|
+
fieldState.error?.message ?? "",
|
|
233487
|
+
fieldState.error?.message ?? ""
|
|
233488
|
+
)
|
|
233489
|
+
}
|
|
233490
|
+
]
|
|
233491
|
+
}
|
|
233492
|
+
)
|
|
233493
|
+
] })
|
|
233494
|
+
}
|
|
233495
|
+
)
|
|
233496
|
+
] }),
|
|
233442
233497
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233443
233498
|
Controller,
|
|
233444
233499
|
{
|
|
@@ -233519,7 +233574,7 @@ function SettingsAgentApiDialog({
|
|
|
233519
233574
|
id: "api-headers",
|
|
233520
233575
|
placeholder: '{ "name": "value" }',
|
|
233521
233576
|
"aria-invalid": fieldState.invalid,
|
|
233522
|
-
className: "text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
|
|
233577
|
+
className: "text-[11px]! min-h-14 font-mono text-foreground/70 focus-visible:ring-0.5"
|
|
233523
233578
|
}
|
|
233524
233579
|
),
|
|
233525
233580
|
fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
@@ -233596,6 +233651,46 @@ function SettingsAgentApiDialog({
|
|
|
233596
233651
|
)
|
|
233597
233652
|
] })
|
|
233598
233653
|
}
|
|
233654
|
+
),
|
|
233655
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233656
|
+
Controller,
|
|
233657
|
+
{
|
|
233658
|
+
name: "modelIdTemplate",
|
|
233659
|
+
control: form.control,
|
|
233660
|
+
render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
|
|
233661
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233662
|
+
FieldLabel,
|
|
233663
|
+
{
|
|
233664
|
+
htmlFor: "api-model-template",
|
|
233665
|
+
className: "text-[11px] text-muted-foreground",
|
|
233666
|
+
children: t2("settings.agents.modelIdTemplate", "Model Id Template")
|
|
233667
|
+
}
|
|
233668
|
+
),
|
|
233669
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233670
|
+
Input,
|
|
233671
|
+
{
|
|
233672
|
+
...field,
|
|
233673
|
+
id: "api-model-template",
|
|
233674
|
+
placeholder: "{id}",
|
|
233675
|
+
"aria-invalid": fieldState.invalid,
|
|
233676
|
+
className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
|
|
233677
|
+
}
|
|
233678
|
+
),
|
|
233679
|
+
fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
233680
|
+
FieldError,
|
|
233681
|
+
{
|
|
233682
|
+
errors: [
|
|
233683
|
+
{
|
|
233684
|
+
message: t2(
|
|
233685
|
+
fieldState.error?.message ?? "",
|
|
233686
|
+
fieldState.error?.message ?? ""
|
|
233687
|
+
)
|
|
233688
|
+
}
|
|
233689
|
+
]
|
|
233690
|
+
}
|
|
233691
|
+
)
|
|
233692
|
+
] })
|
|
233693
|
+
}
|
|
233599
233694
|
)
|
|
233600
233695
|
] }) }),
|
|
233601
233696
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
|
|
@@ -235271,7 +235366,7 @@ function SkillsLayout() {
|
|
|
235271
235366
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
235272
235367
|
"div",
|
|
235273
235368
|
{
|
|
235274
|
-
className: "h-12 shrink-0 border-b border-border flex items-center px-
|
|
235369
|
+
className: "h-12 shrink-0 border-b border-border flex items-center px-4",
|
|
235275
235370
|
style: { WebkitAppRegion: "drag" },
|
|
235276
235371
|
children: /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: t2("skills.title") })
|
|
235277
235372
|
}
|
|
@@ -235282,7 +235377,7 @@ function SkillsLayout() {
|
|
|
235282
235377
|
{
|
|
235283
235378
|
to: tab2.href,
|
|
235284
235379
|
className: ({ isActive }) => cn$5(
|
|
235285
|
-
"flex items-center gap-2 rounded-md px-3 py-2 text-xs transition-colors",
|
|
235380
|
+
"flex items-center gap-2 rounded-md px-3 py-2 text-xs transition-colors cursor-default",
|
|
235286
235381
|
isActive ? "bg-accent text-accent-foreground font-medium" : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"
|
|
235287
235382
|
),
|
|
235288
235383
|
children: [
|
|
@@ -235683,6 +235778,1550 @@ function SkillsSh() {
|
|
|
235683
235778
|
}) }) : !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
235779
|
] });
|
|
235685
235780
|
}
|
|
235781
|
+
const HOURS = Array.from({ length: 24 }, (_2, i3) => i3);
|
|
235782
|
+
const MINUTES = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
|
|
235783
|
+
const INTERVALS = [1, 2, 3, 4, 6, 8, 12];
|
|
235784
|
+
const DAYS_OF_WEEK_VALUES = ["1", "2", "3", "4", "5", "6", "0"];
|
|
235785
|
+
function detectPreset(expr) {
|
|
235786
|
+
const parts = expr.trim().split(/\s+/);
|
|
235787
|
+
if (parts.length !== 5) return "custom";
|
|
235788
|
+
const [min2, hr2, dom, mon, dow] = parts;
|
|
235789
|
+
if (hr2.startsWith("*/") && dom === "*" && mon === "*" && dow === "*") {
|
|
235790
|
+
const n2 = parseInt(hr2.slice(2));
|
|
235791
|
+
if (!isNaN(n2) && INTERVALS.includes(n2)) return "hourly";
|
|
235792
|
+
}
|
|
235793
|
+
const h3 = parseInt(hr2), m2 = parseInt(min2);
|
|
235794
|
+
if (isNaN(h3) || isNaN(m2)) return "custom";
|
|
235795
|
+
if (dom === "*" && mon === "*" && dow === "*") return "daily";
|
|
235796
|
+
if (dom === "*" && mon === "*" && dow === "1-5") return "weekdays";
|
|
235797
|
+
if (dom === "*" && mon === "*" && /^\d$/.test(dow)) return "weekly";
|
|
235798
|
+
return "custom";
|
|
235799
|
+
}
|
|
235800
|
+
function parseParts(expr) {
|
|
235801
|
+
const parts = expr.trim().split(/\s+/);
|
|
235802
|
+
if (parts.length !== 5) return { hour: 9, minute: 0, interval: 2, dow: "1" };
|
|
235803
|
+
const [min2, hr2] = parts;
|
|
235804
|
+
const dow = parts[4];
|
|
235805
|
+
if (hr2.startsWith("*/"))
|
|
235806
|
+
return {
|
|
235807
|
+
hour: 9,
|
|
235808
|
+
minute: parseInt(min2) || 0,
|
|
235809
|
+
interval: parseInt(hr2.slice(2)) || 2,
|
|
235810
|
+
dow: /^\d$/.test(dow) ? dow : "1"
|
|
235811
|
+
};
|
|
235812
|
+
return {
|
|
235813
|
+
hour: parseInt(hr2) || 9,
|
|
235814
|
+
minute: parseInt(min2) || 0,
|
|
235815
|
+
interval: 2,
|
|
235816
|
+
dow: /^\d$/.test(dow) ? dow : "1"
|
|
235817
|
+
};
|
|
235818
|
+
}
|
|
235819
|
+
function buildCron(preset, hour, minute, interval2, dow) {
|
|
235820
|
+
switch (preset) {
|
|
235821
|
+
case "daily":
|
|
235822
|
+
return `${minute} ${hour} * * *`;
|
|
235823
|
+
case "weekdays":
|
|
235824
|
+
return `${minute} ${hour} * * 1-5`;
|
|
235825
|
+
case "weekly":
|
|
235826
|
+
return `${minute} ${hour} * * ${dow}`;
|
|
235827
|
+
case "hourly":
|
|
235828
|
+
return `${minute} */${interval2} * * *`;
|
|
235829
|
+
default:
|
|
235830
|
+
return `${minute} ${hour} * * *`;
|
|
235831
|
+
}
|
|
235832
|
+
}
|
|
235833
|
+
function CronEditor({ value, onChange, timezone }) {
|
|
235834
|
+
const { t: t2, i18n } = useTranslation();
|
|
235835
|
+
const [preset, setPreset] = reactExports.useState(() => detectPreset(value));
|
|
235836
|
+
const [parts, setParts] = reactExports.useState(() => parseParts(value));
|
|
235837
|
+
reactExports.useEffect(() => {
|
|
235838
|
+
const detected = detectPreset(value);
|
|
235839
|
+
if (detected !== "custom") {
|
|
235840
|
+
setPreset(detected);
|
|
235841
|
+
setParts(parseParts(value));
|
|
235842
|
+
}
|
|
235843
|
+
}, [value]);
|
|
235844
|
+
const handlePresetChange = (p3) => {
|
|
235845
|
+
setPreset(p3);
|
|
235846
|
+
if (p3 !== "custom") {
|
|
235847
|
+
onChange(buildCron(p3, parts.hour, parts.minute, parts.interval, parts.dow));
|
|
235848
|
+
}
|
|
235849
|
+
};
|
|
235850
|
+
const updateParts = (patch2) => {
|
|
235851
|
+
const next2 = { ...parts, ...patch2 };
|
|
235852
|
+
setParts(next2);
|
|
235853
|
+
if (preset !== "custom") {
|
|
235854
|
+
onChange(buildCron(preset, next2.hour, next2.minute, next2.interval, next2.dow));
|
|
235855
|
+
}
|
|
235856
|
+
};
|
|
235857
|
+
const presetItems = [
|
|
235858
|
+
{ value: "daily", label: t2("automation.cron.daily", "Every day") },
|
|
235859
|
+
{ value: "weekdays", label: t2("automation.cron.weekdays", "Weekdays") },
|
|
235860
|
+
{ value: "weekly", label: t2("automation.cron.weekly", "Every week") },
|
|
235861
|
+
{ value: "hourly", label: t2("automation.cron.hourly", "Every N hours") },
|
|
235862
|
+
{ value: "custom", label: t2("automation.cron.custom", "Custom") }
|
|
235863
|
+
];
|
|
235864
|
+
const intervalItems = INTERVALS.map((n2) => ({ value: String(n2), label: `${n2}h` }));
|
|
235865
|
+
const minuteItems = MINUTES.map((m2) => ({
|
|
235866
|
+
value: String(m2),
|
|
235867
|
+
label: `${String(m2).padStart(2, "0")}`
|
|
235868
|
+
}));
|
|
235869
|
+
const hourItems = HOURS.map((h3) => ({ value: String(h3), label: String(h3).padStart(2, "0") }));
|
|
235870
|
+
const dowItems = DAYS_OF_WEEK_VALUES.map((v4) => ({
|
|
235871
|
+
value: v4,
|
|
235872
|
+
label: t2(
|
|
235873
|
+
`automation.cron.days.${v4}`,
|
|
235874
|
+
["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][parseInt(v4)]
|
|
235875
|
+
)
|
|
235876
|
+
}));
|
|
235877
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2.5", children: [
|
|
235878
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
235879
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
235880
|
+
Select,
|
|
235881
|
+
{
|
|
235882
|
+
items: presetItems,
|
|
235883
|
+
value: preset,
|
|
235884
|
+
onValueChange: (v4) => {
|
|
235885
|
+
if (v4) handlePresetChange(v4);
|
|
235886
|
+
},
|
|
235887
|
+
children: [
|
|
235888
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-8 text-xs! w-32 shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235889
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: presetItems.map((p3) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: p3.value, children: p3.label }, p3.value)) })
|
|
235890
|
+
]
|
|
235891
|
+
}
|
|
235892
|
+
),
|
|
235893
|
+
preset === "custom" ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
235894
|
+
Input,
|
|
235895
|
+
{
|
|
235896
|
+
value,
|
|
235897
|
+
onChange: (e2) => onChange(e2.target.value),
|
|
235898
|
+
placeholder: "min hour day month weekday",
|
|
235899
|
+
className: "h-8 text-xs! font-mono text-foreground/70 focus-visible:ring-0.5 flex-1"
|
|
235900
|
+
}
|
|
235901
|
+
) : preset === "hourly" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
235902
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
235903
|
+
Select,
|
|
235904
|
+
{
|
|
235905
|
+
items: intervalItems,
|
|
235906
|
+
value: String(parts.interval),
|
|
235907
|
+
onValueChange: (v4) => {
|
|
235908
|
+
if (v4) updateParts({ interval: parseInt(v4) });
|
|
235909
|
+
},
|
|
235910
|
+
children: [
|
|
235911
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235912
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: intervalItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235913
|
+
]
|
|
235914
|
+
}
|
|
235915
|
+
),
|
|
235916
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: t2("automation.cron.atMinute", "at min") }),
|
|
235917
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
235918
|
+
Select,
|
|
235919
|
+
{
|
|
235920
|
+
items: minuteItems,
|
|
235921
|
+
value: String(parts.minute),
|
|
235922
|
+
onValueChange: (v4) => {
|
|
235923
|
+
if (v4) updateParts({ minute: parseInt(v4) });
|
|
235924
|
+
},
|
|
235925
|
+
children: [
|
|
235926
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235927
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: minuteItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235928
|
+
]
|
|
235929
|
+
}
|
|
235930
|
+
)
|
|
235931
|
+
] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
235932
|
+
preset === "weekly" && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
235933
|
+
Select,
|
|
235934
|
+
{
|
|
235935
|
+
items: dowItems,
|
|
235936
|
+
value: parts.dow,
|
|
235937
|
+
onValueChange: (v4) => {
|
|
235938
|
+
if (v4) updateParts({ dow: v4 });
|
|
235939
|
+
},
|
|
235940
|
+
children: [
|
|
235941
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-18", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235942
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: dowItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235943
|
+
]
|
|
235944
|
+
}
|
|
235945
|
+
),
|
|
235946
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: t2("automation.cron.at", "at") }),
|
|
235947
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
235948
|
+
Select,
|
|
235949
|
+
{
|
|
235950
|
+
items: hourItems,
|
|
235951
|
+
value: String(parts.hour),
|
|
235952
|
+
onValueChange: (v4) => {
|
|
235953
|
+
if (v4) updateParts({ hour: parseInt(v4) });
|
|
235954
|
+
},
|
|
235955
|
+
children: [
|
|
235956
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235957
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: hourItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235958
|
+
]
|
|
235959
|
+
}
|
|
235960
|
+
),
|
|
235961
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: ":" }),
|
|
235962
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
235963
|
+
Select,
|
|
235964
|
+
{
|
|
235965
|
+
items: minuteItems,
|
|
235966
|
+
value: String(parts.minute),
|
|
235967
|
+
onValueChange: (v4) => {
|
|
235968
|
+
if (v4) updateParts({ minute: parseInt(v4) });
|
|
235969
|
+
},
|
|
235970
|
+
children: [
|
|
235971
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
|
|
235972
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: minuteItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
|
|
235973
|
+
]
|
|
235974
|
+
}
|
|
235975
|
+
)
|
|
235976
|
+
] })
|
|
235977
|
+
] }),
|
|
235978
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-[11px] text-muted-foreground", children: [
|
|
235979
|
+
value,
|
|
235980
|
+
" · ",
|
|
235981
|
+
t2("automation.cron.nextRun", "Next run"),
|
|
235982
|
+
": ",
|
|
235983
|
+
formatNextCron(value, i18n.language),
|
|
235984
|
+
timezone && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-1 text-muted-foreground/50", children: [
|
|
235985
|
+
"(",
|
|
235986
|
+
timezone,
|
|
235987
|
+
")"
|
|
235988
|
+
] })
|
|
235989
|
+
] })
|
|
235990
|
+
] });
|
|
235991
|
+
}
|
|
235992
|
+
function formatNextCron(expr, locale) {
|
|
235993
|
+
try {
|
|
235994
|
+
const next2 = getNextCronDate(expr);
|
|
235995
|
+
if (!next2) return "—";
|
|
235996
|
+
return next2.toLocaleString(locale, {
|
|
235997
|
+
month: "short",
|
|
235998
|
+
day: "numeric",
|
|
235999
|
+
hour: "2-digit",
|
|
236000
|
+
minute: "2-digit"
|
|
236001
|
+
});
|
|
236002
|
+
} catch {
|
|
236003
|
+
return "—";
|
|
236004
|
+
}
|
|
236005
|
+
}
|
|
236006
|
+
function getNextCronDate(expr) {
|
|
236007
|
+
const parts = expr.trim().split(/\s+/);
|
|
236008
|
+
if (parts.length !== 5) return null;
|
|
236009
|
+
const [minF, hrF, , , dowF] = parts;
|
|
236010
|
+
const now2 = /* @__PURE__ */ new Date();
|
|
236011
|
+
for (let d2 = 0; d2 < 8; d2++) {
|
|
236012
|
+
const candidate = new Date(now2.getTime() + d2 * 864e5);
|
|
236013
|
+
const dow = candidate.getDay();
|
|
236014
|
+
if (dowF !== "*") {
|
|
236015
|
+
if (dowF === "1-5" && (dow === 0 || dow === 6)) continue;
|
|
236016
|
+
else if (/^\d$/.test(dowF) && dow !== parseInt(dowF)) continue;
|
|
236017
|
+
else if (dowF.includes(",") && !dowF.split(",").map(Number).includes(dow)) continue;
|
|
236018
|
+
}
|
|
236019
|
+
if (hrF.startsWith("*/")) {
|
|
236020
|
+
const interval2 = parseInt(hrF.slice(2)) || 1;
|
|
236021
|
+
const minute = parseInt(minF) || 0;
|
|
236022
|
+
for (let h3 = 0; h3 < 24; h3 += interval2) {
|
|
236023
|
+
candidate.setHours(h3, minute, 0, 0);
|
|
236024
|
+
if (candidate > now2) return candidate;
|
|
236025
|
+
}
|
|
236026
|
+
} else {
|
|
236027
|
+
const h3 = parseInt(hrF), m2 = parseInt(minF);
|
|
236028
|
+
if (isNaN(h3) || isNaN(m2)) return null;
|
|
236029
|
+
candidate.setHours(h3, m2, 0, 0);
|
|
236030
|
+
if (candidate > now2) return candidate;
|
|
236031
|
+
}
|
|
236032
|
+
}
|
|
236033
|
+
return null;
|
|
236034
|
+
}
|
|
236035
|
+
function SettingDialog({ schedule: schedule2, open: open2, onOpenChange, onSuccess }) {
|
|
236036
|
+
const isEdit = !!schedule2;
|
|
236037
|
+
const { t: t2 } = useTranslation();
|
|
236038
|
+
const { toast: toast2 } = useMessage();
|
|
236039
|
+
const configuredAgents = useAppStore((s16) => s16.configuredAgents);
|
|
236040
|
+
const configuredMcpServers = useAppStore((s16) => s16.configuredMcpServers);
|
|
236041
|
+
const enabledAgents = reactExports.useMemo(
|
|
236042
|
+
() => configuredAgents.filter((a2) => !a2.disabled),
|
|
236043
|
+
[configuredAgents]
|
|
236044
|
+
);
|
|
236045
|
+
const enabledMcpServers = reactExports.useMemo(
|
|
236046
|
+
() => configuredMcpServers.filter((s16) => !s16.disabled),
|
|
236047
|
+
[configuredMcpServers]
|
|
236048
|
+
);
|
|
236049
|
+
const [timezone, setTimezone] = reactExports.useState("");
|
|
236050
|
+
reactExports.useEffect(() => {
|
|
236051
|
+
request.getServerTimezone().then(setTimezone).catch(() => {
|
|
236052
|
+
});
|
|
236053
|
+
}, []);
|
|
236054
|
+
const [name2, setName] = reactExports.useState(isEdit ? schedule2.name : "");
|
|
236055
|
+
const [agentId, setAgentId] = reactExports.useState(isEdit ? schedule2.agentId : enabledAgents[0]?.id ?? "");
|
|
236056
|
+
const [prompt, setPrompt] = reactExports.useState(isEdit ? schedule2.prompt : "");
|
|
236057
|
+
const [cronType, setCronType] = reactExports.useState(
|
|
236058
|
+
isEdit ? schedule2.cron.type : "cron"
|
|
236059
|
+
);
|
|
236060
|
+
const [cronExpr, setCronExpr] = reactExports.useState(
|
|
236061
|
+
isEdit ? schedule2.cron.expr ?? "0 9 * * 1-5" : "0 9 * * 1-5"
|
|
236062
|
+
);
|
|
236063
|
+
const [features, setFeatures] = reactExports.useState(
|
|
236064
|
+
isEdit ? schedule2.features ?? ["skills"] : ["skills"]
|
|
236065
|
+
);
|
|
236066
|
+
const [mcpServerIds, setMcpServerIds] = reactExports.useState(
|
|
236067
|
+
isEdit ? schedule2.mcpServers ?? [] : enabledMcpServers.map((s16) => s16.id)
|
|
236068
|
+
);
|
|
236069
|
+
const [saving, setSaving] = reactExports.useState(false);
|
|
236070
|
+
reactExports.useEffect(() => {
|
|
236071
|
+
if (!open2) return;
|
|
236072
|
+
if (schedule2) {
|
|
236073
|
+
setName(schedule2.name);
|
|
236074
|
+
setAgentId(schedule2.agentId);
|
|
236075
|
+
setPrompt(schedule2.prompt);
|
|
236076
|
+
setCronType(schedule2.cron.type);
|
|
236077
|
+
setCronExpr(schedule2.cron.expr ?? "0 9 * * 1-5");
|
|
236078
|
+
setFeatures(schedule2.features ?? ["skills"]);
|
|
236079
|
+
setMcpServerIds(schedule2.mcpServers ?? []);
|
|
236080
|
+
} else {
|
|
236081
|
+
setName("");
|
|
236082
|
+
setAgentId(enabledAgents[0]?.id ?? "");
|
|
236083
|
+
setPrompt("");
|
|
236084
|
+
setCronType("cron");
|
|
236085
|
+
setCronExpr("0 9 * * 1-5");
|
|
236086
|
+
setFeatures(["skills"]);
|
|
236087
|
+
setMcpServerIds(enabledMcpServers.map((s16) => s16.id));
|
|
236088
|
+
}
|
|
236089
|
+
}, [schedule2, open2]);
|
|
236090
|
+
const handleSave = async () => {
|
|
236091
|
+
if (!name2.trim())
|
|
236092
|
+
return void toast2.error(t2("automation.validation.nameRequired", "Name is required"));
|
|
236093
|
+
if (!agentId)
|
|
236094
|
+
return void toast2.error(t2("automation.validation.agentRequired", "Agent is required"));
|
|
236095
|
+
if (!prompt.trim())
|
|
236096
|
+
return void toast2.error(t2("automation.validation.promptRequired", "Prompt is required"));
|
|
236097
|
+
setSaving(true);
|
|
236098
|
+
try {
|
|
236099
|
+
if (isEdit) {
|
|
236100
|
+
await request.updateSchedule({
|
|
236101
|
+
scheduleId: schedule2.id,
|
|
236102
|
+
updates: {
|
|
236103
|
+
name: name2.trim(),
|
|
236104
|
+
agentId,
|
|
236105
|
+
prompt: prompt.trim(),
|
|
236106
|
+
cron: { type: cronType, expr: cronType === "cron" ? cronExpr.trim() : void 0 },
|
|
236107
|
+
features,
|
|
236108
|
+
mcpServers: mcpServerIds
|
|
236109
|
+
}
|
|
236110
|
+
});
|
|
236111
|
+
} else {
|
|
236112
|
+
await request.createSchedule({
|
|
236113
|
+
name: name2.trim(),
|
|
236114
|
+
agentId,
|
|
236115
|
+
prompt: prompt.trim(),
|
|
236116
|
+
cron: { type: cronType, expr: cronType === "cron" ? cronExpr.trim() : void 0 },
|
|
236117
|
+
features,
|
|
236118
|
+
mcpServers: mcpServerIds
|
|
236119
|
+
});
|
|
236120
|
+
}
|
|
236121
|
+
onSuccess();
|
|
236122
|
+
onOpenChange(false);
|
|
236123
|
+
} catch (err) {
|
|
236124
|
+
toast2.error(String(err));
|
|
236125
|
+
} finally {
|
|
236126
|
+
setSaving(false);
|
|
236127
|
+
}
|
|
236128
|
+
};
|
|
236129
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236130
|
+
Dialog,
|
|
236131
|
+
{
|
|
236132
|
+
open: open2,
|
|
236133
|
+
onOpenChange: (open22, eventDetails) => {
|
|
236134
|
+
if (!open22 && (eventDetails?.reason === "escape-key" || eventDetails?.reason === "outside-press"))
|
|
236135
|
+
return;
|
|
236136
|
+
onOpenChange(open22);
|
|
236137
|
+
},
|
|
236138
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-3xl", children: [
|
|
236139
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
|
|
236140
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: isEdit ? t2("automation.editSchedule", "Edit Schedule") : t2("automation.newSchedule", "New Schedule") }),
|
|
236141
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: t2("automation.dialogDesc", "Configure the automated task schedule and prompt.") })
|
|
236142
|
+
] }),
|
|
236143
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-5", children: [
|
|
236144
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
|
|
236145
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-[2fr_1fr] gap-3", children: [
|
|
236146
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
|
|
236147
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "auto-name", className: "text-[11px] text-muted-foreground", children: t2("automation.scheduleName", "Schedule Name") }),
|
|
236148
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236149
|
+
Input,
|
|
236150
|
+
{
|
|
236151
|
+
id: "auto-name",
|
|
236152
|
+
placeholder: t2(
|
|
236153
|
+
"automation.scheduleNamePlaceholder",
|
|
236154
|
+
"e.g. Morning Standup Summary"
|
|
236155
|
+
),
|
|
236156
|
+
value: name2,
|
|
236157
|
+
onChange: (e2) => setName(e2.target.value),
|
|
236158
|
+
className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
|
|
236159
|
+
}
|
|
236160
|
+
)
|
|
236161
|
+
] }),
|
|
236162
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
|
|
236163
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "auto-agent", className: "text-[11px] text-muted-foreground", children: t2("automation.agent", "Agent") }),
|
|
236164
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236165
|
+
Select,
|
|
236166
|
+
{
|
|
236167
|
+
value: agentId,
|
|
236168
|
+
onValueChange: (v4) => {
|
|
236169
|
+
if (v4) setAgentId(v4);
|
|
236170
|
+
},
|
|
236171
|
+
children: [
|
|
236172
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236173
|
+
SelectTrigger,
|
|
236174
|
+
{
|
|
236175
|
+
id: "auto-agent",
|
|
236176
|
+
className: "w-full text-[11px]! text-muted-foreground",
|
|
236177
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {})
|
|
236178
|
+
}
|
|
236179
|
+
),
|
|
236180
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: enabledAgents.map((a2) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: a2.id, children: a2.id }, a2.id)) })
|
|
236181
|
+
]
|
|
236182
|
+
}
|
|
236183
|
+
)
|
|
236184
|
+
] })
|
|
236185
|
+
] }),
|
|
236186
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
|
|
236187
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "auto-prompt", className: "text-[11px] text-muted-foreground", children: t2("automation.prompt", "Prompt") }),
|
|
236188
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236189
|
+
Textarea,
|
|
236190
|
+
{
|
|
236191
|
+
id: "auto-prompt",
|
|
236192
|
+
placeholder: t2("automation.promptPlaceholder", "What should the agent do?"),
|
|
236193
|
+
value: prompt,
|
|
236194
|
+
onChange: (e2) => setPrompt(e2.target.value),
|
|
236195
|
+
className: "text-xs! min-h-46 flex-1 text-foreground/70 focus-visible:ring-0.5"
|
|
236196
|
+
}
|
|
236197
|
+
)
|
|
236198
|
+
] })
|
|
236199
|
+
] }),
|
|
236200
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
|
|
236201
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
236202
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: t2("automation.features", "Features") }),
|
|
236203
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
236204
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded border bg-secondary/50 px-2 h-7", children: [
|
|
236205
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236206
|
+
"div",
|
|
236207
|
+
{
|
|
236208
|
+
className: `text-xs truncate ${features.includes("skills") ? "text-muted-foreground" : "text-muted-foreground/50"}`,
|
|
236209
|
+
children: t2("constant.feature.skills", "Skills")
|
|
236210
|
+
}
|
|
236211
|
+
),
|
|
236212
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236213
|
+
Switch,
|
|
236214
|
+
{
|
|
236215
|
+
size: "sm",
|
|
236216
|
+
checked: features.includes("skills"),
|
|
236217
|
+
onCheckedChange: (c2) => setFeatures(c2 ? ["skills"] : [])
|
|
236218
|
+
}
|
|
236219
|
+
)
|
|
236220
|
+
] }),
|
|
236221
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded border bg-secondary/50 px-2 h-7", children: [
|
|
236222
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs truncate text-muted-foreground/50", children: [
|
|
236223
|
+
t2("constant.feature.askUser", "Ask User"),
|
|
236224
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-[10px] ml-1", children: [
|
|
236225
|
+
"(",
|
|
236226
|
+
t2("automation.alwaysDisabled", "always disabled"),
|
|
236227
|
+
")"
|
|
236228
|
+
] })
|
|
236229
|
+
] }),
|
|
236230
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { size: "sm", checked: false, disabled: true })
|
|
236231
|
+
] })
|
|
236232
|
+
] })
|
|
236233
|
+
] }),
|
|
236234
|
+
configuredMcpServers.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
236235
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: t2("automation.mcpServers", "MCP Servers") }),
|
|
236236
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236237
|
+
"div",
|
|
236238
|
+
{
|
|
236239
|
+
className: configuredMcpServers.length > 5 ? "grid grid-cols-2 gap-1" : "flex flex-col gap-1",
|
|
236240
|
+
children: configuredMcpServers.map((s16) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236241
|
+
"div",
|
|
236242
|
+
{
|
|
236243
|
+
className: "flex items-center justify-between rounded border bg-secondary/50 px-2 h-7",
|
|
236244
|
+
children: [
|
|
236245
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236246
|
+
"div",
|
|
236247
|
+
{
|
|
236248
|
+
className: `text-xs truncate ${mcpServerIds.includes(s16.id) ? "text-muted-foreground" : "text-muted-foreground/50"}`,
|
|
236249
|
+
title: s16.id,
|
|
236250
|
+
children: s16.id
|
|
236251
|
+
}
|
|
236252
|
+
),
|
|
236253
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236254
|
+
Switch,
|
|
236255
|
+
{
|
|
236256
|
+
size: "sm",
|
|
236257
|
+
checked: mcpServerIds.includes(s16.id),
|
|
236258
|
+
onCheckedChange: (c2) => {
|
|
236259
|
+
setMcpServerIds(
|
|
236260
|
+
(prev2) => c2 ? [...prev2, s16.id] : prev2.filter((id32) => id32 !== s16.id)
|
|
236261
|
+
);
|
|
236262
|
+
}
|
|
236263
|
+
}
|
|
236264
|
+
)
|
|
236265
|
+
]
|
|
236266
|
+
},
|
|
236267
|
+
s16.id
|
|
236268
|
+
))
|
|
236269
|
+
}
|
|
236270
|
+
)
|
|
236271
|
+
] }),
|
|
236272
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
|
|
236273
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { className: "text-[11px] text-muted-foreground", children: t2("automation.schedule", "Schedule") }),
|
|
236274
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
236275
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "flex items-center gap-2 text-[11px] text-foreground/70", children: [
|
|
236276
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236277
|
+
Switch,
|
|
236278
|
+
{
|
|
236279
|
+
checked: cronType === "cron",
|
|
236280
|
+
onCheckedChange: (c2) => setCronType(c2 ? "cron" : "manual")
|
|
236281
|
+
}
|
|
236282
|
+
),
|
|
236283
|
+
t2("automation.timedExecution", "Timed (cron)")
|
|
236284
|
+
] }),
|
|
236285
|
+
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.") })
|
|
236286
|
+
] })
|
|
236287
|
+
] })
|
|
236288
|
+
] })
|
|
236289
|
+
] }),
|
|
236290
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
|
|
236291
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236292
|
+
Button,
|
|
236293
|
+
{
|
|
236294
|
+
type: "button",
|
|
236295
|
+
variant: "outline",
|
|
236296
|
+
size: "sm",
|
|
236297
|
+
onClick: () => onOpenChange(false),
|
|
236298
|
+
className: "h-7 text-xs",
|
|
236299
|
+
children: t2("automation.cancel", "Cancel")
|
|
236300
|
+
}
|
|
236301
|
+
),
|
|
236302
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236303
|
+
Button,
|
|
236304
|
+
{
|
|
236305
|
+
type: "button",
|
|
236306
|
+
size: "sm",
|
|
236307
|
+
disabled: saving,
|
|
236308
|
+
onClick: handleSave,
|
|
236309
|
+
className: "h-7 text-xs",
|
|
236310
|
+
children: [
|
|
236311
|
+
saving && /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin mr-1" }),
|
|
236312
|
+
isEdit ? t2("automation.save", "Save") : t2("automation.create", "Create")
|
|
236313
|
+
]
|
|
236314
|
+
}
|
|
236315
|
+
)
|
|
236316
|
+
] })
|
|
236317
|
+
] })
|
|
236318
|
+
}
|
|
236319
|
+
);
|
|
236320
|
+
}
|
|
236321
|
+
function Automation() {
|
|
236322
|
+
const { t: t2, i18n } = useTranslation();
|
|
236323
|
+
const navigate = useNavigate();
|
|
236324
|
+
const { confirm: confirm2, toast: toast2 } = useMessage();
|
|
236325
|
+
const [schedules, setSchedules] = reactExports.useState([]);
|
|
236326
|
+
const [loading, setLoading] = reactExports.useState(true);
|
|
236327
|
+
const [newDialogOpen, setNewDialogOpen] = reactExports.useState(false);
|
|
236328
|
+
const [editSchedule, setEditSchedule] = reactExports.useState(null);
|
|
236329
|
+
const [timezone, setTimezone] = reactExports.useState("");
|
|
236330
|
+
reactExports.useEffect(() => {
|
|
236331
|
+
request.getServerTimezone().then(setTimezone).catch(() => {
|
|
236332
|
+
});
|
|
236333
|
+
}, []);
|
|
236334
|
+
const loadSchedules = reactExports.useCallback(async () => {
|
|
236335
|
+
try {
|
|
236336
|
+
const list2 = await request.listSchedules();
|
|
236337
|
+
setSchedules(list2 ?? []);
|
|
236338
|
+
} catch (err) {
|
|
236339
|
+
console.error("Failed to load schedules:", err);
|
|
236340
|
+
} finally {
|
|
236341
|
+
setLoading(false);
|
|
236342
|
+
}
|
|
236343
|
+
}, []);
|
|
236344
|
+
reactExports.useEffect(() => {
|
|
236345
|
+
void loadSchedules();
|
|
236346
|
+
}, [loadSchedules]);
|
|
236347
|
+
reactExports.useEffect(() => {
|
|
236348
|
+
const timer2 = setInterval(() => void loadSchedules(), 3e4);
|
|
236349
|
+
return () => clearInterval(timer2);
|
|
236350
|
+
}, [loadSchedules]);
|
|
236351
|
+
reactExports.useEffect(() => {
|
|
236352
|
+
const handleChanged = () => void loadSchedules();
|
|
236353
|
+
subscribe$1.on("schedules-changed", handleChanged);
|
|
236354
|
+
subscribe$1.on("task-update", handleChanged);
|
|
236355
|
+
return () => {
|
|
236356
|
+
subscribe$1.off("schedules-changed", handleChanged);
|
|
236357
|
+
subscribe$1.off("task-update", handleChanged);
|
|
236358
|
+
};
|
|
236359
|
+
}, [loadSchedules]);
|
|
236360
|
+
const handleTrigger = async (scheduleId) => {
|
|
236361
|
+
try {
|
|
236362
|
+
const task = await request.triggerSchedule({ scheduleId });
|
|
236363
|
+
navigate(`/automation/schedule/${scheduleId}/task/${task.id}`);
|
|
236364
|
+
} catch (err) {
|
|
236365
|
+
toast2.error(String(err));
|
|
236366
|
+
}
|
|
236367
|
+
};
|
|
236368
|
+
const handleDelete2 = async (schedule2) => {
|
|
236369
|
+
await confirm2({
|
|
236370
|
+
title: t2("automation.deleteTitle", "Delete Schedule"),
|
|
236371
|
+
content: t2("automation.deleteConfirm", 'Delete "{{name}}" permanently?', {
|
|
236372
|
+
name: schedule2.name
|
|
236373
|
+
}),
|
|
236374
|
+
buttons: [
|
|
236375
|
+
{ text: t2("automation.cancel", "Cancel"), value: null, variant: "outline" },
|
|
236376
|
+
{
|
|
236377
|
+
text: t2("automation.delete", "Delete"),
|
|
236378
|
+
value: async () => {
|
|
236379
|
+
await request.deleteSchedule({ scheduleId: schedule2.id });
|
|
236380
|
+
await loadSchedules();
|
|
236381
|
+
return "deleted";
|
|
236382
|
+
},
|
|
236383
|
+
variant: "destructive"
|
|
236384
|
+
}
|
|
236385
|
+
]
|
|
236386
|
+
});
|
|
236387
|
+
};
|
|
236388
|
+
const formatNextRun = (schedule2) => {
|
|
236389
|
+
if (!schedule2.nextRunAt) return "-";
|
|
236390
|
+
const diff = schedule2.nextRunAt - Date.now();
|
|
236391
|
+
if (diff <= 0) return t2("automation.anyMoment", "Any moment now");
|
|
236392
|
+
if (diff < 60 * 1e3) return t2("automation.lessThanMinute", "Less than 1 min");
|
|
236393
|
+
if (diff < 60 * 60 * 1e3) return `${Math.ceil(diff / 6e4)} min`;
|
|
236394
|
+
const hours = Math.floor(diff / 36e5);
|
|
236395
|
+
const mins = Math.ceil(diff % 36e5 / 6e4);
|
|
236396
|
+
return `${hours}h ${mins}m`;
|
|
236397
|
+
};
|
|
236398
|
+
const getScheduleLabel = (schedule2) => {
|
|
236399
|
+
if (schedule2.cron.type === "manual") return t2("automation.manual", "Manual");
|
|
236400
|
+
return schedule2.cron.expr ?? "-";
|
|
236401
|
+
};
|
|
236402
|
+
if (loading) {
|
|
236403
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
|
|
236404
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236405
|
+
"div",
|
|
236406
|
+
{
|
|
236407
|
+
className: "h-12 shrink-0 border-b border-border flex items-center px-6",
|
|
236408
|
+
style: { WebkitAppRegion: "drag" },
|
|
236409
|
+
children: [
|
|
236410
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: t2("automation.title", "Automation") }),
|
|
236411
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs text-muted-foreground font-normal ml-1.5", children: [
|
|
236412
|
+
"· schedules: ",
|
|
236413
|
+
schedules.length
|
|
236414
|
+
] })
|
|
236415
|
+
]
|
|
236416
|
+
}
|
|
236417
|
+
),
|
|
236418
|
+
/* @__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" }) })
|
|
236419
|
+
] });
|
|
236420
|
+
}
|
|
236421
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
|
|
236422
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236423
|
+
"div",
|
|
236424
|
+
{
|
|
236425
|
+
className: "h-12 shrink-0 border-b border-border flex items-center justify-between pl-4 pr-2",
|
|
236426
|
+
style: { WebkitAppRegion: "drag" },
|
|
236427
|
+
children: [
|
|
236428
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
236429
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: t2("automation.title", "Automation") }),
|
|
236430
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs text-muted-foreground font-normal", children: [
|
|
236431
|
+
"· ",
|
|
236432
|
+
t2("automation.schedules", "schedules"),
|
|
236433
|
+
": ",
|
|
236434
|
+
schedules.length
|
|
236435
|
+
] })
|
|
236436
|
+
] }),
|
|
236437
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { WebkitAppRegion: "no-drag" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236438
|
+
Button,
|
|
236439
|
+
{
|
|
236440
|
+
variant: "default",
|
|
236441
|
+
size: "sm",
|
|
236442
|
+
className: "h-7 text-xs",
|
|
236443
|
+
onClick: () => setNewDialogOpen(true),
|
|
236444
|
+
children: [
|
|
236445
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-3" }),
|
|
236446
|
+
t2("automation.newSchedule", "New Schedule")
|
|
236447
|
+
]
|
|
236448
|
+
}
|
|
236449
|
+
) })
|
|
236450
|
+
]
|
|
236451
|
+
}
|
|
236452
|
+
),
|
|
236453
|
+
/* @__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-20 text-muted-foreground", children: [
|
|
236454
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-12 rounded-full bg-muted flex items-center justify-center mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ClockCheck, { className: "size-6 text-muted-foreground/60" }) }),
|
|
236455
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-medium text-foreground/70 mb-1", children: t2("automation.noSchedules", "No schedules yet") }),
|
|
236456
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground/70 mb-4 max-w-[240px] text-center", children: t2(
|
|
236457
|
+
"automation.emptyHint",
|
|
236458
|
+
"Schedule AI tasks to run automatically with cron expressions"
|
|
236459
|
+
) }),
|
|
236460
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236461
|
+
Button,
|
|
236462
|
+
{
|
|
236463
|
+
variant: "outline",
|
|
236464
|
+
size: "sm",
|
|
236465
|
+
className: "h-7 text-xs",
|
|
236466
|
+
onClick: () => setNewDialogOpen(true),
|
|
236467
|
+
children: [
|
|
236468
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-3 mr-1" }),
|
|
236469
|
+
t2("automation.createFirst", "Create your first schedule")
|
|
236470
|
+
]
|
|
236471
|
+
}
|
|
236472
|
+
)
|
|
236473
|
+
] }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ItemGroup, { className: "gap-0", children: schedules.map((schedule2, index2) => /* @__PURE__ */ jsxRuntimeExports.jsxs(reactExports.Fragment, { children: [
|
|
236474
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
|
|
236475
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuTrigger, { className: "group/ctx", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236476
|
+
Item,
|
|
236477
|
+
{
|
|
236478
|
+
size: "sm",
|
|
236479
|
+
className: "hover:bg-muted group-data-[popup-open]/ctx:bg-muted select-none",
|
|
236480
|
+
onClick: () => navigate(`/automation/schedule/${schedule2.id}`),
|
|
236481
|
+
children: [
|
|
236482
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ItemContent, { className: "gap-1.5", children: [
|
|
236483
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ItemTitle, { className: "truncate", children: [
|
|
236484
|
+
schedule2.name,
|
|
236485
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236486
|
+
Badge,
|
|
236487
|
+
{
|
|
236488
|
+
variant: "outline",
|
|
236489
|
+
className: "px-1 text-[10px] leading-none uppercase shrink-0",
|
|
236490
|
+
children: schedule2.agentId
|
|
236491
|
+
}
|
|
236492
|
+
)
|
|
236493
|
+
] }),
|
|
236494
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ItemDescription, { className: "line-clamp-1 text-xs", children: [
|
|
236495
|
+
getScheduleLabel(schedule2),
|
|
236496
|
+
schedule2.lastRunAt && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
236497
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1.5", children: "·" }),
|
|
236498
|
+
t2("automation.cron.lastRun", "Last run"),
|
|
236499
|
+
":",
|
|
236500
|
+
" ",
|
|
236501
|
+
new Date(schedule2.lastRunAt).toLocaleString(i18n.language)
|
|
236502
|
+
] }),
|
|
236503
|
+
schedule2.nextRunAt && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
236504
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1.5", children: "·" }),
|
|
236505
|
+
t2("automation.cron.nextRun", "Next run"),
|
|
236506
|
+
":",
|
|
236507
|
+
" ",
|
|
236508
|
+
new Date(schedule2.nextRunAt).toLocaleString(i18n.language),
|
|
236509
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1.5", children: "·" }),
|
|
236510
|
+
t2("automation.cron.nextRunIn", "Next run in"),
|
|
236511
|
+
" ",
|
|
236512
|
+
formatNextRun(schedule2),
|
|
236513
|
+
timezone && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground/50 ml-0.5", children: [
|
|
236514
|
+
"(",
|
|
236515
|
+
timezone,
|
|
236516
|
+
")"
|
|
236517
|
+
] })
|
|
236518
|
+
] })
|
|
236519
|
+
] })
|
|
236520
|
+
] }),
|
|
236521
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ItemActions, { className: "gap-0.5", children: [
|
|
236522
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236523
|
+
Button,
|
|
236524
|
+
{
|
|
236525
|
+
variant: "ghost",
|
|
236526
|
+
size: "icon",
|
|
236527
|
+
className: "size-7 text-foreground/50 hover:text-foreground hover:bg-accent",
|
|
236528
|
+
onClick: (e2) => {
|
|
236529
|
+
e2.stopPropagation();
|
|
236530
|
+
void handleTrigger(schedule2.id);
|
|
236531
|
+
},
|
|
236532
|
+
title: t2("automation.triggerNow", "Trigger now"),
|
|
236533
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Play, { className: "size-3.5" })
|
|
236534
|
+
}
|
|
236535
|
+
),
|
|
236536
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236537
|
+
Button,
|
|
236538
|
+
{
|
|
236539
|
+
variant: "ghost",
|
|
236540
|
+
size: "icon",
|
|
236541
|
+
className: "size-7 text-foreground/50 hover:text-foreground hover:bg-accent",
|
|
236542
|
+
onClick: (e2) => {
|
|
236543
|
+
e2.stopPropagation();
|
|
236544
|
+
setEditSchedule(schedule2);
|
|
236545
|
+
},
|
|
236546
|
+
title: t2("automation.editSettings", "Edit settings"),
|
|
236547
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings2, { className: "size-3.5" })
|
|
236548
|
+
}
|
|
236549
|
+
),
|
|
236550
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236551
|
+
Button,
|
|
236552
|
+
{
|
|
236553
|
+
variant: "ghost",
|
|
236554
|
+
size: "icon",
|
|
236555
|
+
className: "size-7 text-destructive/50 hover:text-destructive hover:bg-destructive/10",
|
|
236556
|
+
onClick: (e2) => {
|
|
236557
|
+
e2.stopPropagation();
|
|
236558
|
+
void handleDelete2(schedule2);
|
|
236559
|
+
},
|
|
236560
|
+
title: t2("automation.delete", "Delete"),
|
|
236561
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5" })
|
|
236562
|
+
}
|
|
236563
|
+
)
|
|
236564
|
+
] })
|
|
236565
|
+
]
|
|
236566
|
+
}
|
|
236567
|
+
) }),
|
|
236568
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { children: [
|
|
236569
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => void handleTrigger(schedule2.id), children: [
|
|
236570
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Play, { className: "size-3.5 mr-2" }),
|
|
236571
|
+
t2("automation.triggerNow", "Trigger now")
|
|
236572
|
+
] }),
|
|
236573
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => setEditSchedule(schedule2), children: [
|
|
236574
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Settings2, { className: "size-3.5 mr-2" }),
|
|
236575
|
+
t2("automation.editSettings", "Edit settings")
|
|
236576
|
+
] }),
|
|
236577
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
236578
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236579
|
+
ContextMenuItem,
|
|
236580
|
+
{
|
|
236581
|
+
variant: "destructive",
|
|
236582
|
+
onClick: () => void handleDelete2(schedule2),
|
|
236583
|
+
children: [
|
|
236584
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5 mr-2" }),
|
|
236585
|
+
t2("automation.delete", "Delete")
|
|
236586
|
+
]
|
|
236587
|
+
}
|
|
236588
|
+
)
|
|
236589
|
+
] })
|
|
236590
|
+
] }),
|
|
236591
|
+
index2 < schedules.length - 1 && /* @__PURE__ */ jsxRuntimeExports.jsx(ItemSeparator, {})
|
|
236592
|
+
] }, schedule2.id)) }) }) }),
|
|
236593
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236594
|
+
SettingDialog,
|
|
236595
|
+
{
|
|
236596
|
+
open: newDialogOpen,
|
|
236597
|
+
onOpenChange: setNewDialogOpen,
|
|
236598
|
+
onSuccess: () => void loadSchedules()
|
|
236599
|
+
}
|
|
236600
|
+
),
|
|
236601
|
+
editSchedule && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236602
|
+
SettingDialog,
|
|
236603
|
+
{
|
|
236604
|
+
schedule: editSchedule,
|
|
236605
|
+
open: editSchedule !== null,
|
|
236606
|
+
onOpenChange: (open2) => {
|
|
236607
|
+
if (!open2) setEditSchedule(null);
|
|
236608
|
+
},
|
|
236609
|
+
onSuccess: () => void loadSchedules()
|
|
236610
|
+
}
|
|
236611
|
+
)
|
|
236612
|
+
] });
|
|
236613
|
+
}
|
|
236614
|
+
function Schedule() {
|
|
236615
|
+
const { scheduleId } = useParams();
|
|
236616
|
+
const { t: t2, i18n } = useTranslation();
|
|
236617
|
+
const navigate = useNavigate();
|
|
236618
|
+
const location2 = useLocation();
|
|
236619
|
+
const { confirm: confirm2 } = useMessage();
|
|
236620
|
+
const hasTaskRoute = location2.pathname.includes("/task/");
|
|
236621
|
+
const [schedule2, setSchedule] = reactExports.useState(null);
|
|
236622
|
+
const [tasks, setTasks] = reactExports.useState([]);
|
|
236623
|
+
const [loading, setLoading] = reactExports.useState(true);
|
|
236624
|
+
const [editDialogOpen, setEditDialogOpen] = reactExports.useState(false);
|
|
236625
|
+
const [timezone, setTimezone] = reactExports.useState("");
|
|
236626
|
+
reactExports.useEffect(() => {
|
|
236627
|
+
request.getServerTimezone().then(setTimezone).catch(() => {
|
|
236628
|
+
});
|
|
236629
|
+
}, []);
|
|
236630
|
+
const loadData = reactExports.useCallback(async () => {
|
|
236631
|
+
if (!scheduleId) return;
|
|
236632
|
+
try {
|
|
236633
|
+
const [scheduleData, tasksData] = await Promise.all([
|
|
236634
|
+
request.listSchedules().then((list2) => list2.find((s16) => s16.id === scheduleId)),
|
|
236635
|
+
request.getTasks({ scheduleId })
|
|
236636
|
+
]);
|
|
236637
|
+
setSchedule(scheduleData ?? null);
|
|
236638
|
+
setTasks(tasksData ?? []);
|
|
236639
|
+
} catch {
|
|
236640
|
+
} finally {
|
|
236641
|
+
setLoading(false);
|
|
236642
|
+
}
|
|
236643
|
+
}, [scheduleId]);
|
|
236644
|
+
reactExports.useEffect(() => {
|
|
236645
|
+
void loadData();
|
|
236646
|
+
}, [loadData]);
|
|
236647
|
+
reactExports.useEffect(() => {
|
|
236648
|
+
const h3 = () => void loadData();
|
|
236649
|
+
subscribe$1.on("schedules-changed", h3);
|
|
236650
|
+
return () => subscribe$1.off("schedules-changed", h3);
|
|
236651
|
+
}, [loadData]);
|
|
236652
|
+
reactExports.useEffect(() => {
|
|
236653
|
+
const h3 = (p3) => {
|
|
236654
|
+
if (p3.scheduleId === scheduleId) {
|
|
236655
|
+
setTasks((prev2) => {
|
|
236656
|
+
const idx = prev2.findIndex((t22) => t22.id === p3.task.id);
|
|
236657
|
+
if (idx >= 0) {
|
|
236658
|
+
const n2 = [...prev2];
|
|
236659
|
+
n2[idx] = p3.task;
|
|
236660
|
+
return n2;
|
|
236661
|
+
}
|
|
236662
|
+
return [p3.task, ...prev2];
|
|
236663
|
+
});
|
|
236664
|
+
}
|
|
236665
|
+
};
|
|
236666
|
+
subscribe$1.on("task-update", h3);
|
|
236667
|
+
return () => subscribe$1.off("task-update", h3);
|
|
236668
|
+
}, [scheduleId]);
|
|
236669
|
+
const handleTrigger = async () => {
|
|
236670
|
+
if (!scheduleId) return;
|
|
236671
|
+
try {
|
|
236672
|
+
await request.triggerSchedule({ scheduleId });
|
|
236673
|
+
} catch {
|
|
236674
|
+
}
|
|
236675
|
+
};
|
|
236676
|
+
const handleDeleteTask = async (task) => {
|
|
236677
|
+
if (!scheduleId) return;
|
|
236678
|
+
await confirm2({
|
|
236679
|
+
title: t2("automation.deleteTaskTitle", "Delete Task"),
|
|
236680
|
+
content: t2("automation.deleteTaskConfirm", "Delete this task permanently?"),
|
|
236681
|
+
buttons: [
|
|
236682
|
+
{ text: t2("automation.cancel", "Cancel"), value: null, variant: "outline" },
|
|
236683
|
+
{
|
|
236684
|
+
text: t2("automation.delete", "Delete"),
|
|
236685
|
+
value: async () => {
|
|
236686
|
+
await request.deleteTask({ scheduleId, taskId: task.id });
|
|
236687
|
+
setTasks((prev2) => prev2.filter((t22) => t22.id !== task.id));
|
|
236688
|
+
return "deleted";
|
|
236689
|
+
},
|
|
236690
|
+
variant: "destructive"
|
|
236691
|
+
}
|
|
236692
|
+
]
|
|
236693
|
+
});
|
|
236694
|
+
};
|
|
236695
|
+
const getTaskIcon = (task) => {
|
|
236696
|
+
switch (task.status) {
|
|
236697
|
+
case "running":
|
|
236698
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin text-blue-500" });
|
|
236699
|
+
case "success":
|
|
236700
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "size-3.5 text-green-500" });
|
|
236701
|
+
case "error":
|
|
236702
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleX, { className: "size-3.5 text-red-500" });
|
|
236703
|
+
}
|
|
236704
|
+
};
|
|
236705
|
+
if (loading) {
|
|
236706
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
|
|
236707
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236708
|
+
"div",
|
|
236709
|
+
{
|
|
236710
|
+
className: "h-12 shrink-0 border-b border-border flex items-center px-6",
|
|
236711
|
+
style: { WebkitAppRegion: "drag" },
|
|
236712
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: "—" })
|
|
236713
|
+
}
|
|
236714
|
+
),
|
|
236715
|
+
/* @__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" }) })
|
|
236716
|
+
] });
|
|
236717
|
+
}
|
|
236718
|
+
if (!schedule2) {
|
|
236719
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col items-center justify-center relative overflow-hidden gap-3", children: [
|
|
236720
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute left-0 top-0 right-0 h-12", style: { WebkitAppRegion: "drag" } }),
|
|
236721
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-normal text-muted-foreground", children: t2("automation.scheduleNotFound", "Schedule not found") }),
|
|
236722
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236723
|
+
Button,
|
|
236724
|
+
{
|
|
236725
|
+
variant: "outline",
|
|
236726
|
+
size: "sm",
|
|
236727
|
+
className: "h-7 text-xs",
|
|
236728
|
+
onClick: () => navigate("/automation"),
|
|
236729
|
+
children: [
|
|
236730
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "size-3" }),
|
|
236731
|
+
t2("automation.back", "Back")
|
|
236732
|
+
]
|
|
236733
|
+
}
|
|
236734
|
+
)
|
|
236735
|
+
] });
|
|
236736
|
+
}
|
|
236737
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
|
|
236738
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236739
|
+
"div",
|
|
236740
|
+
{
|
|
236741
|
+
className: "h-12 shrink-0 border-b border-border flex items-center gap-1 px-2",
|
|
236742
|
+
style: { WebkitAppRegion: "drag" },
|
|
236743
|
+
children: [
|
|
236744
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { WebkitAppRegion: "no-drag" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236745
|
+
Button,
|
|
236746
|
+
{
|
|
236747
|
+
variant: "ghost",
|
|
236748
|
+
size: "icon",
|
|
236749
|
+
className: "size-7 shrink-0",
|
|
236750
|
+
onClick: () => navigate("/automation"),
|
|
236751
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "size-3.5" })
|
|
236752
|
+
}
|
|
236753
|
+
) }),
|
|
236754
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
|
|
236755
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium truncate", children: schedule2.name }),
|
|
236756
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: "px-1 text-[10px] leading-none uppercase shrink-0", children: schedule2.agentId })
|
|
236757
|
+
] }),
|
|
236758
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs text-muted-foreground hidden sm:block shrink-0 mr-2", children: [
|
|
236759
|
+
schedule2.cron.type === "cron" ? schedule2.cron.expr : t2("automation.manual", "Manual"),
|
|
236760
|
+
schedule2.nextRunAt && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
236761
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1", children: "·" }),
|
|
236762
|
+
t2("automation.cron.nextRun", "Next"),
|
|
236763
|
+
":",
|
|
236764
|
+
" ",
|
|
236765
|
+
new Date(schedule2.nextRunAt).toLocaleString(i18n.language),
|
|
236766
|
+
timezone && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground/50 ml-0.5", children: [
|
|
236767
|
+
"(",
|
|
236768
|
+
timezone,
|
|
236769
|
+
")"
|
|
236770
|
+
] })
|
|
236771
|
+
] })
|
|
236772
|
+
] }),
|
|
236773
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", style: { WebkitAppRegion: "no-drag" }, children: [
|
|
236774
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236775
|
+
Button,
|
|
236776
|
+
{
|
|
236777
|
+
variant: "ghost",
|
|
236778
|
+
size: "icon",
|
|
236779
|
+
className: "size-7",
|
|
236780
|
+
onClick: () => setEditDialogOpen(true),
|
|
236781
|
+
title: t2("automation.editSettings", "Edit settings"),
|
|
236782
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings2, { className: "size-3.5" })
|
|
236783
|
+
}
|
|
236784
|
+
),
|
|
236785
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236786
|
+
Button,
|
|
236787
|
+
{
|
|
236788
|
+
variant: "default",
|
|
236789
|
+
size: "sm",
|
|
236790
|
+
className: "h-7 text-xs shrink-0",
|
|
236791
|
+
onClick: handleTrigger,
|
|
236792
|
+
children: [
|
|
236793
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Play, { className: "size-3 mr-1" }),
|
|
236794
|
+
t2("automation.triggerNow", "Trigger now")
|
|
236795
|
+
]
|
|
236796
|
+
}
|
|
236797
|
+
)
|
|
236798
|
+
] })
|
|
236799
|
+
]
|
|
236800
|
+
}
|
|
236801
|
+
),
|
|
236802
|
+
tasks.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-1 flex-col items-center justify-center text-center px-6", children: [
|
|
236803
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-12 rounded-full bg-muted flex items-center justify-center mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Play, { className: "size-6 text-muted-foreground/60" }) }),
|
|
236804
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t2(
|
|
236805
|
+
"automation.noTasksDesc",
|
|
236806
|
+
'No runs yet. Click "Trigger now" to start the first run.'
|
|
236807
|
+
) })
|
|
236808
|
+
] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(ResizablePanelGroup, { className: "flex-1 min-h-0", children: [
|
|
236809
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236810
|
+
ResizablePanel,
|
|
236811
|
+
{
|
|
236812
|
+
id: "taskList",
|
|
236813
|
+
groupResizeBehavior: "preserve-pixel-size",
|
|
236814
|
+
defaultSize: 200,
|
|
236815
|
+
minSize: 180,
|
|
236816
|
+
maxSize: 400,
|
|
236817
|
+
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) => {
|
|
236818
|
+
const isActive = location2.pathname.endsWith(`/task/${task.id}`);
|
|
236819
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
|
|
236820
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236821
|
+
ContextMenuTrigger,
|
|
236822
|
+
{
|
|
236823
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
|
|
236824
|
+
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"}`,
|
|
236825
|
+
onClick: () => navigate(`/automation/schedule/${scheduleId}/task/${task.id}`),
|
|
236826
|
+
children: [
|
|
236827
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-baseline gap-2", children: [
|
|
236828
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "truncate", children: new Date(task.startedAt).toLocaleDateString(i18n.language) }),
|
|
236829
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground truncate text-[11px]", children: new Date(task.startedAt).toLocaleTimeString(i18n.language) })
|
|
236830
|
+
] }),
|
|
236831
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0 ml-2", children: getTaskIcon(task) })
|
|
236832
|
+
]
|
|
236833
|
+
}
|
|
236834
|
+
),
|
|
236835
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
236836
|
+
ContextMenuItem,
|
|
236837
|
+
{
|
|
236838
|
+
variant: "destructive",
|
|
236839
|
+
disabled: task.status === "running",
|
|
236840
|
+
onClick: () => void handleDeleteTask(task),
|
|
236841
|
+
children: [
|
|
236842
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5 mr-2" }),
|
|
236843
|
+
t2("automation.delete", "Delete")
|
|
236844
|
+
]
|
|
236845
|
+
}
|
|
236846
|
+
) })
|
|
236847
|
+
] }, task.id);
|
|
236848
|
+
}) }) }) })
|
|
236849
|
+
}
|
|
236850
|
+
),
|
|
236851
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizableHandle, { className: "bg-border/70" }),
|
|
236852
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "right", children: hasTaskRoute ? /* @__PURE__ */ jsxRuntimeExports.jsx(Outlet, {}) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center h-full text-center px-6", children: [
|
|
236853
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-12 rounded-full bg-muted flex items-center justify-center mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-6 text-muted-foreground/60" }) }),
|
|
236854
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t2("automation.selectTaskToPreview", "Select a task to preview files") })
|
|
236855
|
+
] }) })
|
|
236856
|
+
] }),
|
|
236857
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236858
|
+
SettingDialog,
|
|
236859
|
+
{
|
|
236860
|
+
schedule: schedule2,
|
|
236861
|
+
open: editDialogOpen,
|
|
236862
|
+
onOpenChange: setEditDialogOpen,
|
|
236863
|
+
onSuccess: () => void loadData()
|
|
236864
|
+
}
|
|
236865
|
+
)
|
|
236866
|
+
] });
|
|
236867
|
+
}
|
|
236868
|
+
const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "gif", "webp", "avif", "bmp", "svg", "ico"];
|
|
236869
|
+
const FILE_EXT_MAP = {
|
|
236870
|
+
pdf: "pdf",
|
|
236871
|
+
docx: "docx",
|
|
236872
|
+
pptx: "pptx",
|
|
236873
|
+
xlsx: "xlsx",
|
|
236874
|
+
xls: "xlsx",
|
|
236875
|
+
html: "html",
|
|
236876
|
+
htm: "html"
|
|
236877
|
+
};
|
|
236878
|
+
function getFileKind(filename) {
|
|
236879
|
+
if (!filename) return null;
|
|
236880
|
+
const ext = filename.split(".").pop()?.toLowerCase() || "";
|
|
236881
|
+
if (IMAGE_EXTENSIONS.includes(ext)) return "image";
|
|
236882
|
+
if (ext in FILE_EXT_MAP) return FILE_EXT_MAP[ext];
|
|
236883
|
+
if (ext === "md") return "markdown";
|
|
236884
|
+
return "text";
|
|
236885
|
+
}
|
|
236886
|
+
function CodeDetail({ fileName, content: content2 }) {
|
|
236887
|
+
const displayContent = reactExports.useMemo(() => {
|
|
236888
|
+
if (fileName.endsWith(".json")) {
|
|
236889
|
+
try {
|
|
236890
|
+
return JSON.stringify(JSON.parse(content2), null, 2);
|
|
236891
|
+
} catch {
|
|
236892
|
+
return content2;
|
|
236893
|
+
}
|
|
236894
|
+
}
|
|
236895
|
+
return content2;
|
|
236896
|
+
}, [fileName, content2]);
|
|
236897
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(CodeView, { className: "min-h-full", content: displayContent, filename: fileName }) });
|
|
236898
|
+
}
|
|
236899
|
+
function MarkdownDetail({ fileName, content: content2 }) {
|
|
236900
|
+
const { t: t2 } = useTranslation();
|
|
236901
|
+
const [viewMode, setViewMode] = reactExports.useState("preview");
|
|
236902
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative h-full overflow-hidden", children: [
|
|
236903
|
+
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 }) }),
|
|
236904
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute bottom-4 left-0 right-0 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236905
|
+
Tabs,
|
|
236906
|
+
{
|
|
236907
|
+
value: viewMode,
|
|
236908
|
+
onValueChange: (v4) => setViewMode(v4),
|
|
236909
|
+
className: "pointer-events-auto",
|
|
236910
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(TabsList, { className: "h-8 border border-border shadow-lg", children: [
|
|
236911
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "preview", className: "text-xs min-w-18", children: t2("fileDetail.preview", "Preview") }),
|
|
236912
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "code", className: "text-xs min-w-18", children: t2("fileDetail.code", "Code") })
|
|
236913
|
+
] })
|
|
236914
|
+
}
|
|
236915
|
+
) })
|
|
236916
|
+
] });
|
|
236917
|
+
}
|
|
236918
|
+
function ImageDetail({ fileName }) {
|
|
236919
|
+
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: [
|
|
236920
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "size-8" }),
|
|
236921
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236922
|
+
] }) });
|
|
236923
|
+
}
|
|
236924
|
+
function PdfDetail({ fileName }) {
|
|
236925
|
+
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: [
|
|
236926
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
|
|
236927
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236928
|
+
] }) });
|
|
236929
|
+
}
|
|
236930
|
+
function DocxDetail({ fileName }) {
|
|
236931
|
+
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: [
|
|
236932
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
|
|
236933
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236934
|
+
] }) });
|
|
236935
|
+
}
|
|
236936
|
+
function PptxDetail({ fileName }) {
|
|
236937
|
+
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: [
|
|
236938
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
|
|
236939
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236940
|
+
] }) });
|
|
236941
|
+
}
|
|
236942
|
+
function XlsxDetail({ fileName }) {
|
|
236943
|
+
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: [
|
|
236944
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
|
|
236945
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
|
|
236946
|
+
] }) });
|
|
236947
|
+
}
|
|
236948
|
+
function HtmlDetail({ content: content2 }) {
|
|
236949
|
+
const srcDoc = reactExports.useMemo(() => {
|
|
236950
|
+
if (content2.trim().startsWith("<") && !content2.toLowerCase().includes("<!doctype") && !content2.toLowerCase().includes("<html")) {
|
|
236951
|
+
return `<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>${content2}</body></html>`;
|
|
236952
|
+
}
|
|
236953
|
+
return content2;
|
|
236954
|
+
}, [content2]);
|
|
236955
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
236956
|
+
"iframe",
|
|
236957
|
+
{
|
|
236958
|
+
srcDoc,
|
|
236959
|
+
className: "w-full h-full border-0 bg-white",
|
|
236960
|
+
title: "HTML Preview",
|
|
236961
|
+
sandbox: "allow-scripts"
|
|
236962
|
+
}
|
|
236963
|
+
);
|
|
236964
|
+
}
|
|
236965
|
+
function isBinaryContent(content2) {
|
|
236966
|
+
const len = Math.min(content2.length, 512);
|
|
236967
|
+
let nullCount = 0;
|
|
236968
|
+
let nonPrintableCount = 0;
|
|
236969
|
+
for (let i3 = 0; i3 < len; i3++) {
|
|
236970
|
+
const code2 = content2.charCodeAt(i3);
|
|
236971
|
+
if (code2 === 0) nullCount++;
|
|
236972
|
+
else if (code2 < 8 || code2 > 13 && code2 < 32) nonPrintableCount++;
|
|
236973
|
+
}
|
|
236974
|
+
return nullCount > 0 || nonPrintableCount > len * 0.3;
|
|
236975
|
+
}
|
|
236976
|
+
function FileDetail({
|
|
236977
|
+
fileName,
|
|
236978
|
+
fileContent,
|
|
236979
|
+
fileLoading,
|
|
236980
|
+
hasTask,
|
|
236981
|
+
hasFiles
|
|
236982
|
+
}) {
|
|
236983
|
+
const { t: t2 } = useTranslation();
|
|
236984
|
+
const fileKind = reactExports.useMemo(() => getFileKind(fileName), [fileName]);
|
|
236985
|
+
const isUnsupportedBinary = reactExports.useMemo(() => {
|
|
236986
|
+
if (!fileContent || !fileName) return false;
|
|
236987
|
+
if (fileKind === "image" || fileKind === "pdf" || fileKind === "docx" || fileKind === "pptx" || fileKind === "xlsx")
|
|
236988
|
+
return false;
|
|
236989
|
+
return isBinaryContent(fileContent);
|
|
236990
|
+
}, [fileContent, fileName, fileKind]);
|
|
236991
|
+
if (!hasTask) {
|
|
236992
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center h-full text-muted-foreground", children: [
|
|
236993
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-12 rounded-full bg-muted flex items-center justify-center mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-6 text-muted-foreground/60" }) }),
|
|
236994
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs", children: t2("automation.selectTaskToPreview", "Select a task to preview files") })
|
|
236995
|
+
] });
|
|
236996
|
+
}
|
|
236997
|
+
if (!hasFiles) {
|
|
236998
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center h-full text-muted-foreground", children: [
|
|
236999
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-12 rounded-full bg-muted flex items-center justify-center mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-6 text-muted-foreground/60" }) }),
|
|
237000
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs", children: t2("automation.noFiles", "No files generated") })
|
|
237001
|
+
] });
|
|
237002
|
+
}
|
|
237003
|
+
if (!fileName) {
|
|
237004
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center h-full text-muted-foreground", children: [
|
|
237005
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-12 rounded-full bg-muted flex items-center justify-center mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-6 text-muted-foreground/60" }) }),
|
|
237006
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs", children: t2("automation.selectFileToPreview", "Select a file to preview") })
|
|
237007
|
+
] });
|
|
237008
|
+
}
|
|
237009
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col w-full h-full min-w-0 relative overflow-hidden", children: [
|
|
237010
|
+
/* @__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: [
|
|
237011
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { name: fileName, className: "size-4 shrink-0 text-muted-foreground/80" }),
|
|
237012
|
+
/* @__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 }) })
|
|
237013
|
+
] }) }) }),
|
|
237014
|
+
/* @__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 ?? "" }) })
|
|
237015
|
+
] });
|
|
237016
|
+
}
|
|
237017
|
+
function buildTree2(paths) {
|
|
237018
|
+
const root2 = [];
|
|
237019
|
+
for (const fullPath of paths) {
|
|
237020
|
+
const parts = fullPath.split("/");
|
|
237021
|
+
let current = root2;
|
|
237022
|
+
for (let i3 = 0; i3 < parts.length; i3++) {
|
|
237023
|
+
const part = parts[i3];
|
|
237024
|
+
const isLast = i3 === parts.length - 1;
|
|
237025
|
+
const nodePath = parts.slice(0, i3 + 1).join("/");
|
|
237026
|
+
let existing = current.find((n2) => n2.name === part);
|
|
237027
|
+
if (!existing) {
|
|
237028
|
+
existing = {
|
|
237029
|
+
name: part,
|
|
237030
|
+
path: nodePath,
|
|
237031
|
+
isFolder: !isLast,
|
|
237032
|
+
children: !isLast ? [] : void 0
|
|
237033
|
+
};
|
|
237034
|
+
current.push(existing);
|
|
237035
|
+
}
|
|
237036
|
+
if (existing.children) current = existing.children;
|
|
237037
|
+
}
|
|
237038
|
+
}
|
|
237039
|
+
function sortNodes(nodes) {
|
|
237040
|
+
nodes.sort((a2, b2) => {
|
|
237041
|
+
if (a2.isFolder !== b2.isFolder) return a2.isFolder ? -1 : 1;
|
|
237042
|
+
return a2.name.localeCompare(b2.name);
|
|
237043
|
+
});
|
|
237044
|
+
for (const n2 of nodes) {
|
|
237045
|
+
if (n2.children) sortNodes(n2.children);
|
|
237046
|
+
}
|
|
237047
|
+
return nodes;
|
|
237048
|
+
}
|
|
237049
|
+
return sortNodes(root2);
|
|
237050
|
+
}
|
|
237051
|
+
function FileTree({
|
|
237052
|
+
nodes,
|
|
237053
|
+
depth,
|
|
237054
|
+
selectedFile,
|
|
237055
|
+
onSelectFile,
|
|
237056
|
+
openFolders,
|
|
237057
|
+
toggleFolder,
|
|
237058
|
+
onCopyRelativePath,
|
|
237059
|
+
onCopyAbsolutePath,
|
|
237060
|
+
onRevealInFinder
|
|
237061
|
+
}) {
|
|
237062
|
+
const { t: t2 } = useTranslation();
|
|
237063
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: nodes.map((node2) => {
|
|
237064
|
+
if (node2.isFolder) {
|
|
237065
|
+
const isOpen = openFolders.has(node2.path);
|
|
237066
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
|
|
237067
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
237068
|
+
"div",
|
|
237069
|
+
{
|
|
237070
|
+
className: cn$5(
|
|
237071
|
+
"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"
|
|
237072
|
+
),
|
|
237073
|
+
style: { paddingLeft: `${depth * 16 + 6}px` },
|
|
237074
|
+
onClick: () => toggleFolder(node2.path),
|
|
237075
|
+
children: [
|
|
237076
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
237077
|
+
ChevronRight,
|
|
237078
|
+
{
|
|
237079
|
+
className: cn$5(
|
|
237080
|
+
"size-3.5 shrink-0 text-muted-foreground transition-transform scale-110",
|
|
237081
|
+
isOpen && "rotate-90"
|
|
237082
|
+
)
|
|
237083
|
+
}
|
|
237084
|
+
),
|
|
237085
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal", children: node2.name })
|
|
237086
|
+
]
|
|
237087
|
+
}
|
|
237088
|
+
),
|
|
237089
|
+
isOpen && node2.children && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
237090
|
+
FileTree,
|
|
237091
|
+
{
|
|
237092
|
+
nodes: node2.children,
|
|
237093
|
+
depth: depth + 1,
|
|
237094
|
+
selectedFile,
|
|
237095
|
+
onSelectFile,
|
|
237096
|
+
openFolders,
|
|
237097
|
+
toggleFolder,
|
|
237098
|
+
onCopyRelativePath,
|
|
237099
|
+
onCopyAbsolutePath,
|
|
237100
|
+
onRevealInFinder
|
|
237101
|
+
}
|
|
237102
|
+
)
|
|
237103
|
+
] }, node2.path);
|
|
237104
|
+
}
|
|
237105
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
|
|
237106
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
237107
|
+
ContextMenuTrigger,
|
|
237108
|
+
{
|
|
237109
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
|
|
237110
|
+
className: cn$5(
|
|
237111
|
+
"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",
|
|
237112
|
+
selectedFile === node2.path && "text-foreground bg-primary/6"
|
|
237113
|
+
),
|
|
237114
|
+
style: { paddingLeft: `${depth * 16 + 6}px` },
|
|
237115
|
+
onClick: () => onSelectFile(node2.path),
|
|
237116
|
+
children: [
|
|
237117
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { name: node2.name, className: "size-3.5 shrink-0 text-muted-foreground/90" }),
|
|
237118
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal", children: node2.name })
|
|
237119
|
+
]
|
|
237120
|
+
}
|
|
237121
|
+
),
|
|
237122
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { children: [
|
|
237123
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onCopyRelativePath(node2.path), children: [
|
|
237124
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3.5 mr-2" }),
|
|
237125
|
+
t2("filePanel.copyPath", "Copy Path")
|
|
237126
|
+
] }),
|
|
237127
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onCopyAbsolutePath(node2.path), children: [
|
|
237128
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3.5 mr-2" }),
|
|
237129
|
+
t2("filePanel.copyAbsolutePath", "Copy Absolute Path")
|
|
237130
|
+
] }),
|
|
237131
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
237132
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onRevealInFinder(node2.path), children: [
|
|
237133
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3.5 mr-2" }),
|
|
237134
|
+
t2("filePanel.revealInFinder", "Reveal in Finder")
|
|
237135
|
+
] })
|
|
237136
|
+
] })
|
|
237137
|
+
] }, node2.path);
|
|
237138
|
+
}) });
|
|
237139
|
+
}
|
|
237140
|
+
function Panel({
|
|
237141
|
+
files,
|
|
237142
|
+
selectedFile,
|
|
237143
|
+
hasTask,
|
|
237144
|
+
onSelectFile,
|
|
237145
|
+
onCopyRelativePath,
|
|
237146
|
+
onCopyAbsolutePath,
|
|
237147
|
+
onRevealInFinder
|
|
237148
|
+
}) {
|
|
237149
|
+
const { t: t2 } = useTranslation();
|
|
237150
|
+
const [openFolders, setOpenFolders] = reactExports.useState(/* @__PURE__ */ new Set());
|
|
237151
|
+
const tree = reactExports.useMemo(() => buildTree2(files), [files]);
|
|
237152
|
+
reactExports.useEffect(() => {
|
|
237153
|
+
const allFolders = /* @__PURE__ */ new Set();
|
|
237154
|
+
for (const f2 of files) {
|
|
237155
|
+
const parts = f2.split("/");
|
|
237156
|
+
for (let i3 = 1; i3 < parts.length; i3++) {
|
|
237157
|
+
allFolders.add(parts.slice(0, i3).join("/"));
|
|
237158
|
+
}
|
|
237159
|
+
}
|
|
237160
|
+
setOpenFolders(allFolders);
|
|
237161
|
+
}, [files]);
|
|
237162
|
+
const toggleFolder = (path2) => {
|
|
237163
|
+
setOpenFolders((prev2) => {
|
|
237164
|
+
const next2 = new Set(prev2);
|
|
237165
|
+
if (next2.has(path2)) next2.delete(path2);
|
|
237166
|
+
else next2.add(path2);
|
|
237167
|
+
return next2;
|
|
237168
|
+
});
|
|
237169
|
+
};
|
|
237170
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full min-h-0 flex-col text-xs w-full", children: [
|
|
237171
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-10 items-center gap-0.5 border-b border-border", children: [
|
|
237172
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex text-muted-foreground items-center gap-1 px-3", children: [
|
|
237173
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Folders, { className: "size-4" }),
|
|
237174
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-medium text-nowrap", children: t2("automation.files", "Files") })
|
|
237175
|
+
] }),
|
|
237176
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-auto mr-2 flex items-center gap-0.5", children: tree.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
237177
|
+
"button",
|
|
237178
|
+
{
|
|
237179
|
+
className: "flex size-6 items-center justify-center text-muted-foreground hover:text-foreground rounded",
|
|
237180
|
+
onClick: () => setOpenFolders(/* @__PURE__ */ new Set()),
|
|
237181
|
+
title: t2("filePanel.collapseFolders", "Collapse folders"),
|
|
237182
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronsDownUp, { className: "size-3.5" })
|
|
237183
|
+
}
|
|
237184
|
+
) })
|
|
237185
|
+
] }),
|
|
237186
|
+
!hasTask ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center flex-1 min-h-0 -mt-10 text-muted-foreground", children: [
|
|
237187
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-10 rounded-full bg-muted flex items-center justify-center mb-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Folder$1, { className: "size-5 text-muted-foreground/60" }) }),
|
|
237188
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs", children: t2("automation.selectTask", "Select a task") })
|
|
237189
|
+
] }) : files.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center flex-1 min-h-0 -mt-10 text-muted-foreground", children: [
|
|
237190
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-10 rounded-full bg-muted flex items-center justify-center mb-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-5 text-muted-foreground/60" }) }),
|
|
237191
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs", children: t2("automation.noFiles", "No files") })
|
|
237192
|
+
] }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1 pl-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "py-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
237193
|
+
FileTree,
|
|
237194
|
+
{
|
|
237195
|
+
nodes: tree,
|
|
237196
|
+
depth: 0,
|
|
237197
|
+
selectedFile,
|
|
237198
|
+
onSelectFile,
|
|
237199
|
+
openFolders,
|
|
237200
|
+
toggleFolder,
|
|
237201
|
+
onCopyRelativePath,
|
|
237202
|
+
onCopyAbsolutePath,
|
|
237203
|
+
onRevealInFinder
|
|
237204
|
+
}
|
|
237205
|
+
) }) })
|
|
237206
|
+
] });
|
|
237207
|
+
}
|
|
237208
|
+
function Task() {
|
|
237209
|
+
const { scheduleId, taskId } = useParams();
|
|
237210
|
+
const { t: t2 } = useTranslation();
|
|
237211
|
+
const [taskFiles, setTaskFiles] = reactExports.useState([]);
|
|
237212
|
+
const [selectedFile, setSelectedFile] = reactExports.useState(null);
|
|
237213
|
+
const [fileContent, setFileContent] = reactExports.useState(null);
|
|
237214
|
+
const [fileLoading, setFileLoading] = reactExports.useState(false);
|
|
237215
|
+
const [loading, setLoading] = reactExports.useState(true);
|
|
237216
|
+
const loadFiles = reactExports.useCallback(async () => {
|
|
237217
|
+
if (!scheduleId || !taskId) return;
|
|
237218
|
+
try {
|
|
237219
|
+
const files = await request.getTaskFiles({ scheduleId, taskId });
|
|
237220
|
+
setTaskFiles(files ?? []);
|
|
237221
|
+
const readme = (files ?? []).find((f2) => f2.toLowerCase() === "readme.md");
|
|
237222
|
+
setSelectedFile(readme ?? null);
|
|
237223
|
+
setFileContent(null);
|
|
237224
|
+
} catch {
|
|
237225
|
+
setTaskFiles([]);
|
|
237226
|
+
} finally {
|
|
237227
|
+
setLoading(false);
|
|
237228
|
+
}
|
|
237229
|
+
}, [scheduleId, taskId]);
|
|
237230
|
+
reactExports.useEffect(() => {
|
|
237231
|
+
setLoading(true);
|
|
237232
|
+
void loadFiles();
|
|
237233
|
+
}, [loadFiles]);
|
|
237234
|
+
reactExports.useEffect(() => {
|
|
237235
|
+
const handler = (payload) => {
|
|
237236
|
+
if (payload.scheduleId === scheduleId && payload.task?.id === taskId && payload.task.status !== "running") {
|
|
237237
|
+
void loadFiles();
|
|
237238
|
+
}
|
|
237239
|
+
};
|
|
237240
|
+
subscribe$1.on("task-update", handler);
|
|
237241
|
+
return () => subscribe$1.off("task-update", handler);
|
|
237242
|
+
}, [scheduleId, taskId, loadFiles]);
|
|
237243
|
+
reactExports.useEffect(() => {
|
|
237244
|
+
if (!selectedFile || !scheduleId || !taskId) {
|
|
237245
|
+
setFileContent(null);
|
|
237246
|
+
return;
|
|
237247
|
+
}
|
|
237248
|
+
setFileLoading(true);
|
|
237249
|
+
(async () => {
|
|
237250
|
+
try {
|
|
237251
|
+
const content2 = await request.readTaskFile({ scheduleId, taskId, filePath: selectedFile });
|
|
237252
|
+
setFileContent(content2 ?? null);
|
|
237253
|
+
} catch {
|
|
237254
|
+
setFileContent("// Error loading file");
|
|
237255
|
+
} finally {
|
|
237256
|
+
setFileLoading(false);
|
|
237257
|
+
}
|
|
237258
|
+
})();
|
|
237259
|
+
}, [selectedFile, scheduleId, taskId]);
|
|
237260
|
+
if (loading) {
|
|
237261
|
+
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" }) });
|
|
237262
|
+
}
|
|
237263
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(ResizablePanelGroup, { className: "h-full", children: [
|
|
237264
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "fileDetail", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
237265
|
+
FileDetail,
|
|
237266
|
+
{
|
|
237267
|
+
fileName: selectedFile,
|
|
237268
|
+
fileContent,
|
|
237269
|
+
fileLoading,
|
|
237270
|
+
hasTask: true,
|
|
237271
|
+
hasFiles: taskFiles.length > 0
|
|
237272
|
+
}
|
|
237273
|
+
) }),
|
|
237274
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ResizableHandle, { className: "bg-border/70" }),
|
|
237275
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
237276
|
+
ResizablePanel,
|
|
237277
|
+
{
|
|
237278
|
+
id: "filePanel",
|
|
237279
|
+
groupResizeBehavior: "preserve-pixel-size",
|
|
237280
|
+
defaultSize: 250,
|
|
237281
|
+
minSize: 250,
|
|
237282
|
+
maxSize: 400,
|
|
237283
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
237284
|
+
Panel,
|
|
237285
|
+
{
|
|
237286
|
+
files: taskFiles,
|
|
237287
|
+
selectedFile,
|
|
237288
|
+
hasTask: true,
|
|
237289
|
+
onSelectFile: setSelectedFile,
|
|
237290
|
+
onCopyRelativePath: async (file) => {
|
|
237291
|
+
try {
|
|
237292
|
+
await copyText(file);
|
|
237293
|
+
} catch {
|
|
237294
|
+
}
|
|
237295
|
+
},
|
|
237296
|
+
onCopyAbsolutePath: async (file) => {
|
|
237297
|
+
try {
|
|
237298
|
+
const abs2 = await request.getTaskFileSystemPath({
|
|
237299
|
+
scheduleId,
|
|
237300
|
+
taskId,
|
|
237301
|
+
filePath: file
|
|
237302
|
+
});
|
|
237303
|
+
await copyText(abs2);
|
|
237304
|
+
} catch {
|
|
237305
|
+
}
|
|
237306
|
+
},
|
|
237307
|
+
onRevealInFinder: async (file) => {
|
|
237308
|
+
if (isWebUI) return;
|
|
237309
|
+
try {
|
|
237310
|
+
const abs2 = await request.getTaskFileSystemPath({
|
|
237311
|
+
scheduleId,
|
|
237312
|
+
taskId,
|
|
237313
|
+
filePath: file
|
|
237314
|
+
});
|
|
237315
|
+
await electron.revealInFinder(abs2);
|
|
237316
|
+
} catch {
|
|
237317
|
+
}
|
|
237318
|
+
}
|
|
237319
|
+
}
|
|
237320
|
+
)
|
|
237321
|
+
}
|
|
237322
|
+
)
|
|
237323
|
+
] });
|
|
237324
|
+
}
|
|
235686
237325
|
function SessionWrapper() {
|
|
235687
237326
|
const { sessionId } = useParams();
|
|
235688
237327
|
const sessionInfo = useAppStore((s16) => s16.sessions.find((x2) => x2.id === sessionId));
|
|
@@ -235715,7 +237354,9 @@ function AppRouter() {
|
|
|
235715
237354
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(Route, { path: "/skills", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsLayout, {}), children: [
|
|
235716
237355
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "installed", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsInstalled, {}) }),
|
|
235717
237356
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "skills-sh", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsSh, {}) })
|
|
235718
|
-
] })
|
|
237357
|
+
] }),
|
|
237358
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/automation", element: /* @__PURE__ */ jsxRuntimeExports.jsx(Automation, {}) }),
|
|
237359
|
+
/* @__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
237360
|
] })
|
|
235720
237361
|
] });
|
|
235721
237362
|
}
|