@neurocode-ai/desktop 1.18.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -0
- package/README.md +19 -0
- package/electron-builder.config.test.ts +48 -0
- package/electron-builder.config.ts +146 -0
- package/electron.vite.config.ts +106 -0
- package/icons/README.md +14 -0
- package/icons/beta/128x128.png +0 -0
- package/icons/beta/128x128@2x.png +0 -0
- package/icons/beta/32x32.png +0 -0
- package/icons/beta/64x64.png +0 -0
- package/icons/beta/Square107x107Logo.png +0 -0
- package/icons/beta/Square142x142Logo.png +0 -0
- package/icons/beta/Square150x150Logo.png +0 -0
- package/icons/beta/Square284x284Logo.png +0 -0
- package/icons/beta/Square30x30Logo.png +0 -0
- package/icons/beta/Square310x310Logo.png +0 -0
- package/icons/beta/Square44x44Logo.png +0 -0
- package/icons/beta/Square71x71Logo.png +0 -0
- package/icons/beta/Square89x89Logo.png +0 -0
- package/icons/beta/StoreLogo.png +0 -0
- package/icons/beta/android/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/icons/beta/android/mipmap-hdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-hdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/mipmap-mdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-mdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/mipmap-xhdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/icons/beta/android/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/beta/android/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/icons/beta/android/values/ic_launcher_background.xml +4 -0
- package/icons/beta/dock.png +0 -0
- package/icons/beta/icon.icns +0 -0
- package/icons/beta/icon.ico +0 -0
- package/icons/beta/icon.png +0 -0
- package/icons/beta/ios/AppIcon-20x20@1x.png +0 -0
- package/icons/beta/ios/AppIcon-20x20@2x-1.png +0 -0
- package/icons/beta/ios/AppIcon-20x20@2x.png +0 -0
- package/icons/beta/ios/AppIcon-20x20@3x.png +0 -0
- package/icons/beta/ios/AppIcon-29x29@1x.png +0 -0
- package/icons/beta/ios/AppIcon-29x29@2x-1.png +0 -0
- package/icons/beta/ios/AppIcon-29x29@2x.png +0 -0
- package/icons/beta/ios/AppIcon-29x29@3x.png +0 -0
- package/icons/beta/ios/AppIcon-40x40@1x.png +0 -0
- package/icons/beta/ios/AppIcon-40x40@2x-1.png +0 -0
- package/icons/beta/ios/AppIcon-40x40@2x.png +0 -0
- package/icons/beta/ios/AppIcon-40x40@3x.png +0 -0
- package/icons/beta/ios/AppIcon-512@2x.png +0 -0
- package/icons/beta/ios/AppIcon-60x60@2x.png +0 -0
- package/icons/beta/ios/AppIcon-60x60@3x.png +0 -0
- package/icons/beta/ios/AppIcon-76x76@1x.png +0 -0
- package/icons/beta/ios/AppIcon-76x76@2x.png +0 -0
- package/icons/beta/ios/AppIcon-83.5x83.5@2x.png +0 -0
- package/icons/dev/128x128.png +0 -0
- package/icons/dev/128x128@2x.png +0 -0
- package/icons/dev/32x32.png +0 -0
- package/icons/dev/64x64.png +0 -0
- package/icons/dev/Square107x107Logo.png +0 -0
- package/icons/dev/Square142x142Logo.png +0 -0
- package/icons/dev/Square150x150Logo.png +0 -0
- package/icons/dev/Square284x284Logo.png +0 -0
- package/icons/dev/Square30x30Logo.png +0 -0
- package/icons/dev/Square310x310Logo.png +0 -0
- package/icons/dev/Square44x44Logo.png +0 -0
- package/icons/dev/Square71x71Logo.png +0 -0
- package/icons/dev/Square89x89Logo.png +0 -0
- package/icons/dev/StoreLogo.png +0 -0
- package/icons/dev/android/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/icons/dev/android/mipmap-hdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-hdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/mipmap-mdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-mdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/mipmap-xhdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/icons/dev/android/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/dev/android/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/icons/dev/android/values/ic_launcher_background.xml +4 -0
- package/icons/dev/dock.png +0 -0
- package/icons/dev/icon.icns +0 -0
- package/icons/dev/icon.ico +0 -0
- package/icons/dev/icon.png +0 -0
- package/icons/dev/ios/AppIcon-20x20@1x.png +0 -0
- package/icons/dev/ios/AppIcon-20x20@2x-1.png +0 -0
- package/icons/dev/ios/AppIcon-20x20@2x.png +0 -0
- package/icons/dev/ios/AppIcon-20x20@3x.png +0 -0
- package/icons/dev/ios/AppIcon-29x29@1x.png +0 -0
- package/icons/dev/ios/AppIcon-29x29@2x-1.png +0 -0
- package/icons/dev/ios/AppIcon-29x29@2x.png +0 -0
- package/icons/dev/ios/AppIcon-29x29@3x.png +0 -0
- package/icons/dev/ios/AppIcon-40x40@1x.png +0 -0
- package/icons/dev/ios/AppIcon-40x40@2x-1.png +0 -0
- package/icons/dev/ios/AppIcon-40x40@2x.png +0 -0
- package/icons/dev/ios/AppIcon-40x40@3x.png +0 -0
- package/icons/dev/ios/AppIcon-512@2x.png +0 -0
- package/icons/dev/ios/AppIcon-60x60@2x.png +0 -0
- package/icons/dev/ios/AppIcon-60x60@3x.png +0 -0
- package/icons/dev/ios/AppIcon-76x76@1x.png +0 -0
- package/icons/dev/ios/AppIcon-76x76@2x.png +0 -0
- package/icons/dev/ios/AppIcon-83.5x83.5@2x.png +0 -0
- package/icons/prod/128x128.png +0 -0
- package/icons/prod/128x128@2x.png +0 -0
- package/icons/prod/32x32.png +0 -0
- package/icons/prod/64x64.png +0 -0
- package/icons/prod/Square107x107Logo.png +0 -0
- package/icons/prod/Square142x142Logo.png +0 -0
- package/icons/prod/Square150x150Logo.png +0 -0
- package/icons/prod/Square284x284Logo.png +0 -0
- package/icons/prod/Square30x30Logo.png +0 -0
- package/icons/prod/Square310x310Logo.png +0 -0
- package/icons/prod/Square44x44Logo.png +0 -0
- package/icons/prod/Square71x71Logo.png +0 -0
- package/icons/prod/Square89x89Logo.png +0 -0
- package/icons/prod/StoreLogo.png +0 -0
- package/icons/prod/android/mipmap-anydpi-v26/ic_launcher.xml +5 -0
- package/icons/prod/android/mipmap-hdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-hdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/mipmap-mdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-mdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/mipmap-xhdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/icons/prod/android/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/icons/prod/android/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/icons/prod/android/values/ic_launcher_background.xml +4 -0
- package/icons/prod/dock.png +0 -0
- package/icons/prod/icon.icns +0 -0
- package/icons/prod/icon.ico +0 -0
- package/icons/prod/icon.png +0 -0
- package/icons/prod/ios/AppIcon-20x20@1x.png +0 -0
- package/icons/prod/ios/AppIcon-20x20@2x-1.png +0 -0
- package/icons/prod/ios/AppIcon-20x20@2x.png +0 -0
- package/icons/prod/ios/AppIcon-20x20@3x.png +0 -0
- package/icons/prod/ios/AppIcon-29x29@1x.png +0 -0
- package/icons/prod/ios/AppIcon-29x29@2x-1.png +0 -0
- package/icons/prod/ios/AppIcon-29x29@2x.png +0 -0
- package/icons/prod/ios/AppIcon-29x29@3x.png +0 -0
- package/icons/prod/ios/AppIcon-40x40@1x.png +0 -0
- package/icons/prod/ios/AppIcon-40x40@2x-1.png +0 -0
- package/icons/prod/ios/AppIcon-40x40@2x.png +0 -0
- package/icons/prod/ios/AppIcon-40x40@3x.png +0 -0
- package/icons/prod/ios/AppIcon-512@2x.png +0 -0
- package/icons/prod/ios/AppIcon-60x60@2x.png +0 -0
- package/icons/prod/ios/AppIcon-60x60@3x.png +0 -0
- package/icons/prod/ios/AppIcon-76x76@1x.png +0 -0
- package/icons/prod/ios/AppIcon-76x76@2x.png +0 -0
- package/icons/prod/ios/AppIcon-83.5x83.5@2x.png +0 -0
- package/package.json +75 -0
- package/resources/entitlements.plist +18 -0
- package/resources/linux/opencode-desktop.desktop +10 -0
- package/scripts/copy-bundles.ts +12 -0
- package/scripts/copy-icons.ts +12 -0
- package/scripts/copy-metainfo.ts +47 -0
- package/scripts/finalize-latest-json.ts +219 -0
- package/scripts/finalize-latest-yml.ts +124 -0
- package/scripts/prebuild.ts +10 -0
- package/scripts/predev.ts +5 -0
- package/scripts/prepare.ts +9 -0
- package/scripts/utils.ts +77 -0
- package/src/main/apps.ts +136 -0
- package/src/main/attachment-picker.test.ts +87 -0
- package/src/main/attachment-picker.ts +56 -0
- package/src/main/constants.ts +7 -0
- package/src/main/debug.ts +95 -0
- package/src/main/desktop-menu-actions.ts +84 -0
- package/src/main/env.d.ts +19 -0
- package/src/main/index.test.ts +37 -0
- package/src/main/index.ts +399 -0
- package/src/main/initialization.ts +6 -0
- package/src/main/install-state.test.ts +19 -0
- package/src/main/install-state.ts +8 -0
- package/src/main/ipc.ts +274 -0
- package/src/main/logging.ts +205 -0
- package/src/main/markdown.ts +16 -0
- package/src/main/menu.ts +67 -0
- package/src/main/migrate.ts +91 -0
- package/src/main/onboarding.ts +45 -0
- package/src/main/server.ts +238 -0
- package/src/main/shell-env.test.ts +50 -0
- package/src/main/shell-env.ts +101 -0
- package/src/main/sidecar.ts +157 -0
- package/src/main/store-cleanup.test.ts +93 -0
- package/src/main/store-cleanup.ts +94 -0
- package/src/main/store-keys.ts +7 -0
- package/src/main/store.ts +35 -0
- package/src/main/unresponsive.ts +70 -0
- package/src/main/updater-controller.test.ts +111 -0
- package/src/main/updater-controller.ts +97 -0
- package/src/main/updater-subscriptions.test.ts +16 -0
- package/src/main/updater-subscriptions.ts +20 -0
- package/src/main/updater.ts +85 -0
- package/src/main/window-registry.test.ts +91 -0
- package/src/main/window-registry.ts +47 -0
- package/src/main/window-state.ts +29 -0
- package/src/main/windows.ts +496 -0
- package/src/main/wsl/ipc.ts +103 -0
- package/src/main/wsl/policy.ts +33 -0
- package/src/main/wsl/runtime.ts +400 -0
- package/src/main/wsl/servers.test.ts +231 -0
- package/src/main/wsl/servers.ts +521 -0
- package/src/main/wsl/sidecar.ts +129 -0
- package/src/main/wsl/startup.ts +31 -0
- package/src/preload/index.ts +128 -0
- package/src/preload/types.ts +109 -0
- package/src/renderer/cli.ts +12 -0
- package/src/renderer/env.d.ts +10 -0
- package/src/renderer/html.test.ts +62 -0
- package/src/renderer/i18n/ar.ts +26 -0
- package/src/renderer/i18n/br.ts +27 -0
- package/src/renderer/i18n/bs.ts +28 -0
- package/src/renderer/i18n/da.ts +28 -0
- package/src/renderer/i18n/de.ts +28 -0
- package/src/renderer/i18n/en.ts +27 -0
- package/src/renderer/i18n/es.ts +27 -0
- package/src/renderer/i18n/fr.ts +28 -0
- package/src/renderer/i18n/index.ts +194 -0
- package/src/renderer/i18n/ja.ts +28 -0
- package/src/renderer/i18n/ko.ts +27 -0
- package/src/renderer/i18n/no.ts +28 -0
- package/src/renderer/i18n/pl.ts +28 -0
- package/src/renderer/i18n/ru.ts +27 -0
- package/src/renderer/i18n/uk.ts +28 -0
- package/src/renderer/i18n/zh.ts +26 -0
- package/src/renderer/i18n/zht.ts +26 -0
- package/src/renderer/index.html +21 -0
- package/src/renderer/index.tsx +464 -0
- package/src/renderer/initialization.test.ts +73 -0
- package/src/renderer/initialization.ts +22 -0
- package/src/renderer/onboarding.tsx +53 -0
- package/src/renderer/styles.css +0 -0
- package/src/renderer/webview-zoom.ts +138 -0
- package/src/renderer/wsl/connections.test.ts +43 -0
- package/src/renderer/wsl/connections.ts +28 -0
- package/sst-env.d.ts +10 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { contextBridge, ipcRenderer, webUtils } from "electron"
|
|
2
|
+
import type { ElectronAPI, WslServersEvent } from "./types"
|
|
3
|
+
import type { UpdaterState } from "@neurocode-ai/app/updater"
|
|
4
|
+
|
|
5
|
+
const updaterCallbacks = new Set<(state: UpdaterState) => void>()
|
|
6
|
+
let updaterState: UpdaterState | undefined
|
|
7
|
+
let updaterSubscription: Promise<void> | undefined
|
|
8
|
+
const updaterHandler = (_: unknown, state: UpdaterState) => {
|
|
9
|
+
updaterState = state
|
|
10
|
+
updaterCallbacks.forEach((callback) => callback(state))
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const api: ElectronAPI = {
|
|
14
|
+
killSidecar: () => ipcRenderer.invoke("kill-sidecar"),
|
|
15
|
+
installCli: () => ipcRenderer.invoke("install-cli"),
|
|
16
|
+
awaitInitialization: () => ipcRenderer.invoke("await-initialization"),
|
|
17
|
+
wslServers: {
|
|
18
|
+
getState: () => ipcRenderer.invoke("wsl-servers-get-state"),
|
|
19
|
+
subscribe: (cb) => {
|
|
20
|
+
const handler = (_: unknown, event: WslServersEvent) => cb(event)
|
|
21
|
+
ipcRenderer.on("wsl-servers-event", handler)
|
|
22
|
+
void ipcRenderer.invoke("wsl-servers-subscribe")
|
|
23
|
+
return () => {
|
|
24
|
+
ipcRenderer.removeListener("wsl-servers-event", handler)
|
|
25
|
+
void ipcRenderer.invoke("wsl-servers-unsubscribe")
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
probeRuntime: () => ipcRenderer.invoke("wsl-servers-probe-runtime"),
|
|
29
|
+
refreshDistros: () => ipcRenderer.invoke("wsl-servers-refresh-distros"),
|
|
30
|
+
installWsl: () => ipcRenderer.invoke("wsl-servers-install-wsl"),
|
|
31
|
+
installDistro: (name) => ipcRenderer.invoke("wsl-servers-install-distro", name),
|
|
32
|
+
probeAddable: (distros) => ipcRenderer.invoke("wsl-servers-probe-addable", distros),
|
|
33
|
+
installNeurocode: (name) => ipcRenderer.invoke("wsl-servers-install-neurocode", name),
|
|
34
|
+
openTerminal: (name) => ipcRenderer.invoke("wsl-servers-open-terminal", name),
|
|
35
|
+
addServer: (distro) => ipcRenderer.invoke("wsl-servers-add", distro),
|
|
36
|
+
removeServer: (id) => ipcRenderer.invoke("wsl-servers-remove", id),
|
|
37
|
+
startServer: (id) => ipcRenderer.invoke("wsl-servers-start", id),
|
|
38
|
+
},
|
|
39
|
+
updater: {
|
|
40
|
+
subscribe: async (cb) => {
|
|
41
|
+
updaterCallbacks.add(cb)
|
|
42
|
+
if (updaterState) cb(updaterState)
|
|
43
|
+
if (!updaterSubscription) {
|
|
44
|
+
ipcRenderer.on("updater-state", updaterHandler)
|
|
45
|
+
updaterSubscription = ipcRenderer.invoke("updater-subscribe")
|
|
46
|
+
}
|
|
47
|
+
await updaterSubscription
|
|
48
|
+
return () => {
|
|
49
|
+
updaterCallbacks.delete(cb)
|
|
50
|
+
if (updaterCallbacks.size > 0) return
|
|
51
|
+
ipcRenderer.removeListener("updater-state", updaterHandler)
|
|
52
|
+
updaterSubscription = undefined
|
|
53
|
+
void ipcRenderer.invoke("updater-unsubscribe")
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
check: () => ipcRenderer.invoke("updater-check"),
|
|
57
|
+
install: () => ipcRenderer.invoke("updater-install"),
|
|
58
|
+
},
|
|
59
|
+
consumeInitialDeepLinks: () => ipcRenderer.invoke("consume-initial-deep-links"),
|
|
60
|
+
getDefaultServerUrl: () => ipcRenderer.invoke("get-default-server-url"),
|
|
61
|
+
setDefaultServerUrl: (url) => ipcRenderer.invoke("set-default-server-url", url),
|
|
62
|
+
isFirstLaunchOnboardingPending: () => ipcRenderer.invoke("is-first-launch-onboarding-pending"),
|
|
63
|
+
finishFirstLaunchOnboarding: (createDefaultProject) =>
|
|
64
|
+
ipcRenderer.invoke("finish-first-launch-onboarding", createDefaultProject),
|
|
65
|
+
isOldLayoutEligible: () => ipcRenderer.invoke("is-old-layout-eligible"),
|
|
66
|
+
getDisplayBackend: () => ipcRenderer.invoke("get-display-backend"),
|
|
67
|
+
setDisplayBackend: (backend) => ipcRenderer.invoke("set-display-backend", backend),
|
|
68
|
+
parseMarkdownCommand: (markdown) => ipcRenderer.invoke("parse-markdown", markdown),
|
|
69
|
+
checkAppExists: (appName) => ipcRenderer.invoke("check-app-exists", appName),
|
|
70
|
+
resolveAppPath: (appName) => ipcRenderer.invoke("resolve-app-path", appName),
|
|
71
|
+
storeGet: (name, key) => ipcRenderer.invoke("store-get", name, key),
|
|
72
|
+
storeSet: (name, key, value) => ipcRenderer.invoke("store-set", name, key, value),
|
|
73
|
+
storeDelete: (name, key) => ipcRenderer.invoke("store-delete", name, key),
|
|
74
|
+
storeClear: (name) => ipcRenderer.invoke("store-clear", name),
|
|
75
|
+
storeKeys: (name) => ipcRenderer.invoke("store-keys", name),
|
|
76
|
+
storeLength: (name) => ipcRenderer.invoke("store-length", name),
|
|
77
|
+
|
|
78
|
+
getWindowCount: () => ipcRenderer.invoke("get-window-count"),
|
|
79
|
+
getWindowID: () => ipcRenderer.invoke("get-window-id"),
|
|
80
|
+
onMenuCommand: (cb) => {
|
|
81
|
+
const handler = (_: unknown, id: string) => cb(id)
|
|
82
|
+
ipcRenderer.on("menu-command", handler)
|
|
83
|
+
return () => ipcRenderer.removeListener("menu-command", handler)
|
|
84
|
+
},
|
|
85
|
+
onDeepLink: (cb) => {
|
|
86
|
+
const handler = (_: unknown, urls: string[]) => cb(urls)
|
|
87
|
+
ipcRenderer.on("deep-link", handler)
|
|
88
|
+
return () => ipcRenderer.removeListener("deep-link", handler)
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
openDirectoryPicker: (opts) => ipcRenderer.invoke("open-directory-picker", opts),
|
|
92
|
+
openFilePicker: (opts) => ipcRenderer.invoke("open-file-picker", opts),
|
|
93
|
+
readPickedFile: (token, path) => ipcRenderer.invoke("read-picked-file", token, path),
|
|
94
|
+
releasePickedFiles: (token) => ipcRenderer.invoke("release-picked-files", token),
|
|
95
|
+
getPathForFile: (file) => webUtils.getPathForFile(file),
|
|
96
|
+
saveFilePicker: (opts) => ipcRenderer.invoke("save-file-picker", opts),
|
|
97
|
+
openLink: (url) => ipcRenderer.send("open-link", url),
|
|
98
|
+
openPath: (path, app) => ipcRenderer.invoke("open-path", path, app),
|
|
99
|
+
revealPath: (path) => ipcRenderer.invoke("reveal-path", path),
|
|
100
|
+
readClipboardImage: () => ipcRenderer.invoke("read-clipboard-image"),
|
|
101
|
+
showNotification: (title, body) => ipcRenderer.send("show-notification", title, body),
|
|
102
|
+
getWindowFocused: () => ipcRenderer.invoke("get-window-focused"),
|
|
103
|
+
setWindowFocus: () => ipcRenderer.invoke("set-window-focus"),
|
|
104
|
+
showWindow: () => ipcRenderer.invoke("show-window"),
|
|
105
|
+
relaunch: () => ipcRenderer.send("relaunch"),
|
|
106
|
+
getZoomFactor: () => ipcRenderer.invoke("get-zoom-factor"),
|
|
107
|
+
setZoomFactor: (factor) => ipcRenderer.invoke("set-zoom-factor", factor),
|
|
108
|
+
getPinchZoomEnabled: () => ipcRenderer.invoke("get-pinch-zoom-enabled"),
|
|
109
|
+
setPinchZoomEnabled: (enabled) => ipcRenderer.invoke("set-pinch-zoom-enabled", enabled),
|
|
110
|
+
onPinchZoomEnabledChanged: (cb) => {
|
|
111
|
+
const handler = (_: unknown, enabled: boolean) => cb(enabled)
|
|
112
|
+
ipcRenderer.on("pinch-zoom-enabled-changed", handler)
|
|
113
|
+
return () => ipcRenderer.removeListener("pinch-zoom-enabled-changed", handler)
|
|
114
|
+
},
|
|
115
|
+
onZoomFactorChanged: (cb) => {
|
|
116
|
+
const handler = (_: unknown, factor: number) => cb(factor)
|
|
117
|
+
ipcRenderer.on("zoom-factor-changed", handler)
|
|
118
|
+
return () => ipcRenderer.removeListener("zoom-factor-changed", handler)
|
|
119
|
+
},
|
|
120
|
+
setTitlebar: (theme) => ipcRenderer.invoke("set-titlebar", theme),
|
|
121
|
+
runDesktopMenuAction: (action) => ipcRenderer.invoke("run-desktop-menu-action", action),
|
|
122
|
+
setBackgroundColor: (color: string) => ipcRenderer.invoke("set-background-color", color),
|
|
123
|
+
exportDebugLogs: () => ipcRenderer.invoke("export-debug-logs"),
|
|
124
|
+
setForceFocus: (enabled) => ipcRenderer.invoke("set-force-focus", enabled),
|
|
125
|
+
recordFatalRendererError: (error) => ipcRenderer.invoke("record-fatal-renderer-error", error),
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
contextBridge.exposeInMainWorld("api", api)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { DesktopMenuAction } from "@neurocode-ai/app/desktop-menu"
|
|
2
|
+
import type { WslServersPlatform } from "@neurocode-ai/app/wsl/types"
|
|
3
|
+
import type { UpdaterState } from "@neurocode-ai/app/updater"
|
|
4
|
+
export type {
|
|
5
|
+
WslDistroProbe,
|
|
6
|
+
WslInstalledDistro,
|
|
7
|
+
WslJob,
|
|
8
|
+
WslOnlineDistro,
|
|
9
|
+
WslNeurocodeCheck,
|
|
10
|
+
WslRuntimeCheck,
|
|
11
|
+
WslServerConfig,
|
|
12
|
+
WslServerItem,
|
|
13
|
+
WslServerRuntime,
|
|
14
|
+
WslServersEvent,
|
|
15
|
+
WslServersState,
|
|
16
|
+
} from "@neurocode-ai/app/wsl/types"
|
|
17
|
+
|
|
18
|
+
export type ServerReadyData = {
|
|
19
|
+
url: string
|
|
20
|
+
username: string | null
|
|
21
|
+
password: string | null
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type WslServersAPI = WslServersPlatform
|
|
25
|
+
export type UpdaterAPI = {
|
|
26
|
+
subscribe: (cb: (state: UpdaterState) => void) => Promise<() => void>
|
|
27
|
+
check: () => Promise<UpdaterState>
|
|
28
|
+
install: () => Promise<void>
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type LinuxDisplayBackend = "wayland" | "auto"
|
|
32
|
+
export type TitlebarTheme = {
|
|
33
|
+
mode: "light" | "dark"
|
|
34
|
+
scheme?: "system" | "light" | "dark"
|
|
35
|
+
}
|
|
36
|
+
export type FatalRendererError = {
|
|
37
|
+
error: string
|
|
38
|
+
url: string
|
|
39
|
+
version?: string
|
|
40
|
+
platform: string
|
|
41
|
+
os?: string
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type ElectronAPI = {
|
|
45
|
+
killSidecar: () => Promise<void>
|
|
46
|
+
installCli: () => Promise<string>
|
|
47
|
+
awaitInitialization: () => Promise<ServerReadyData>
|
|
48
|
+
wslServers: WslServersAPI
|
|
49
|
+
updater: UpdaterAPI
|
|
50
|
+
consumeInitialDeepLinks: () => Promise<string[]>
|
|
51
|
+
getDefaultServerUrl: () => Promise<string | null>
|
|
52
|
+
setDefaultServerUrl: (url: string | null) => Promise<void>
|
|
53
|
+
isFirstLaunchOnboardingPending: () => Promise<boolean>
|
|
54
|
+
finishFirstLaunchOnboarding: (createDefaultProject: boolean) => Promise<string | null>
|
|
55
|
+
isOldLayoutEligible: () => Promise<boolean>
|
|
56
|
+
getDisplayBackend: () => Promise<LinuxDisplayBackend | null>
|
|
57
|
+
setDisplayBackend: (backend: LinuxDisplayBackend | null) => Promise<void>
|
|
58
|
+
parseMarkdownCommand: (markdown: string) => Promise<string>
|
|
59
|
+
checkAppExists: (appName: string) => Promise<boolean>
|
|
60
|
+
resolveAppPath: (appName: string) => Promise<string | null>
|
|
61
|
+
storeGet: (name: string, key: string) => Promise<string | null>
|
|
62
|
+
storeSet: (name: string, key: string, value: string) => Promise<void>
|
|
63
|
+
storeDelete: (name: string, key: string) => Promise<void>
|
|
64
|
+
storeClear: (name: string) => Promise<void>
|
|
65
|
+
storeKeys: (name: string) => Promise<string[]>
|
|
66
|
+
storeLength: (name: string) => Promise<number>
|
|
67
|
+
|
|
68
|
+
getWindowCount: () => Promise<number>
|
|
69
|
+
getWindowID: () => Promise<string>
|
|
70
|
+
onMenuCommand: (cb: (id: string) => void) => () => void
|
|
71
|
+
onDeepLink: (cb: (urls: string[]) => void) => () => void
|
|
72
|
+
|
|
73
|
+
openDirectoryPicker: (opts?: {
|
|
74
|
+
multiple?: boolean
|
|
75
|
+
title?: string
|
|
76
|
+
defaultPath?: string
|
|
77
|
+
}) => Promise<string | string[] | null>
|
|
78
|
+
openFilePicker: (opts?: {
|
|
79
|
+
multiple?: boolean
|
|
80
|
+
title?: string
|
|
81
|
+
defaultPath?: string
|
|
82
|
+
extensions?: string[]
|
|
83
|
+
}) => Promise<{ token: string; files: { path: string; name: string; size: number }[] } | null>
|
|
84
|
+
readPickedFile: (token: string, path: string) => Promise<ArrayBuffer>
|
|
85
|
+
releasePickedFiles: (token: string) => Promise<void>
|
|
86
|
+
getPathForFile: (file: File) => string
|
|
87
|
+
saveFilePicker: (opts?: { title?: string; defaultPath?: string }) => Promise<string | null>
|
|
88
|
+
openLink: (url: string) => void
|
|
89
|
+
openPath: (path: string, app?: string) => Promise<void>
|
|
90
|
+
revealPath: (path: string) => Promise<boolean>
|
|
91
|
+
readClipboardImage: () => Promise<{ buffer: ArrayBuffer; width: number; height: number } | null>
|
|
92
|
+
showNotification: (title: string, body?: string) => void
|
|
93
|
+
getWindowFocused: () => Promise<boolean>
|
|
94
|
+
setWindowFocus: () => Promise<void>
|
|
95
|
+
showWindow: () => Promise<void>
|
|
96
|
+
relaunch: () => void
|
|
97
|
+
getZoomFactor: () => Promise<number>
|
|
98
|
+
setZoomFactor: (factor: number) => Promise<void>
|
|
99
|
+
getPinchZoomEnabled: () => Promise<boolean>
|
|
100
|
+
setPinchZoomEnabled: (enabled: boolean) => Promise<void>
|
|
101
|
+
onPinchZoomEnabledChanged: (cb: (enabled: boolean) => void) => () => void
|
|
102
|
+
onZoomFactorChanged: (cb: (factor: number) => void) => () => void
|
|
103
|
+
setTitlebar: (theme: TitlebarTheme) => Promise<void>
|
|
104
|
+
runDesktopMenuAction: (action: DesktopMenuAction) => Promise<void>
|
|
105
|
+
setBackgroundColor: (color: string) => Promise<void>
|
|
106
|
+
exportDebugLogs: () => Promise<string>
|
|
107
|
+
setForceFocus: (enabled: boolean) => Promise<void>
|
|
108
|
+
recordFatalRendererError: (error: FatalRendererError) => Promise<void>
|
|
109
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { initI18n, t } from "./i18n"
|
|
2
|
+
|
|
3
|
+
export async function installCli(): Promise<void> {
|
|
4
|
+
await initI18n()
|
|
5
|
+
|
|
6
|
+
try {
|
|
7
|
+
const path = await window.api.installCli()
|
|
8
|
+
window.alert(t("desktop.cli.installed.message", { path }))
|
|
9
|
+
} catch (e) {
|
|
10
|
+
window.alert(t("desktop.cli.failed.message", { error: String(e) }))
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test"
|
|
2
|
+
import { join, dirname, resolve } from "node:path"
|
|
3
|
+
import { existsSync } from "node:fs"
|
|
4
|
+
import { fileURLToPath } from "node:url"
|
|
5
|
+
|
|
6
|
+
const dir = dirname(fileURLToPath(import.meta.url))
|
|
7
|
+
const root = resolve(dir, "../..")
|
|
8
|
+
|
|
9
|
+
const html = async (name: string) => Bun.file(join(dir, name)).text()
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Packaged Electron windows load renderer HTML via the privileged `oc://`
|
|
13
|
+
* protocol. Root-relative asset paths like `src="/foo.js"` would resolve from
|
|
14
|
+
* the protocol origin root instead of relative to the current HTML entrypoint.
|
|
15
|
+
*
|
|
16
|
+
* All local resource references must use relative paths (`./`).
|
|
17
|
+
*/
|
|
18
|
+
describe("electron renderer html", () => {
|
|
19
|
+
for (const name of ["index.html"]) {
|
|
20
|
+
describe(name, () => {
|
|
21
|
+
test("script src attributes use relative paths", async () => {
|
|
22
|
+
const content = await html(name)
|
|
23
|
+
const srcs = [...content.matchAll(/\bsrc=["']([^"']+)["']/g)].map((m) => m[1])
|
|
24
|
+
for (const src of srcs) {
|
|
25
|
+
expect(src).not.toMatch(/^\/[^/]/)
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test("link href attributes use relative paths", async () => {
|
|
30
|
+
const content = await html(name)
|
|
31
|
+
const hrefs = [...content.matchAll(/<link[^>]+href=["']([^"']+)["']/g)].map((m) => m[1])
|
|
32
|
+
for (const href of hrefs) {
|
|
33
|
+
expect(href).not.toMatch(/^\/[^/]/)
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
test("no web manifest link (not applicable in Electron)", async () => {
|
|
38
|
+
const content = await html(name)
|
|
39
|
+
expect(content).not.toContain('rel="manifest"')
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Vite resolves `publicDir` relative to `root`, not the config file.
|
|
47
|
+
* This test reads the actual values from electron.vite.config.ts to catch
|
|
48
|
+
* regressions where the publicDir path no longer resolves correctly
|
|
49
|
+
* after the renderer root is accounted for.
|
|
50
|
+
*/
|
|
51
|
+
describe("electron vite publicDir", () => {
|
|
52
|
+
test("configured publicDir resolves to a directory with oc-theme-preload.js", async () => {
|
|
53
|
+
const config = await Bun.file(join(root, "electron.vite.config.ts")).text()
|
|
54
|
+
const pub = config.match(/publicDir:\s*["']([^"']+)["']/)
|
|
55
|
+
const rendererRoot = config.match(/root:\s*["']([^"']+)["']/)
|
|
56
|
+
expect(pub).not.toBeNull()
|
|
57
|
+
expect(rendererRoot).not.toBeNull()
|
|
58
|
+
const resolved = resolve(root, rendererRoot![1], pub![1])
|
|
59
|
+
expect(existsSync(resolved)).toBe(true)
|
|
60
|
+
expect(existsSync(join(resolved, "oc-theme-preload.js"))).toBe(true)
|
|
61
|
+
})
|
|
62
|
+
})
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "التحقق من وجود تحديثات...",
|
|
3
|
+
"desktop.menu.installCli": "تثبيت CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "إعادة تحميل Webview",
|
|
5
|
+
"desktop.menu.restart": "إعادة تشغيل",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "اختر مجلدًا",
|
|
8
|
+
"desktop.dialog.chooseFile": "اختر ملفًا",
|
|
9
|
+
"desktop.dialog.saveFile": "حفظ ملف",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "فشل التحقق من التحديثات",
|
|
12
|
+
"desktop.updater.checkFailed.message": "فشل التحقق من وجود تحديثات",
|
|
13
|
+
"desktop.updater.none.title": "لا توجد تحديثات متاحة",
|
|
14
|
+
"desktop.updater.none.message": "أنت تستخدم بالفعل أحدث إصدار من NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "فشل التحديث",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "فشل تنزيل التحديث",
|
|
17
|
+
"desktop.updater.downloaded.title": "تم تنزيل التحديث",
|
|
18
|
+
"desktop.updater.downloaded.prompt": "تم تنزيل إصدار {{version}} من NeuroCode، هل ترغب في تثبيته وإعادة تشغيله؟",
|
|
19
|
+
"desktop.updater.installFailed.title": "فشل التحديث",
|
|
20
|
+
"desktop.updater.installFailed.message": "فشل تثبيت التحديث",
|
|
21
|
+
|
|
22
|
+
"desktop.cli.installed.title": "تم تثبيت CLI",
|
|
23
|
+
"desktop.cli.installed.message": "تم تثبيت CLI في {{path}}\n\nأعد تشغيل الطرفية لاستخدام الأمر 'NeuroCode'.",
|
|
24
|
+
"desktop.cli.failed.title": "فشل التثبيت",
|
|
25
|
+
"desktop.cli.failed.message": "فشل تثبيت CLI: {{error}}",
|
|
26
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Verificar atualizações...",
|
|
3
|
+
"desktop.menu.installCli": "Instalar CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Recarregar Webview",
|
|
5
|
+
"desktop.menu.restart": "Reiniciar",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Escolher uma pasta",
|
|
8
|
+
"desktop.dialog.chooseFile": "Escolher um arquivo",
|
|
9
|
+
"desktop.dialog.saveFile": "Salvar arquivo",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Falha ao verificar atualizações",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Falha ao verificar atualizações",
|
|
13
|
+
"desktop.updater.none.title": "Nenhuma atualização disponível",
|
|
14
|
+
"desktop.updater.none.message": "Você já está usando a versão mais recente do NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Falha na atualização",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Falha ao baixar a atualização",
|
|
17
|
+
"desktop.updater.downloaded.title": "Atualização baixada",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"A versão {{version}} do NeuroCode foi baixada. Você gostaria de instalá-la e reiniciar?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Falha na atualização",
|
|
21
|
+
"desktop.updater.installFailed.message": "Falha ao instalar a atualização",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI instalada",
|
|
24
|
+
"desktop.cli.installed.message": "CLI instalada em {{path}}\n\nReinicie seu terminal para usar o comando 'NeuroCode'.",
|
|
25
|
+
"desktop.cli.failed.title": "Falha na instalação",
|
|
26
|
+
"desktop.cli.failed.message": "Falha ao instalar a CLI: {{error}}",
|
|
27
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Provjeri ažuriranja...",
|
|
3
|
+
"desktop.menu.installCli": "Instaliraj CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Ponovo učitavanje webview-a",
|
|
5
|
+
"desktop.menu.restart": "Restartuj",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Odaberi folder",
|
|
8
|
+
"desktop.dialog.chooseFile": "Odaberi datoteku",
|
|
9
|
+
"desktop.dialog.saveFile": "Sačuvaj datoteku",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Provjera ažuriranja nije uspjela",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Nije moguće provjeriti ažuriranja",
|
|
13
|
+
"desktop.updater.none.title": "Nema dostupnog ažuriranja",
|
|
14
|
+
"desktop.updater.none.message": "Već koristiš najnoviju verziju NeuroCode-a",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Ažuriranje nije uspjelo",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Neuspjelo preuzimanje ažuriranja",
|
|
17
|
+
"desktop.updater.downloaded.title": "Ažuriranje preuzeto",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"Verzija {{version}} NeuroCode-a je preuzeta. Želiš li da je instaliraš i ponovo pokreneš aplikaciju?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Ažuriranje nije uspjelo",
|
|
21
|
+
"desktop.updater.installFailed.message": "Neuspjela instalacija ažuriranja",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI instaliran",
|
|
24
|
+
"desktop.cli.installed.message":
|
|
25
|
+
"CLI je instaliran u {{path}}\n\nRestartuj terminal da bi koristio komandu 'NeuroCode'.",
|
|
26
|
+
"desktop.cli.failed.title": "Instalacija nije uspjela",
|
|
27
|
+
"desktop.cli.failed.message": "Neuspjela instalacija CLI-a: {{error}}",
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Tjek for opdateringer...",
|
|
3
|
+
"desktop.menu.installCli": "Installer CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Genindlæs Webview",
|
|
5
|
+
"desktop.menu.restart": "Genstart",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Vælg en mappe",
|
|
8
|
+
"desktop.dialog.chooseFile": "Vælg en fil",
|
|
9
|
+
"desktop.dialog.saveFile": "Gem fil",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Opdateringstjek mislykkedes",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Kunne ikke tjekke for opdateringer",
|
|
13
|
+
"desktop.updater.none.title": "Ingen opdatering tilgængelig",
|
|
14
|
+
"desktop.updater.none.message": "Du bruger allerede den nyeste version af NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Opdatering mislykkedes",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Kunne ikke downloade opdateringen",
|
|
17
|
+
"desktop.updater.downloaded.title": "Opdatering downloadet",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"Version {{version}} af NeuroCode er blevet downloadet. Vil du installere den og genstarte?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Opdatering mislykkedes",
|
|
21
|
+
"desktop.updater.installFailed.message": "Kunne ikke installere opdateringen",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI installeret",
|
|
24
|
+
"desktop.cli.installed.message":
|
|
25
|
+
"CLI installeret i {{path}}\n\nGenstart din terminal for at bruge 'NeuroCode'-kommandoen.",
|
|
26
|
+
"desktop.cli.failed.title": "Installation mislykkedes",
|
|
27
|
+
"desktop.cli.failed.message": "Kunne ikke installere CLI: {{error}}",
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Nach Updates suchen...",
|
|
3
|
+
"desktop.menu.installCli": "CLI installieren...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Webview neu laden",
|
|
5
|
+
"desktop.menu.restart": "Neustart",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Ordner auswählen",
|
|
8
|
+
"desktop.dialog.chooseFile": "Datei auswählen",
|
|
9
|
+
"desktop.dialog.saveFile": "Datei speichern",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Updateprüfung fehlgeschlagen",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Updates konnten nicht geprüft werden",
|
|
13
|
+
"desktop.updater.none.title": "Kein Update verfügbar",
|
|
14
|
+
"desktop.updater.none.message": "Sie verwenden bereits die neueste Version von NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Update fehlgeschlagen",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Update konnte nicht heruntergeladen werden",
|
|
17
|
+
"desktop.updater.downloaded.title": "Update heruntergeladen",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"Version {{version}} von NeuroCode wurde heruntergeladen. Möchten Sie sie installieren und neu starten?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Update fehlgeschlagen",
|
|
21
|
+
"desktop.updater.installFailed.message": "Update konnte nicht installiert werden",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI installiert",
|
|
24
|
+
"desktop.cli.installed.message":
|
|
25
|
+
"CLI wurde in {{path}} installiert\n\nStarten Sie Ihr Terminal neu, um den Befehl 'NeuroCode' zu verwenden.",
|
|
26
|
+
"desktop.cli.failed.title": "Installation fehlgeschlagen",
|
|
27
|
+
"desktop.cli.failed.message": "CLI konnte nicht installiert werden: {{error}}",
|
|
28
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Check for Updates...",
|
|
3
|
+
"desktop.menu.installCli": "Install CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Reload Webview",
|
|
5
|
+
"desktop.menu.restart": "Restart",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Choose a folder",
|
|
8
|
+
"desktop.dialog.chooseFile": "Choose a file",
|
|
9
|
+
"desktop.dialog.saveFile": "Save file",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Update Check Failed",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Failed to check for updates",
|
|
13
|
+
"desktop.updater.none.title": "No Update Available",
|
|
14
|
+
"desktop.updater.none.message": "You are already using the latest version of NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Update Failed",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Failed to download update",
|
|
17
|
+
"desktop.updater.downloaded.title": "Update Downloaded",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"Version {{version}} of NeuroCode has been downloaded, would you like to install it and relaunch?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Update Failed",
|
|
21
|
+
"desktop.updater.installFailed.message": "Failed to install update",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI Installed",
|
|
24
|
+
"desktop.cli.installed.message": "CLI installed to {{path}}\n\nRestart your terminal to use the 'NeuroCode' command.",
|
|
25
|
+
"desktop.cli.failed.title": "Installation Failed",
|
|
26
|
+
"desktop.cli.failed.message": "Failed to install CLI: {{error}}",
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Buscar actualizaciones...",
|
|
3
|
+
"desktop.menu.installCli": "Instalar CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Recargar Webview",
|
|
5
|
+
"desktop.menu.restart": "Reiniciar",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Elegir una carpeta",
|
|
8
|
+
"desktop.dialog.chooseFile": "Elegir un archivo",
|
|
9
|
+
"desktop.dialog.saveFile": "Guardar archivo",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Comprobación de actualizaciones fallida",
|
|
12
|
+
"desktop.updater.checkFailed.message": "No se pudieron buscar actualizaciones",
|
|
13
|
+
"desktop.updater.none.title": "No hay actualizaciones disponibles",
|
|
14
|
+
"desktop.updater.none.message": "Ya estás usando la versión más reciente de NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Actualización fallida",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "No se pudo descargar la actualización",
|
|
17
|
+
"desktop.updater.downloaded.title": "Actualización descargada",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"Se ha descargado la versión {{version}} de NeuroCode. ¿Quieres instalarla y reiniciar?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Actualización fallida",
|
|
21
|
+
"desktop.updater.installFailed.message": "No se pudo instalar la actualización",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI instalada",
|
|
24
|
+
"desktop.cli.installed.message": "CLI instalada en {{path}}\n\nReinicia tu terminal para usar el comando 'NeuroCode'.",
|
|
25
|
+
"desktop.cli.failed.title": "Instalación fallida",
|
|
26
|
+
"desktop.cli.failed.message": "No se pudo instalar la CLI: {{error}}",
|
|
27
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const dict = {
|
|
2
|
+
"desktop.menu.checkForUpdates": "Vérifier les mises à jour...",
|
|
3
|
+
"desktop.menu.installCli": "Installer la CLI...",
|
|
4
|
+
"desktop.menu.reloadWebview": "Recharger la Webview",
|
|
5
|
+
"desktop.menu.restart": "Redémarrer",
|
|
6
|
+
|
|
7
|
+
"desktop.dialog.chooseFolder": "Choisir un dossier",
|
|
8
|
+
"desktop.dialog.chooseFile": "Choisir un fichier",
|
|
9
|
+
"desktop.dialog.saveFile": "Enregistrer le fichier",
|
|
10
|
+
|
|
11
|
+
"desktop.updater.checkFailed.title": "Échec de la vérification des mises à jour",
|
|
12
|
+
"desktop.updater.checkFailed.message": "Impossible de vérifier les mises à jour",
|
|
13
|
+
"desktop.updater.none.title": "Aucune mise à jour disponible",
|
|
14
|
+
"desktop.updater.none.message": "Vous utilisez déjà la dernière version d'NeuroCode",
|
|
15
|
+
"desktop.updater.downloadFailed.title": "Échec de la mise à jour",
|
|
16
|
+
"desktop.updater.downloadFailed.message": "Impossible de télécharger la mise à jour",
|
|
17
|
+
"desktop.updater.downloaded.title": "Mise à jour téléchargée",
|
|
18
|
+
"desktop.updater.downloaded.prompt":
|
|
19
|
+
"La version {{version}} d'NeuroCode a été téléchargée. Voulez-vous l'installer et redémarrer ?",
|
|
20
|
+
"desktop.updater.installFailed.title": "Échec de la mise à jour",
|
|
21
|
+
"desktop.updater.installFailed.message": "Impossible d'installer la mise à jour",
|
|
22
|
+
|
|
23
|
+
"desktop.cli.installed.title": "CLI installée",
|
|
24
|
+
"desktop.cli.installed.message":
|
|
25
|
+
"CLI installée dans {{path}}\n\nRedémarrez votre terminal pour utiliser la commande 'NeuroCode'.",
|
|
26
|
+
"desktop.cli.failed.title": "Échec de l'installation",
|
|
27
|
+
"desktop.cli.failed.message": "Impossible d'installer la CLI : {{error}}",
|
|
28
|
+
}
|