wind-agent-cli 1.37.3 → 1.38.0
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 +16 -1
- package/dist/api-docs.html +2 -2
- package/dist/assets/{CodeEditor-BqmxpZ_D.js → CodeEditor-FvgsnJ7J.js} +6 -6
- package/dist/assets/FileTree-NLULrBDi.js +1 -0
- package/dist/assets/GitPanel-51KUBbEW.js +4 -0
- package/dist/assets/{MarkdownPreview-93h_1tJa.js → MarkdownPreview-PEEWVWeS.js} +17 -27
- package/dist/assets/Shell-BEx66cW_.js +76 -0
- package/dist/assets/Shell-DrlLKa8f.css +1 -0
- package/dist/assets/StandaloneShell-BkuUCPZP.js +1 -0
- package/dist/assets/TaskMasterPanel-DfQG80SF.js +2 -0
- package/dist/assets/abnfDiagram-N423BO3Z-Cc0ul87U.js +1 -0
- package/dist/assets/arc-BAuugHw_.js +1 -0
- package/dist/assets/architectureDiagram-T3A2C74G-DA3G7QZD.js +36 -0
- package/dist/assets/{blockDiagram-VBNYF7ZC-oSjQ1SgE.js → blockDiagram-VBNYF7ZC-tJ12IJs3.js} +4 -4
- package/dist/assets/c4Diagram-5PPSVZJV-5BTMCXL4.js +10 -0
- package/dist/assets/channel-BGDgNNQz.js +1 -0
- package/dist/assets/{chunk-2GRJ4B5K-B07uZ07O.js → chunk-2GRJ4B5K-BPaI06Ou.js} +1 -1
- package/dist/assets/{chunk-2Q5K7J3B-DNSfO7xS.js → chunk-2Q5K7J3B-HV4zmsEe.js} +1 -1
- package/dist/assets/chunk-5RXB4S5H-BAwutJoU.js +231 -0
- package/dist/assets/{chunk-5VM5RSS4-B7vZV0zC.js → chunk-5VM5RSS4-B9QAJPrv.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-DuS_xUGG.js → chunk-6Q2QTUOP-BOIW8bzI.js} +1 -1
- package/dist/assets/chunk-GF5L2VYU-DD13o00-.js +206 -0
- package/dist/assets/{chunk-JWPE2WC7-DD2hcXvs.js → chunk-JWPE2WC7-CFBm23VK.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-Cz-l38qp.js → chunk-KBJHAD2P-C0i0v8Op.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DGFIU1YM.js → chunk-RYQCIY6F-DfeK0taV.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-CmfzoYFl.js → chunk-XXDRQBXY-BKWvf-QE.js} +1 -1
- package/dist/assets/classDiagram-JCYQIIEL-C2SNM4oy.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-C2SNM4oy.js +1 -0
- package/dist/assets/cose-bilkent-JH36ORCC-CBE8oM7L.js +1 -0
- package/dist/assets/{cynefin-VYW2F7L2-P1HecReO.js → cynefin-VYW2F7L2-DziGp35A.js} +11 -23
- package/dist/assets/cynefinDiagram-MW4NZA55-CNvtHl39.js +62 -0
- package/dist/assets/cytoscape.esm-yzknjiTM.js +321 -0
- package/dist/assets/dagre-VZM6K2ZE-Bz9lsU7m.js +4 -0
- package/dist/assets/{diagram-7IWD3JNH-9CWGFMYR.js → diagram-7IWD3JNH-CV7D3VSd.js} +5 -5
- package/dist/assets/{diagram-B4RE2ZJO-TWK59T6V.js → diagram-B4RE2ZJO-Dj4EjDNC.js} +2 -2
- package/dist/assets/diagram-LBJQPF4R-wJ6FHvf-.js +24 -0
- package/dist/assets/diagram-Q27KOJAE-DMFYMhOB.js +24 -0
- package/dist/assets/diagram-UB23O5K3-DeBSbWAI.js +41 -0
- package/dist/assets/ebnfDiagram-BXEA7PRR-2NnJSGhT.js +1 -0
- package/dist/assets/erDiagram-JOGREHBK-DrSlg8hr.js +85 -0
- package/dist/assets/feature-chat-CvOCyaLe.js +88 -0
- package/dist/assets/feature-workspace-CAB6bgPy.js +39 -0
- package/dist/assets/{flowDiagram-UKHOOZJN-DEr2II5V.js → flowDiagram-UKHOOZJN-C0pejU6W.js} +4 -4
- package/dist/assets/ganttDiagram-PKOTCBZU-BM0VCUUz.js +292 -0
- package/dist/assets/gitGraphDiagram-DS77QQ5N-SbLG0c5_.js +106 -0
- package/dist/assets/graph-DOmOIIwC.js +1 -0
- package/dist/assets/{index-BSe3UiFA.js → index-BflGfU1C.js} +3 -3
- package/dist/assets/index-Btkf0_rU.js +1 -0
- package/dist/assets/index-Cr5MbHuj.css +1 -0
- package/dist/assets/index-Gqazqfs3.js +1 -0
- package/dist/assets/index-nyrkoQK6.js +35 -0
- package/dist/assets/infoDiagram-6WML65LV-Cf5DSa66.js +2 -0
- package/dist/assets/ishikawaDiagram-WSZJBQD7-DwyFutKy.js +70 -0
- package/dist/assets/journeyDiagram-NVQOT4AX-Df0FRhLo.js +139 -0
- package/dist/assets/{kanban-definition-27J2QSJJ-DmlgiV7K.js → kanban-definition-27J2QSJJ-HmpbjrZz.js} +6 -6
- package/dist/assets/{layout-D6BstSzF.js → layout-D-LzfAck.js} +1 -1
- package/dist/assets/{linear-Ct_eoJQk.js → linear-DOM01LBe.js} +1 -1
- package/dist/assets/map-DxJ2ADlA.js +1 -0
- package/dist/assets/mermaid.core-C2Ma-_S6.js +306 -0
- package/dist/assets/{mindmap-definition-FAOFIHXS-DGtMgQhf.js → mindmap-definition-FAOFIHXS-B4GOIn76.js} +4 -4
- package/dist/assets/pegDiagram-VL7TDLO6-BHur7aH2.js +1 -0
- package/dist/assets/{pieDiagram-7S7Q4E2Y-DMkt_Zfr.js → pieDiagram-7S7Q4E2Y-Cw0UELLV.js} +2 -2
- package/dist/assets/quadrantDiagram-CIZ2JOQS-CB2BrX3g.js +7 -0
- package/dist/assets/railroadDiagram-AXF67PYL-DPYZYmLX.js +1 -0
- package/dist/assets/requirementDiagram-LRYGKXZP-DSX4IJ1n.js +84 -0
- package/dist/assets/sankeyDiagram-W5VNT64P-TenC3ZQo.js +40 -0
- package/dist/assets/sequenceDiagram-SI44F4Z6-DltGsf3F.js +162 -0
- package/dist/assets/sizeCapture-X5ZJPWSS-D7llwbJZ.js +1 -0
- package/dist/assets/stateDiagram-OKZ733FA-C-hAvbnY.js +1 -0
- package/dist/assets/stateDiagram-v2-UEYNNEHI-DaYSFcRQ.js +1 -0
- package/dist/assets/swimlanes-SLNWSIFB-DWD30fv6.js +2 -0
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-LTkF2T6t.js +8 -0
- package/dist/assets/timeline-definition-Z64GVDOM-quWmimSE.js +120 -0
- package/dist/assets/vendor-data-DsEZeNPr.js +4 -0
- package/dist/assets/vendor-i18n-B6HjLCnN.js +1 -0
- package/dist/assets/vendor-markdown-DkITEES2.js +298 -0
- package/dist/assets/vendor-react-C2GTiUCy.js +10 -0
- package/dist/assets/vendor-ui-CAUHSABu.js +49 -0
- package/dist/assets/vennDiagram-T6HMQDX7-aUQcm8h5.js +34 -0
- package/dist/assets/{wardleyDiagram-T6FBY63Y-Db9dsaXv.js → wardleyDiagram-T6FBY63Y-BZ0bwsFQ.js} +2 -2
- package/dist/assets/workbox-window.prod.es5-BBnX5xw4.js +2 -0
- package/dist/assets/xychartDiagram-ELKLHX3M-DOVzAq63.js +7 -0
- package/dist/favicon.png +0 -0
- package/dist/icons/icon-128x128.png +0 -0
- package/dist/icons/icon-144x144.png +0 -0
- package/dist/icons/icon-152x152.png +0 -0
- package/dist/icons/icon-180x180.png +0 -0
- package/dist/icons/icon-192x192.png +0 -0
- package/dist/icons/icon-384x384.png +0 -0
- package/dist/icons/icon-512x512.png +0 -0
- package/dist/icons/icon-72x72.png +0 -0
- package/dist/icons/icon-96x96.png +0 -0
- package/dist/icons/icon-maskable-192x192.png +0 -0
- package/dist/icons/icon-maskable-512x512.png +0 -0
- package/dist/icons/new-icon.png +0 -0
- package/dist/index.html +17 -27
- package/dist/logo-128.png +0 -0
- package/dist/logo-256.png +0 -0
- package/dist/manifest.webmanifest +1 -0
- package/dist/push-sw.js +48 -0
- package/dist/screenshots/setup-screen-mobile.png +0 -0
- package/dist/screenshots/setup-screen.png +0 -0
- package/dist/sw.js +1 -124
- package/dist/workbox-ae5c0bb2.js +1 -0
- package/dist-server/server/index.js +1 -1
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/load-env.js +4 -2
- package/dist-server/server/load-env.js.map +1 -1
- package/dist-server/server/modules/agent/agent.routes.js +1 -1
- package/dist-server/server/modules/agent/agent.routes.js.map +1 -1
- package/dist-server/server/modules/browser-use/browser-use.service.js +1 -1
- package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -1
- package/dist-server/server/modules/cli/cli.service.js +5 -5
- package/dist-server/server/modules/cli/cli.service.js.map +1 -1
- package/dist-server/server/modules/cli/sandbox.service.js +7 -7
- package/dist-server/server/modules/cli/sandbox.service.js.map +1 -1
- package/dist-server/server/modules/commands/commands.routes.js +1 -1
- package/dist-server/server/modules/commands/commands.routes.js.map +1 -1
- package/dist-server/server/modules/commands/tests/commands.test.js +1 -1
- package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -1
- package/dist-server/server/modules/database/connection.js +1 -1
- package/dist-server/server/modules/database/connection.js.map +1 -1
- package/dist-server/server/modules/database/repositories/sessions.db.js +1 -1
- package/dist-server/server/modules/database/tests/projects.db.integration.test.js +3 -2
- package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -1
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +4 -3
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -1
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +2 -1
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -1
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -1
- package/dist-server/server/modules/notifications/vapid-keys.service.js +1 -1
- package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -1
- package/dist-server/server/modules/projects/tests/project-management.service.test.js +2 -1
- package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +2 -2
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +1 -1
- package/dist-server/server/modules/providers/services/sessions.service.js +1 -1
- package/dist-server/server/modules/providers/tests/claude-auth.test.js +8 -0
- package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js +1 -1
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +2 -2
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider.routes.test.js +1 -1
- package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -1
- package/dist-server/server/modules/system/system.service.js +1 -1
- package/dist-server/server/modules/system/system.service.js.map +1 -1
- package/dist-server/server/modules/system/tests/system.service.test.js +1 -1
- package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -1
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js +4 -3
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -1
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js +1 -1
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -1
- package/dist-server/server/modules/worktrees/services/worktree-list.service.js +1 -1
- package/dist-server/server/modules/worktrees/services/worktree-open.service.js +1 -1
- package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +1 -1
- package/electron/cloud.js +3 -3
- package/electron/desktopNotifications.js +1 -1
- package/electron/desktopWindow.js +12 -12
- package/electron/launcher/index.html +1 -1
- package/electron/launcher/launcher.js +14 -14
- package/electron/localServer.js +5 -5
- package/electron/main.js +19 -19
- package/electron/serverInstaller.js +2 -2
- package/electron/viewHost.js +1 -1
- package/package.json +49 -37
- package/public/api-docs.html +2 -2
- package/scripts/build-client.mjs +30 -0
- package/scripts/generate-pwa-icons.ps1 +33 -0
- package/scripts/verify-pwa-build.mjs +37 -0
- package/server/index.ts +1 -1
- package/server/load-env.ts +4 -2
- package/server/modules/agent/agent.routes.ts +1 -1
- package/server/modules/browser-use/browser-use.service.ts +1 -1
- package/server/modules/cli/cli.service.ts +5 -5
- package/server/modules/cli/sandbox.service.ts +7 -7
- package/server/modules/commands/commands.routes.ts +1 -1
- package/server/modules/commands/tests/commands.test.ts +1 -1
- package/server/modules/database/connection.ts +2 -1
- package/server/modules/database/repositories/sessions.db.ts +1 -1
- package/server/modules/database/tests/projects.db.integration.test.ts +3 -2
- package/server/modules/database/tests/sessions-provider-mapping.test.ts +4 -3
- package/server/modules/database/tests/sessions.db.integration.test.ts +2 -1
- package/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
- package/server/modules/notifications/vapid-keys.service.ts +1 -1
- package/server/modules/projects/tests/project-management.service.test.ts +2 -1
- package/server/modules/providers/list/codex/codex-app-server.client.ts +2 -2
- package/server/modules/providers/list/codex/codex-models.provider.ts +1 -1
- package/server/modules/providers/list/cursor/cursor-models.provider.ts +1 -1
- package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +0 -1
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +1 -1
- package/server/modules/providers/services/sessions.service.ts +1 -1
- package/server/modules/providers/tests/claude-auth.test.ts +7 -0
- package/server/modules/providers/tests/codex-sessions.test.ts +1 -1
- package/server/modules/providers/tests/opencode-sessions.test.ts +2 -2
- package/server/modules/providers/tests/provider.routes.test.ts +1 -1
- package/server/modules/system/system.service.ts +1 -1
- package/server/modules/system/tests/system.service.test.ts +1 -1
- package/server/modules/taskmaster/taskmaster.routes.ts +4 -3
- package/server/modules/websocket/services/shell-websocket.service.ts +1 -1
- package/server/modules/worktrees/services/worktree-list.service.ts +1 -1
- package/server/modules/worktrees/services/worktree-open.service.ts +1 -1
- package/server/modules/worktrees/services/worktree-remove.service.ts +1 -1
- package/server/shared/interfaces.ts +1 -1
- package/server/shared/types.ts +6 -6
- package/dist/assets/FileTree-DLE7Ioai.js +0 -127
- package/dist/assets/GitPanel-f8RMRa8D.js +0 -29
- package/dist/assets/PluginTabContent-DU1jjkXP.js +0 -1
- package/dist/assets/Shell-CN_2MRIM.js +0 -81
- package/dist/assets/Shell-qxJ8_QYu.css +0 -32
- package/dist/assets/StandaloneShell-D0avS8UE.js +0 -1
- package/dist/assets/TaskMasterPanel-Cpf1Q5Ph.js +0 -32
- package/dist/assets/abnfDiagram-N423BO3Z-p3aJIm4T.js +0 -1
- package/dist/assets/arc-CTeud6Fl.js +0 -1
- package/dist/assets/architectureDiagram-T3A2C74G-CG7kRCJU.js +0 -36
- package/dist/assets/c4Diagram-5PPSVZJV-RkzF0DJV.js +0 -10
- package/dist/assets/channel-BfQbarn9.js +0 -1
- package/dist/assets/chunk-5RXB4S5H-BTeYcgyb.js +0 -231
- package/dist/assets/chunk-GF5L2VYU-CKLZ3iVD.js +0 -206
- package/dist/assets/classDiagram-JCYQIIEL-Bpfe3kq7.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-Bpfe3kq7.js +0 -1
- package/dist/assets/code-xml-CLpHzEOP.js +0 -6
- package/dist/assets/cose-bilkent-JH36ORCC-DlFcLXCB.js +0 -1
- package/dist/assets/cynefinDiagram-MW4NZA55-COgduz5P.js +0 -62
- package/dist/assets/cytoscape.esm-C10L9Icf.js +0 -331
- package/dist/assets/dagre-VZM6K2ZE-Bbb-siGp.js +0 -4
- package/dist/assets/diagram-LBJQPF4R-ErMC9yaa.js +0 -24
- package/dist/assets/diagram-Q27KOJAE-Dt_-C7hV.js +0 -24
- package/dist/assets/diagram-UB23O5K3-BJ1DnRAF.js +0 -41
- package/dist/assets/ebnfDiagram-BXEA7PRR-CE1YaQ9s.js +0 -1
- package/dist/assets/erDiagram-JOGREHBK-Bqk7N9aY.js +0 -85
- package/dist/assets/ganttDiagram-PKOTCBZU-CWYAUeYN.js +0 -292
- package/dist/assets/gitGraphDiagram-DS77QQ5N-tdEcEIM6.js +0 -106
- package/dist/assets/graph-Cx-EqisW.js +0 -1
- package/dist/assets/index-B-sTfSZq.js +0 -1
- package/dist/assets/index-B_FDMWar.js +0 -1174
- package/dist/assets/index-CWJtg2pR.js +0 -11
- package/dist/assets/index-t1w8KNxn.css +0 -1
- package/dist/assets/infoDiagram-6WML65LV-A3IqRUnO.js +0 -2
- package/dist/assets/ishikawaDiagram-WSZJBQD7-B2uL6bkK.js +0 -70
- package/dist/assets/journeyDiagram-NVQOT4AX-D9JB-hRW.js +0 -139
- package/dist/assets/map-CV9uif0g.js +0 -1
- package/dist/assets/mermaid.core-CQ698HNn.js +0 -312
- package/dist/assets/pegDiagram-VL7TDLO6-CO6vP4n9.js +0 -1
- package/dist/assets/quadrantDiagram-CIZ2JOQS-DgNxRz6t.js +0 -7
- package/dist/assets/railroadDiagram-AXF67PYL-DKz9UqA9.js +0 -1
- package/dist/assets/requirementDiagram-LRYGKXZP-L84XyGgV.js +0 -84
- package/dist/assets/sankeyDiagram-W5VNT64P-CQqWbJ3j.js +0 -40
- package/dist/assets/sequenceDiagram-SI44F4Z6--tnzS2tb.js +0 -162
- package/dist/assets/sizeCapture-X5ZJPWSS-DujwEOtm.js +0 -1
- package/dist/assets/stateDiagram-OKZ733FA-BK3TcZY2.js +0 -1
- package/dist/assets/stateDiagram-v2-UEYNNEHI-_medyomK.js +0 -1
- package/dist/assets/swimlanes-SLNWSIFB-naX-Uv1B.js +0 -2
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-DstIv3TC.js +0 -8
- package/dist/assets/timeline-definition-Z64GVDOM-C-vP_ddU.js +0 -120
- package/dist/assets/vendor-react-whEHfigN.js +0 -59
- package/dist/assets/vennDiagram-T6HMQDX7-DN-I7o-7.js +0 -34
- package/dist/assets/xychartDiagram-ELKLHX3M-DE6OxW_p.js +0 -7
- package/dist/manifest.json +0 -61
package/electron/main.js
CHANGED
|
@@ -11,7 +11,7 @@ import { TabsController } from './tabs.js';
|
|
|
11
11
|
|
|
12
12
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
13
13
|
|
|
14
|
-
const APP_NAME = '
|
|
14
|
+
const APP_NAME = 'WindCli';
|
|
15
15
|
const APP_USER_MODEL_ID = 'ai.cloudcli.desktop';
|
|
16
16
|
const CALLBACK_PROTOCOL = 'cloudcli';
|
|
17
17
|
const CALLBACK_URL = `${CALLBACK_PROTOCOL}://auth/callback`;
|
|
@@ -247,7 +247,7 @@ async function copyDiagnostics() {
|
|
|
247
247
|
await dialog.showMessageBox(desktopWindow?.getMainWindow() || undefined, {
|
|
248
248
|
type: 'info',
|
|
249
249
|
title: 'Diagnostics copied',
|
|
250
|
-
message: '
|
|
250
|
+
message: 'WindCli desktop diagnostics were copied to the clipboard.',
|
|
251
251
|
});
|
|
252
252
|
}
|
|
253
253
|
|
|
@@ -259,15 +259,15 @@ async function refreshCloudEnvironments({ showErrors = false } = {}) {
|
|
|
259
259
|
} catch (error) {
|
|
260
260
|
const authState = cloud.getAuthState();
|
|
261
261
|
if (authState === 'expired') {
|
|
262
|
-
const expiredError = new Error('Your CloudCLI session expired. Reconnect your account.');
|
|
262
|
+
const expiredError = new Error('Your CloudCLI Cloud session expired. Reconnect your account.');
|
|
263
263
|
if (showErrors) {
|
|
264
|
-
await showError('CloudCLI login required', expiredError);
|
|
264
|
+
await showError('CloudCLI Cloud login required', expiredError);
|
|
265
265
|
return [];
|
|
266
266
|
}
|
|
267
267
|
throw expiredError;
|
|
268
268
|
}
|
|
269
269
|
if (showErrors) {
|
|
270
|
-
await showError('Could not load CloudCLI environments', error);
|
|
270
|
+
await showError('Could not load CloudCLI Cloud environments', error);
|
|
271
271
|
return [];
|
|
272
272
|
}
|
|
273
273
|
throw error;
|
|
@@ -299,13 +299,13 @@ async function handleDeepLink(url) {
|
|
|
299
299
|
}
|
|
300
300
|
|
|
301
301
|
if (!pendingCloudConnectStartedAt || Date.now() - pendingCloudConnectStartedAt > AUTH_CALLBACK_TTL_MS) {
|
|
302
|
-
await showError('CloudCLI account connection failed', new Error('No recent CloudCLI account connection was started from this app.'));
|
|
302
|
+
await showError('CloudCLI Cloud account connection failed', new Error('No recent CloudCLI Cloud account connection was started from this app.'));
|
|
303
303
|
return;
|
|
304
304
|
}
|
|
305
305
|
|
|
306
306
|
const apiKey = parsed.searchParams.get('api_key');
|
|
307
307
|
if (!apiKey) {
|
|
308
|
-
await showError('CloudCLI account connection failed', new Error('The callback did not include an API key.'));
|
|
308
|
+
await showError('CloudCLI Cloud account connection failed', new Error('The callback did not include an API key.'));
|
|
309
309
|
return;
|
|
310
310
|
}
|
|
311
311
|
|
|
@@ -318,8 +318,8 @@ async function handleDeepLink(url) {
|
|
|
318
318
|
|
|
319
319
|
dialog.showMessageBox(desktopWindow?.getMainWindow() || undefined, {
|
|
320
320
|
type: 'info',
|
|
321
|
-
title: 'CloudCLI account connected',
|
|
322
|
-
message: cloud.getAccount()?.email ? `Connected as ${cloud.getAccount().email}.` : 'CloudCLI account connected.',
|
|
321
|
+
title: 'CloudCLI Cloud account connected',
|
|
322
|
+
message: cloud.getAccount()?.email ? `Connected as ${cloud.getAccount().email}.` : 'CloudCLI Cloud account connected.',
|
|
323
323
|
}).catch(() => {});
|
|
324
324
|
}
|
|
325
325
|
|
|
@@ -329,7 +329,7 @@ async function copyLocalWebUrl() {
|
|
|
329
329
|
const localUrl = localServer.getLocalServerUrl();
|
|
330
330
|
|
|
331
331
|
if (!shareableUrl) {
|
|
332
|
-
throw new Error('Local
|
|
332
|
+
throw new Error('Local WindCli URL is not available yet.');
|
|
333
333
|
}
|
|
334
334
|
|
|
335
335
|
clipboard.writeText(shareableUrl);
|
|
@@ -340,7 +340,7 @@ async function copyLocalWebUrl() {
|
|
|
340
340
|
message: isLanUrl ? 'LAN web URL copied.' : 'Local web URL copied.',
|
|
341
341
|
detail: isLanUrl
|
|
342
342
|
? `${shareableUrl}\n\nUse this URL from another device on the same network.`
|
|
343
|
-
: `${shareableUrl}\n\nThis URL works on this computer. Enable LAN access before starting Local
|
|
343
|
+
: `${shareableUrl}\n\nThis URL works on this computer. Enable LAN access before starting Local WindCli to copy a phone-accessible URL.`,
|
|
344
344
|
});
|
|
345
345
|
|
|
346
346
|
return getDesktopState();
|
|
@@ -350,7 +350,7 @@ async function openLocalWebUi() {
|
|
|
350
350
|
await localServer.ensureLocalServer();
|
|
351
351
|
const url = localServer.getShareableWebUrl() || localServer.getLocalServerUrl();
|
|
352
352
|
if (!url) {
|
|
353
|
-
throw new Error('Local
|
|
353
|
+
throw new Error('Local WindCli URL is not available yet.');
|
|
354
354
|
}
|
|
355
355
|
|
|
356
356
|
await openExternalUrl(url);
|
|
@@ -366,7 +366,7 @@ async function updateDesktopSetting(key, value) {
|
|
|
366
366
|
type: 'info',
|
|
367
367
|
title: 'Restart local server to apply',
|
|
368
368
|
message: 'LAN access changes apply the next time the local server starts.',
|
|
369
|
-
detail: 'Quit
|
|
369
|
+
detail: 'Quit WindCli and stop the local server, then open Local WindCli again.',
|
|
370
370
|
});
|
|
371
371
|
}
|
|
372
372
|
|
|
@@ -386,7 +386,7 @@ async function showEnvironmentPicker() {
|
|
|
386
386
|
}
|
|
387
387
|
}
|
|
388
388
|
|
|
389
|
-
const choices = ['Local
|
|
389
|
+
const choices = ['Local WindCli', ...environments.map((environment) => {
|
|
390
390
|
const status = environment.status === 'running' ? '' : ` (${environment.status})`;
|
|
391
391
|
return `${environment.name || environment.subdomain}${status}`;
|
|
392
392
|
})];
|
|
@@ -396,7 +396,7 @@ async function showEnvironmentPicker() {
|
|
|
396
396
|
buttons: [...choices, 'Cancel'],
|
|
397
397
|
defaultId: 0,
|
|
398
398
|
cancelId: choices.length,
|
|
399
|
-
title: 'Switch
|
|
399
|
+
title: 'Switch WindCli Environment',
|
|
400
400
|
message: 'Choose where this desktop window should connect.',
|
|
401
401
|
detail: refreshError ? `Cloud environments could not be refreshed. Showing cached environments.\n\n${refreshError.message || refreshError}` : undefined,
|
|
402
402
|
});
|
|
@@ -588,7 +588,7 @@ async function openEnvironmentInDesktop(environment) {
|
|
|
588
588
|
cancelId: 1,
|
|
589
589
|
title: 'Start environment?',
|
|
590
590
|
message: `${pendingTarget.name} is ${environment.status}.`,
|
|
591
|
-
detail: '
|
|
591
|
+
detail: 'WindCli can start it before opening the remote app.',
|
|
592
592
|
});
|
|
593
593
|
|
|
594
594
|
if (response.response !== 0) {
|
|
@@ -696,7 +696,7 @@ function getRemoteEnvironmentMenuItems() {
|
|
|
696
696
|
const environments = cloud.getEnvironments();
|
|
697
697
|
|
|
698
698
|
if (!cloudAccount?.apiKey) {
|
|
699
|
-
return [{ label: 'Connect CloudCLI Account...', click: () => void connectCloudAccount() }];
|
|
699
|
+
return [{ label: 'Connect CloudCLI Cloud Account...', click: () => void connectCloudAccount() }];
|
|
700
700
|
}
|
|
701
701
|
|
|
702
702
|
if (!environments.length) {
|
|
@@ -895,7 +895,7 @@ async function bootstrap() {
|
|
|
895
895
|
app.setAboutPanelOptions({
|
|
896
896
|
applicationName: APP_NAME,
|
|
897
897
|
applicationVersion: app.getVersion(),
|
|
898
|
-
copyright: '
|
|
898
|
+
copyright: 'WindCli',
|
|
899
899
|
});
|
|
900
900
|
|
|
901
901
|
localServer = new LocalServerController({
|
|
@@ -938,7 +938,7 @@ async function bootstrap() {
|
|
|
938
938
|
|
|
939
939
|
if (registerSingleInstance()) {
|
|
940
940
|
bootstrap().catch(async (error) => {
|
|
941
|
-
await showError('
|
|
941
|
+
await showError('WindCli failed to start', error);
|
|
942
942
|
app.quit();
|
|
943
943
|
});
|
|
944
944
|
}
|
|
@@ -7,14 +7,14 @@ import os from 'node:os';
|
|
|
7
7
|
import path from 'node:path';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* Installs the versioned local server runtime used by
|
|
10
|
+
* Installs the versioned local server runtime used by WindCli Desktop.
|
|
11
11
|
*
|
|
12
12
|
* Server bundles are cached under:
|
|
13
13
|
* ~/.cloudcli/server/<version>/dist-server/server/index.js
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
const DEFAULT_INSTALL_ROOT = path.join(os.homedir(), '.cloudcli', 'server');
|
|
17
|
-
const DEFAULT_BUNDLE_BASE_URL = 'https://github.com/
|
|
17
|
+
const DEFAULT_BUNDLE_BASE_URL = 'https://github.com/CaineWind/wacli/releases/download';
|
|
18
18
|
const MAX_REDIRECTS = 5;
|
|
19
19
|
const LOCAL_DOWNLOAD_HOSTS = new Set(['localhost', '127.0.0.1', '::1']);
|
|
20
20
|
|
package/electron/viewHost.js
CHANGED
|
@@ -251,7 +251,7 @@ export class ViewHost {
|
|
|
251
251
|
const view = this.getOrCreateTabView(tabId);
|
|
252
252
|
if (view.__cloudcliLoadingUrl) return;
|
|
253
253
|
this.attach(view);
|
|
254
|
-
const html = buildPlaceholderHtml(target.name || this.appName, 'Starting Local
|
|
254
|
+
const html = buildPlaceholderHtml(target.name || this.appName, 'Starting Local WindCli...', logs);
|
|
255
255
|
if (view.__cloudcliStartupHtml === html) return;
|
|
256
256
|
await view.webContents.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(html)}`);
|
|
257
257
|
view.__cloudcliStartupHtml = html;
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wind-agent-cli",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"productName": "
|
|
5
|
-
"description": "A
|
|
3
|
+
"version": "1.38.0",
|
|
4
|
+
"productName": "WindCli",
|
|
5
|
+
"description": "A local-first web interface for AI coding agents",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"engines": {
|
|
8
8
|
"node": ">=22"
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"server:bundle": "npm run build && node scripts/release/build-server-bundle.js",
|
|
49
49
|
"desktop:icon:mac": "node electron/scripts/generate-macos-icon.js",
|
|
50
50
|
"build": "npm run build:client && npm run build:server",
|
|
51
|
-
"build:client": "
|
|
51
|
+
"build:client": "node scripts/build-client.mjs && node scripts/verify-pwa-build.mjs",
|
|
52
52
|
"prebuild:server": "node -e \"require('node:fs').rmSync('dist-server.next', { recursive: true, force: true })\"",
|
|
53
53
|
"build:server": "tsc -p server/tsconfig.json && tsc-alias -p server/tsconfig.json",
|
|
54
54
|
"postbuild:server": "node scripts/promote-dist-server.mjs",
|
|
@@ -56,20 +56,22 @@
|
|
|
56
56
|
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p server/tsconfig.json",
|
|
57
57
|
"test": "tsx --tsconfig server/tsconfig.json --test \"server/**/*.test.ts\" \"server/**/*.test.js\"",
|
|
58
58
|
"test:client": "tsx --test \"src/**/*.test.ts\" \"src/**/*.test.tsx\"",
|
|
59
|
-
"lint": "eslint src/ server/",
|
|
59
|
+
"lint": "eslint src/ server/ --max-warnings=0",
|
|
60
60
|
"lint:fix": "eslint src/ server/ --fix",
|
|
61
61
|
"start": "npm run build && npm run server",
|
|
62
62
|
"release": "./release.sh",
|
|
63
63
|
"prepublishOnly": "npm run build",
|
|
64
64
|
"postinstall": "node scripts/fix-node-pty.js && node scripts/fix-codex-sdk-windows-hide.js",
|
|
65
65
|
"prepare": "husky",
|
|
66
|
-
"update:platform": "./update-platform.sh"
|
|
66
|
+
"update:platform": "./update-platform.sh",
|
|
67
|
+
"audit:production": "npm audit --omit=dev --audit-level=low",
|
|
68
|
+
"audit:all": "npm audit --audit-level=low"
|
|
67
69
|
},
|
|
68
70
|
"build": {
|
|
69
71
|
"appId": "ai.cloudcli.desktop",
|
|
70
|
-
"productName": "
|
|
72
|
+
"productName": "WindCli",
|
|
71
73
|
"asar": false,
|
|
72
|
-
"artifactName": "
|
|
74
|
+
"artifactName": "windcli-desktop-${version}-${os}-${arch}.${ext}",
|
|
73
75
|
"directories": {
|
|
74
76
|
"output": "release/desktop"
|
|
75
77
|
},
|
|
@@ -88,7 +90,7 @@
|
|
|
88
90
|
],
|
|
89
91
|
"protocols": [
|
|
90
92
|
{
|
|
91
|
-
"name": "
|
|
93
|
+
"name": "WindCli",
|
|
92
94
|
"schemes": [
|
|
93
95
|
"cloudcli"
|
|
94
96
|
]
|
|
@@ -102,11 +104,11 @@
|
|
|
102
104
|
"dmg"
|
|
103
105
|
],
|
|
104
106
|
"extendInfo": {
|
|
105
|
-
"CFBundleName": "
|
|
106
|
-
"CFBundleDisplayName": "
|
|
107
|
+
"CFBundleName": "WindCli",
|
|
108
|
+
"CFBundleDisplayName": "WindCli",
|
|
107
109
|
"CFBundleURLTypes": [
|
|
108
110
|
{
|
|
109
|
-
"CFBundleURLName": "
|
|
111
|
+
"CFBundleURLName": "WindCli",
|
|
110
112
|
"CFBundleURLSchemes": [
|
|
111
113
|
"cloudcli"
|
|
112
114
|
]
|
|
@@ -141,7 +143,7 @@
|
|
|
141
143
|
"ui",
|
|
142
144
|
"mobile IDE"
|
|
143
145
|
],
|
|
144
|
-
"author": "
|
|
146
|
+
"author": "WindCli contributors",
|
|
145
147
|
"license": "AGPL-3.0-or-later",
|
|
146
148
|
"dependencies": {
|
|
147
149
|
"@anthropic-ai/claude-agent-sdk": "^0.3.165",
|
|
@@ -159,22 +161,22 @@
|
|
|
159
161
|
"@replit/codemirror-minimap": "^0.5.2",
|
|
160
162
|
"@tailwindcss/typography": "^0.5.16",
|
|
161
163
|
"@uiw/react-codemirror": "^4.23.13",
|
|
162
|
-
"@vscode/ripgrep": "^1.
|
|
164
|
+
"@vscode/ripgrep": "^1.18.0",
|
|
163
165
|
"@xterm/addon-clipboard": "^0.1.0",
|
|
164
166
|
"@xterm/addon-fit": "^0.10.0",
|
|
165
167
|
"@xterm/addon-web-links": "^0.11.0",
|
|
166
168
|
"@xterm/addon-webgl": "^0.18.0",
|
|
167
169
|
"@xterm/xterm": "^5.5.0",
|
|
168
170
|
"bcrypt": "^6.0.0",
|
|
169
|
-
"better-sqlite3": "^
|
|
171
|
+
"better-sqlite3": "^13.0.3",
|
|
170
172
|
"chokidar": "^4.0.3",
|
|
171
173
|
"class-variance-authority": "^0.7.1",
|
|
172
174
|
"clsx": "^2.1.1",
|
|
173
175
|
"cmdk": "^1.1.1",
|
|
174
176
|
"cors": "^2.8.5",
|
|
175
177
|
"cross-spawn": "^7.0.3",
|
|
176
|
-
"dompurify": "^3.4.
|
|
177
|
-
"express": "^4.
|
|
178
|
+
"dompurify": "^3.4.14",
|
|
179
|
+
"express": "^4.22.2",
|
|
178
180
|
"fuse.js": "^7.0.0",
|
|
179
181
|
"gray-matter": "^4.0.3",
|
|
180
182
|
"i18next": "^25.7.4",
|
|
@@ -186,7 +188,7 @@
|
|
|
186
188
|
"lucide-react": "^0.515.0",
|
|
187
189
|
"mermaid": "^11.16.1",
|
|
188
190
|
"mime-types": "^3.0.1",
|
|
189
|
-
"multer": "^2.0
|
|
191
|
+
"multer": "^2.3.0",
|
|
190
192
|
"node-fetch": "^2.7.0",
|
|
191
193
|
"node-pty": "^1.2.0-beta.12",
|
|
192
194
|
"react": "^18.2.0",
|
|
@@ -195,8 +197,8 @@
|
|
|
195
197
|
"react-error-boundary": "^4.1.2",
|
|
196
198
|
"react-i18next": "^16.5.3",
|
|
197
199
|
"react-markdown": "^10.1.0",
|
|
198
|
-
"react-router-dom": "^
|
|
199
|
-
"react-syntax-highlighter": "^
|
|
200
|
+
"react-router-dom": "^7.18.3",
|
|
201
|
+
"react-syntax-highlighter": "^16.1.1",
|
|
200
202
|
"rehype-katex": "^7.0.1",
|
|
201
203
|
"rehype-raw": "^7.0.0",
|
|
202
204
|
"remark-breaks": "^4.0.0",
|
|
@@ -204,14 +206,14 @@
|
|
|
204
206
|
"remark-math": "^6.0.0",
|
|
205
207
|
"tailwind-merge": "^3.3.1",
|
|
206
208
|
"web-push": "^3.6.7",
|
|
207
|
-
"ws": "^8.
|
|
209
|
+
"ws": "^8.21.3"
|
|
208
210
|
},
|
|
209
211
|
"devDependencies": {
|
|
210
212
|
"@commitlint/cli": "^20.5.0",
|
|
211
213
|
"@commitlint/config-conventional": "^20.5.0",
|
|
212
214
|
"@eslint/js": "^9.39.3",
|
|
213
|
-
"@release-it/conventional-changelog": "^
|
|
214
|
-
"@types/better-sqlite3": "^
|
|
215
|
+
"@release-it/conventional-changelog": "^12.0.0",
|
|
216
|
+
"@types/better-sqlite3": "^9.6.0",
|
|
215
217
|
"@types/cors": "^2.8.19",
|
|
216
218
|
"@types/cross-spawn": "^6.0.6",
|
|
217
219
|
"@types/express": "^5.0.6",
|
|
@@ -221,12 +223,13 @@
|
|
|
221
223
|
"@types/react": "^18.2.43",
|
|
222
224
|
"@types/react-dom": "^18.2.17",
|
|
223
225
|
"@types/ws": "^8.18.1",
|
|
224
|
-
"@vitejs/plugin-react": "^
|
|
226
|
+
"@vitejs/plugin-react": "^5.2.0",
|
|
225
227
|
"auto-changelog": "^2.5.0",
|
|
226
228
|
"autoprefixer": "^10.4.16",
|
|
227
229
|
"concurrently": "^8.2.2",
|
|
230
|
+
"conventional-changelog-conventionalcommits": "^10.4.0",
|
|
228
231
|
"cross-env": "^10.1.0",
|
|
229
|
-
"electron": "^
|
|
232
|
+
"electron": "^44.1.1",
|
|
230
233
|
"electron-builder": "^26.15.3",
|
|
231
234
|
"eslint": "^9.39.3",
|
|
232
235
|
"eslint-import-resolver-typescript": "^4.4.4",
|
|
@@ -240,23 +243,32 @@
|
|
|
240
243
|
"globals": "^17.4.0",
|
|
241
244
|
"husky": "^9.1.7",
|
|
242
245
|
"lint-staged": "^16.3.2",
|
|
243
|
-
"node-gyp": "^
|
|
244
|
-
"postcss": "^8.
|
|
245
|
-
"release-it": "^
|
|
246
|
-
"sharp": "^0.
|
|
247
|
-
"tailwindcss": "^3.4.
|
|
246
|
+
"node-gyp": "^12.4.0",
|
|
247
|
+
"postcss": "^8.5.26",
|
|
248
|
+
"release-it": "^21.0.2",
|
|
249
|
+
"sharp": "^0.35.4",
|
|
250
|
+
"tailwindcss": "^3.4.19",
|
|
248
251
|
"tsc-alias": "^1.8.16",
|
|
249
|
-
"tsx": "^4.
|
|
252
|
+
"tsx": "^4.23.13",
|
|
250
253
|
"typescript": "^5.9.3",
|
|
251
254
|
"typescript-eslint": "^8.56.1",
|
|
252
|
-
"vite": "^7.
|
|
255
|
+
"vite": "^7.3.6",
|
|
256
|
+
"vite-plugin-pwa": "^1.3.0"
|
|
257
|
+
},
|
|
258
|
+
"overrides": {
|
|
259
|
+
"@humanfs/node": "0.16.8",
|
|
260
|
+
"qs": "6.16.0"
|
|
253
261
|
},
|
|
254
262
|
"lint-staged": {
|
|
255
|
-
"src/**/*.{ts,tsx,js,jsx}": "eslint",
|
|
256
|
-
"server/**/*.{js,ts}": "eslint"
|
|
263
|
+
"src/**/*.{ts,tsx,js,jsx}": "eslint --max-warnings=0",
|
|
264
|
+
"server/**/*.{js,ts}": "eslint --max-warnings=0"
|
|
257
265
|
},
|
|
258
|
-
"
|
|
259
|
-
"@
|
|
260
|
-
"
|
|
266
|
+
"allowScripts": {
|
|
267
|
+
"bcrypt@6.0.0": true,
|
|
268
|
+
"electron-winstaller@5.4.0": true,
|
|
269
|
+
"esbuild@0.28.2": true,
|
|
270
|
+
"node-pty@1.2.0-beta.12": true,
|
|
271
|
+
"unrs-resolver@1.11.1": true,
|
|
272
|
+
"better-sqlite3": false
|
|
261
273
|
}
|
|
262
274
|
}
|
package/public/api-docs.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>
|
|
6
|
+
<title>WindCli - API Documentation</title>
|
|
7
7
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
8
8
|
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
9
9
|
|
|
@@ -418,7 +418,7 @@
|
|
|
418
418
|
</svg>
|
|
419
419
|
</div>
|
|
420
420
|
<div class="brand-text">
|
|
421
|
-
<h1>
|
|
421
|
+
<h1>WindCli</h1>
|
|
422
422
|
<div class="subtitle">API Documentation</div>
|
|
423
423
|
</div>
|
|
424
424
|
</div>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { build, createLogger } from 'vite';
|
|
2
|
+
|
|
3
|
+
const logger = createLogger('info');
|
|
4
|
+
const warnings = [];
|
|
5
|
+
const seenWarnings = new Set();
|
|
6
|
+
const originalWarn = logger.warn.bind(logger);
|
|
7
|
+
const originalWarnOnce = logger.warnOnce.bind(logger);
|
|
8
|
+
|
|
9
|
+
const recordWarning = (message) => {
|
|
10
|
+
if (!seenWarnings.has(message)) {
|
|
11
|
+
seenWarnings.add(message);
|
|
12
|
+
warnings.push(message);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
logger.warn = (message, options) => {
|
|
17
|
+
recordWarning(message);
|
|
18
|
+
originalWarn(message, options);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
logger.warnOnce = (message, options) => {
|
|
22
|
+
recordWarning(message);
|
|
23
|
+
originalWarnOnce(message, options);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
await build({ customLogger: logger });
|
|
27
|
+
|
|
28
|
+
if (warnings.length > 0) {
|
|
29
|
+
throw new Error('Client build emitted ' + warnings.length + ' warning(s).');
|
|
30
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
param(
|
|
2
|
+
[string]$Source = "public/icons/new-icon.png"
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
$ErrorActionPreference = "Stop"
|
|
6
|
+
$sizes = @(72, 96, 128, 144, 152, 180, 192, 384, 512)
|
|
7
|
+
|
|
8
|
+
foreach ($size in $sizes) {
|
|
9
|
+
ffmpeg -hide_banner -loglevel error -y -i $Source `
|
|
10
|
+
-vf "scale=${size}:${size}:flags=lanczos,format=rgba" `
|
|
11
|
+
-frames:v 1 "public/icons/icon-${size}x${size}.png"
|
|
12
|
+
if ($LASTEXITCODE -ne 0) { throw "ffmpeg failed to generate ${size}x${size} icon" }
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
foreach ($size in @(192, 512)) {
|
|
16
|
+
ffmpeg -hide_banner -loglevel error -y `
|
|
17
|
+
-f lavfi -i "color=c=0x111111:s=${size}x${size}" -i $Source `
|
|
18
|
+
-filter_complex "[1:v]scale=${size}:${size}:flags=lanczos,format=rgba[fg];[0:v][fg]overlay=0:0:format=auto,format=rgb24[out]" `
|
|
19
|
+
-map "[out]" -frames:v 1 "public/icons/icon-maskable-${size}x${size}.png"
|
|
20
|
+
if ($LASTEXITCODE -ne 0) { throw "ffmpeg failed to generate ${size}x${size} maskable icon" }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
foreach ($asset in @(
|
|
24
|
+
@{ Size = 32; Path = "public/favicon.png" },
|
|
25
|
+
@{ Size = 128; Path = "public/logo-128.png" },
|
|
26
|
+
@{ Size = 256; Path = "public/logo-256.png" }
|
|
27
|
+
)) {
|
|
28
|
+
$size = $asset.Size
|
|
29
|
+
ffmpeg -hide_banner -loglevel error -y -i $Source `
|
|
30
|
+
-vf "scale=${size}:${size}:flags=lanczos,format=rgba" `
|
|
31
|
+
-frames:v 1 $asset.Path
|
|
32
|
+
if ($LASTEXITCODE -ne 0) { throw "ffmpeg failed to generate $($asset.Path)" }
|
|
33
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
|
|
3
|
+
const manifestPath = new URL('../dist/manifest.webmanifest', import.meta.url);
|
|
4
|
+
const serviceWorkerPath = new URL('../dist/sw.js', import.meta.url);
|
|
5
|
+
|
|
6
|
+
const manifest = JSON.parse(await readFile(manifestPath, 'utf8'));
|
|
7
|
+
const serviceWorker = await readFile(serviceWorkerPath, 'utf8');
|
|
8
|
+
|
|
9
|
+
const assert = (condition, message) => {
|
|
10
|
+
if (!condition) throw new Error(`PWA build verification failed: ${message}`);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const assertPng = async (relativePath) => {
|
|
14
|
+
const file = await readFile(new URL(`../dist/${relativePath}`, import.meta.url));
|
|
15
|
+
assert(file.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])), `${relativePath} is not a PNG file`);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
assert(manifest.name === 'WindCli', 'manifest name must be WindCli');
|
|
19
|
+
assert(manifest.display === 'standalone', 'manifest must use standalone display mode');
|
|
20
|
+
assert(manifest.start_url === '.', 'manifest start_url must remain deployment-relative');
|
|
21
|
+
assert(manifest.scope === '.', 'manifest scope must remain deployment-relative');
|
|
22
|
+
|
|
23
|
+
for (const [size, purpose] of [['192x192', 'any'], ['512x512', 'any'], ['192x192', 'maskable'], ['512x512', 'maskable']]) {
|
|
24
|
+
const icon = manifest.icons?.find((candidate) => candidate.sizes === size && candidate.purpose === purpose);
|
|
25
|
+
assert(icon?.type === 'image/png', `missing ${size} ${purpose} PNG icon`);
|
|
26
|
+
await assertPng(icon.src);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
assert(manifest.screenshots?.some((screenshot) => screenshot.form_factor === 'wide'), 'missing wide screenshot');
|
|
30
|
+
assert(manifest.screenshots?.some((screenshot) => screenshot.form_factor === 'narrow'), 'missing narrow screenshot');
|
|
31
|
+
assert(manifest.screenshots.every((screenshot) => screenshot.type === 'image/png'), 'screenshots must be PNG files');
|
|
32
|
+
await Promise.all(manifest.screenshots.map((screenshot) => assertPng(screenshot.src)));
|
|
33
|
+
assert(serviceWorker.includes('push-sw.js'), 'push notification worker is not imported');
|
|
34
|
+
assert(serviceWorker.includes('SKIP_WAITING'), 'prompted service-worker updates are not supported');
|
|
35
|
+
assert(serviceWorker.includes('plugin-ws'), 'navigation fallback denylist is missing server routes');
|
|
36
|
+
|
|
37
|
+
console.log(`PWA build verified: ${manifest.icons.length} icons, ${manifest.screenshots.length} screenshots`);
|
package/server/index.ts
CHANGED
|
@@ -352,7 +352,7 @@ async function startServer() {
|
|
|
352
352
|
|
|
353
353
|
console.log('');
|
|
354
354
|
console.log(terminalTextStyles.dim('═'.repeat(63)));
|
|
355
|
-
console.log(` ${terminalTextStyles.bright('
|
|
355
|
+
console.log(` ${terminalTextStyles.bright('WindCli Server - Ready')}`);
|
|
356
356
|
console.log(terminalTextStyles.dim('═'.repeat(63)));
|
|
357
357
|
console.log('');
|
|
358
358
|
console.log(`${terminalTextStyles.info('[INFO]')} Server URL: ${terminalTextStyles.bright('http://' + DISPLAY_HOST + ':' + SERVER_PORT)}`);
|
package/server/load-env.ts
CHANGED
|
@@ -34,8 +34,10 @@ try {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
|
-
} catch (
|
|
38
|
-
|
|
37
|
+
} catch (error: unknown) {
|
|
38
|
+
if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT')) {
|
|
39
|
+
console.error('Unable to read .env:', error);
|
|
40
|
+
}
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
// Keep the default database in a stable user-level location so rebuilding dist-server
|
|
@@ -1166,7 +1166,7 @@ export function createAgentRouter(dependencies: AgentRouterDependencies): expres
|
|
|
1166
1166
|
} else {
|
|
1167
1167
|
prBody += `Agent task: ${message}`;
|
|
1168
1168
|
}
|
|
1169
|
-
prBody += '\n\n---\n*This pull request was automatically created by
|
|
1169
|
+
prBody += '\n\n---\n*This pull request was automatically created by WindCli Agent.*';
|
|
1170
1170
|
|
|
1171
1171
|
console.log(`📝 PR Title: ${prTitle}`);
|
|
1172
1172
|
|
|
@@ -287,7 +287,7 @@ function runCommand(command: string, args: string[]): Promise<void> {
|
|
|
287
287
|
function formatInstallError(error: unknown): string {
|
|
288
288
|
const message = error instanceof Error ? error.message : String(error);
|
|
289
289
|
if (message.includes('sudo') && message.includes('password')) {
|
|
290
|
-
return 'Installing Chromium system dependencies requires administrator privileges. Run `npx playwright install-deps chromium` on the machine where
|
|
290
|
+
return 'Installing Chromium system dependencies requires administrator privileges. Run `npx playwright install-deps chromium` on the machine where WindCli runs, then try again.';
|
|
291
291
|
}
|
|
292
292
|
return message || 'Failed to install Browser runtime.';
|
|
293
293
|
}
|
|
@@ -84,7 +84,7 @@ function showStatus(dependencies: CliServiceDependencies): void {
|
|
|
84
84
|
const claudeProjectsPath = path.join(dependencies.homeDirectory, '.claude', 'projects');
|
|
85
85
|
const environmentFilePath = path.join(dependencies.applicationRoot, '.env');
|
|
86
86
|
|
|
87
|
-
output.log(`\n${terminalTextStyles.bright('
|
|
87
|
+
output.log(`\n${terminalTextStyles.bright('WindCli UI - Status')}\n`);
|
|
88
88
|
output.log(terminalTextStyles.dim('═'.repeat(60)));
|
|
89
89
|
output.log(`\n${terminalTextStyles.info('[INFO]')} Version: ${terminalTextStyles.bright(dependencies.packageMetadata.version)}`);
|
|
90
90
|
output.log(`\n${terminalTextStyles.info('[INFO]')} Installation Directory:`);
|
|
@@ -127,14 +127,14 @@ function showStatus(dependencies: CliServiceDependencies): void {
|
|
|
127
127
|
function showHelp(dependencies: CliServiceDependencies): void {
|
|
128
128
|
dependencies.output.log(`
|
|
129
129
|
╔═══════════════════════════════════════════════════════════════╗
|
|
130
|
-
║
|
|
130
|
+
║ WindCli - Command Line Tool ║
|
|
131
131
|
╚═══════════════════════════════════════════════════════════════╝
|
|
132
132
|
|
|
133
133
|
Usage:
|
|
134
134
|
wacli [command] [options]
|
|
135
135
|
|
|
136
136
|
Commands:
|
|
137
|
-
start Start the
|
|
137
|
+
start Start the WindCli server (default)
|
|
138
138
|
sandbox Manage Docker sandbox environments
|
|
139
139
|
browser-use-mcp Run Browser MCP stdio server
|
|
140
140
|
status Show configuration and data locations
|
|
@@ -162,10 +162,10 @@ Environment Variables:
|
|
|
162
162
|
CONTEXT_WINDOW Set context window size (default: 160000)
|
|
163
163
|
|
|
164
164
|
Documentation:
|
|
165
|
-
${dependencies.packageMetadata.homepage || 'https://github.com/
|
|
165
|
+
${dependencies.packageMetadata.homepage || 'https://github.com/CaineWind/wacli'}
|
|
166
166
|
|
|
167
167
|
Report Issues:
|
|
168
|
-
${dependencies.packageMetadata.bugsUrl || 'https://github.com/
|
|
168
|
+
${dependencies.packageMetadata.bugsUrl || 'https://github.com/CaineWind/wacli/issues'}
|
|
169
169
|
`);
|
|
170
170
|
}
|
|
171
171
|
|
|
@@ -106,7 +106,7 @@ function readCommandError(error: unknown): string {
|
|
|
106
106
|
|
|
107
107
|
function showSandboxHelp(output: CliOutput): void {
|
|
108
108
|
output.log(`
|
|
109
|
-
${terminalTextStyles.bright('
|
|
109
|
+
${terminalTextStyles.bright('WindCli Sandbox')} — Run WindCli inside Docker Sandboxes
|
|
110
110
|
|
|
111
111
|
Usage:
|
|
112
112
|
wacli sandbox <workspace> Create and start a sandbox
|
|
@@ -118,7 +118,7 @@ Subcommands:
|
|
|
118
118
|
${terminalTextStyles.bright('start')} Restart a stopped sandbox and re-launch the web UI
|
|
119
119
|
${terminalTextStyles.bright('stop')} Stop a sandbox (preserves state)
|
|
120
120
|
${terminalTextStyles.bright('rm')} Remove a sandbox
|
|
121
|
-
${terminalTextStyles.bright('logs')} Show
|
|
121
|
+
${terminalTextStyles.bright('logs')} Show WindCli server logs
|
|
122
122
|
${terminalTextStyles.bright('help')} Show this help
|
|
123
123
|
|
|
124
124
|
Options:
|
|
@@ -279,7 +279,7 @@ export function createSandboxCommandService(
|
|
|
279
279
|
);
|
|
280
280
|
dependencies.spawnDetachedSandbox(['run', sandboxName]);
|
|
281
281
|
await dependencies.wait(5_000);
|
|
282
|
-
dependencies.output.log(`${terminalTextStyles.info('▶')} Launching
|
|
282
|
+
dependencies.output.log(`${terminalTextStyles.info('▶')} Launching WindCli web server...`);
|
|
283
283
|
dependencies.runSandboxCommand([
|
|
284
284
|
'exec',
|
|
285
285
|
sandboxName,
|
|
@@ -290,7 +290,7 @@ export function createSandboxCommandService(
|
|
|
290
290
|
if (!publishSandboxPort(options, dependencies)) {
|
|
291
291
|
return 1;
|
|
292
292
|
}
|
|
293
|
-
dependencies.output.log(`\n${terminalTextStyles.ok('✔')} ${terminalTextStyles.bright('
|
|
293
|
+
dependencies.output.log(`\n${terminalTextStyles.ok('✔')} ${terminalTextStyles.bright('WindCli is ready!')}`);
|
|
294
294
|
dependencies.output.log(` ${terminalTextStyles.info('→')} ${terminalTextStyles.bright(`http://localhost:${options.port}`)}\n`);
|
|
295
295
|
return 0;
|
|
296
296
|
}
|
|
@@ -330,7 +330,7 @@ export function createSandboxCommandService(
|
|
|
330
330
|
// proceed and let sbx report a credential error itself.
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
-
dependencies.output.log(`\n${terminalTextStyles.bright('
|
|
333
|
+
dependencies.output.log(`\n${terminalTextStyles.bright('WindCli Sandbox')}`);
|
|
334
334
|
dependencies.output.log(terminalTextStyles.dim('─'.repeat(50)));
|
|
335
335
|
dependencies.output.log(` Agent: ${terminalTextStyles.info(options.agent)} ${terminalTextStyles.dim(`(${secret} credentials)`)}`);
|
|
336
336
|
dependencies.output.log(` Workspace: ${terminalTextStyles.dim(workspace)}`);
|
|
@@ -381,7 +381,7 @@ export function createSandboxCommandService(
|
|
|
381
381
|
}
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
-
dependencies.output.log(`${terminalTextStyles.info('▶')} Launching
|
|
384
|
+
dependencies.output.log(`${terminalTextStyles.info('▶')} Launching WindCli web server...`);
|
|
385
385
|
dependencies.runSandboxCommand([
|
|
386
386
|
'exec',
|
|
387
387
|
sandboxName,
|
|
@@ -393,7 +393,7 @@ export function createSandboxCommandService(
|
|
|
393
393
|
return 1;
|
|
394
394
|
}
|
|
395
395
|
|
|
396
|
-
dependencies.output.log(`\n${terminalTextStyles.ok('✔')} ${terminalTextStyles.bright('
|
|
396
|
+
dependencies.output.log(`\n${terminalTextStyles.ok('✔')} ${terminalTextStyles.bright('WindCli is ready!')}`);
|
|
397
397
|
dependencies.output.log(` ${terminalTextStyles.info('→')} Open ${terminalTextStyles.bright(`http://localhost:${options.port}`)}`);
|
|
398
398
|
dependencies.output.log(`\n${terminalTextStyles.dim(' Manage with:')}`);
|
|
399
399
|
dependencies.output.log(` ${terminalTextStyles.dim('$')} sbx ls`);
|