connection fixes
This commit is contained in:
4
desktop-operator/desktop-operator.log
Normal file
4
desktop-operator/desktop-operator.log
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
> godeye-operator@1.0.0 start
|
||||
> electron .
|
||||
|
||||
4046
desktop-operator/god-eye.log
Normal file
4046
desktop-operator/god-eye.log
Normal file
File diff suppressed because it is too large
Load Diff
18
desktop-operator/node_modules/.package-lock.json
generated
vendored
18
desktop-operator/node_modules/.package-lock.json
generated
vendored
@@ -676,9 +676,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "22.18.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz",
|
||||
"integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==",
|
||||
"version": "22.18.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz",
|
||||
"integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~6.21.0"
|
||||
@@ -1915,9 +1915,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/electron": {
|
||||
"version": "38.2.0",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-38.2.0.tgz",
|
||||
"integrity": "sha512-Cw5Mb+N5NxsG0Hc1qr8I65Kt5APRrbgTtEEn3zTod30UNJRnAE1xbGk/1NOaDn3ODzI/MYn6BzT9T9zreP7xWA==",
|
||||
"version": "38.2.1",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-38.2.1.tgz",
|
||||
"integrity": "sha512-P4pE2RpRg3kM8IeOK+heg6iAxR5wcXnNHrbVchn7M3GBnYAhjfJRkROusdOro5PlKzdtfKjesbbqaG4MqQXccg==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
@@ -4468,9 +4468,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.9.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
|
||||
"integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
|
||||
"version": "5.9.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
|
||||
2
desktop-operator/node_modules/@types/node/README.md
generated
vendored
2
desktop-operator/node_modules/@types/node/README.md
generated
vendored
@@ -8,7 +8,7 @@ This package contains type definitions for node (https://nodejs.org/).
|
||||
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node/v22.
|
||||
|
||||
### Additional Details
|
||||
* Last updated: Thu, 18 Sep 2025 00:04:03 GMT
|
||||
* Last updated: Tue, 30 Sep 2025 23:32:16 GMT
|
||||
* Dependencies: [undici-types](https://npmjs.com/package/undici-types)
|
||||
|
||||
# Credits
|
||||
|
||||
19
desktop-operator/node_modules/@types/node/assert.d.ts
generated
vendored
19
desktop-operator/node_modules/@types/node/assert.d.ts
generated
vendored
@@ -11,6 +11,25 @@ declare module "assert" {
|
||||
*/
|
||||
function assert(value: unknown, message?: string | Error): asserts value;
|
||||
namespace assert {
|
||||
type AssertMethodNames =
|
||||
| "deepEqual"
|
||||
| "deepStrictEqual"
|
||||
| "doesNotMatch"
|
||||
| "doesNotReject"
|
||||
| "doesNotThrow"
|
||||
| "equal"
|
||||
| "fail"
|
||||
| "ifError"
|
||||
| "match"
|
||||
| "notDeepEqual"
|
||||
| "notDeepStrictEqual"
|
||||
| "notEqual"
|
||||
| "notStrictEqual"
|
||||
| "ok"
|
||||
| "partialDeepStrictEqual"
|
||||
| "rejects"
|
||||
| "strictEqual"
|
||||
| "throws";
|
||||
/**
|
||||
* Indicates the failure of an assertion. All errors thrown by the `node:assert` module will be instances of the `AssertionError` class.
|
||||
*/
|
||||
|
||||
112
desktop-operator/node_modules/@types/node/events.d.ts
generated
vendored
112
desktop-operator/node_modules/@types/node/events.d.ts
generated
vendored
@@ -36,39 +36,6 @@
|
||||
*/
|
||||
declare module "events" {
|
||||
import { AsyncResource, AsyncResourceOptions } from "node:async_hooks";
|
||||
// NOTE: This class is in the docs but is **not actually exported** by Node.
|
||||
// If https://github.com/nodejs/node/issues/39903 gets resolved and Node
|
||||
// actually starts exporting the class, uncomment below.
|
||||
// import { EventListener, EventListenerObject } from '__dom-events';
|
||||
// /** The NodeEventTarget is a Node.js-specific extension to EventTarget that emulates a subset of the EventEmitter API. */
|
||||
// interface NodeEventTarget extends EventTarget {
|
||||
// /**
|
||||
// * Node.js-specific extension to the `EventTarget` class that emulates the equivalent `EventEmitter` API.
|
||||
// * The only difference between `addListener()` and `addEventListener()` is that addListener() will return a reference to the EventTarget.
|
||||
// */
|
||||
// addListener(type: string, listener: EventListener | EventListenerObject, options?: { once: boolean }): this;
|
||||
// /** Node.js-specific extension to the `EventTarget` class that returns an array of event `type` names for which event listeners are registered. */
|
||||
// eventNames(): string[];
|
||||
// /** Node.js-specific extension to the `EventTarget` class that returns the number of event listeners registered for the `type`. */
|
||||
// listenerCount(type: string): number;
|
||||
// /** Node.js-specific alias for `eventTarget.removeListener()`. */
|
||||
// off(type: string, listener: EventListener | EventListenerObject): this;
|
||||
// /** Node.js-specific alias for `eventTarget.addListener()`. */
|
||||
// on(type: string, listener: EventListener | EventListenerObject, options?: { once: boolean }): this;
|
||||
// /** Node.js-specific extension to the `EventTarget` class that adds a `once` listener for the given event `type`. This is equivalent to calling `on` with the `once` option set to `true`. */
|
||||
// once(type: string, listener: EventListener | EventListenerObject): this;
|
||||
// /**
|
||||
// * Node.js-specific extension to the `EventTarget` class.
|
||||
// * If `type` is specified, removes all registered listeners for `type`,
|
||||
// * otherwise removes all registered listeners.
|
||||
// */
|
||||
// removeAllListeners(type: string): this;
|
||||
// /**
|
||||
// * Node.js-specific extension to the `EventTarget` class that removes the listener for the given `type`.
|
||||
// * The only difference between `removeListener()` and `removeEventListener()` is that `removeListener()` will return a reference to the `EventTarget`.
|
||||
// */
|
||||
// removeListener(type: string, listener: EventListener | EventListenerObject): this;
|
||||
// }
|
||||
interface EventEmitterOptions {
|
||||
/**
|
||||
* Enables automatic capturing of promise rejection.
|
||||
@@ -584,6 +551,85 @@ declare module "events" {
|
||||
*/
|
||||
readonly asyncResource: EventEmitterReferencingAsyncResource;
|
||||
}
|
||||
/**
|
||||
* The `NodeEventTarget` is a Node.js-specific extension to `EventTarget`
|
||||
* that emulates a subset of the `EventEmitter` API.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
export interface NodeEventTarget extends EventTarget {
|
||||
/**
|
||||
* Node.js-specific extension to the `EventTarget` class that emulates the
|
||||
* equivalent `EventEmitter` API. The only difference between `addListener()` and
|
||||
* `addEventListener()` is that `addListener()` will return a reference to the
|
||||
* `EventTarget`.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
addListener(type: string, listener: (arg: any) => void): this;
|
||||
/**
|
||||
* Node.js-specific extension to the `EventTarget` class that dispatches the
|
||||
* `arg` to the list of handlers for `type`.
|
||||
* @since v15.2.0
|
||||
* @returns `true` if event listeners registered for the `type` exist,
|
||||
* otherwise `false`.
|
||||
*/
|
||||
emit(type: string, arg: any): boolean;
|
||||
/**
|
||||
* Node.js-specific extension to the `EventTarget` class that returns an array
|
||||
* of event `type` names for which event listeners are registered.
|
||||
* @since 14.5.0
|
||||
*/
|
||||
eventNames(): string[];
|
||||
/**
|
||||
* Node.js-specific extension to the `EventTarget` class that returns the number
|
||||
* of event listeners registered for the `type`.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
listenerCount(type: string): number;
|
||||
/**
|
||||
* Node.js-specific extension to the `EventTarget` class that sets the number
|
||||
* of max event listeners as `n`.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
setMaxListeners(n: number): void;
|
||||
/**
|
||||
* Node.js-specific extension to the `EventTarget` class that returns the number
|
||||
* of max event listeners.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
getMaxListeners(): number;
|
||||
/**
|
||||
* Node.js-specific alias for `eventTarget.removeEventListener()`.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
off(type: string, listener: (arg: any) => void, options?: EventListenerOptions): this;
|
||||
/**
|
||||
* Node.js-specific alias for `eventTarget.addEventListener()`.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
on(type: string, listener: (arg: any) => void): this;
|
||||
/**
|
||||
* Node.js-specific extension to the `EventTarget` class that adds a `once`
|
||||
* listener for the given event `type`. This is equivalent to calling `on`
|
||||
* with the `once` option set to `true`.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
once(type: string, listener: (arg: any) => void): this;
|
||||
/**
|
||||
* Node.js-specific extension to the `EventTarget` class. If `type` is specified,
|
||||
* removes all registered listeners for `type`, otherwise removes all registered
|
||||
* listeners.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
removeAllListeners(type?: string): this;
|
||||
/**
|
||||
* Node.js-specific extension to the `EventTarget` class that removes the
|
||||
* `listener` for the given `type`. The only difference between `removeListener()`
|
||||
* and `removeEventListener()` is that `removeListener()` will return a reference
|
||||
* to the `EventTarget`.
|
||||
* @since v14.5.0
|
||||
*/
|
||||
removeListener(type: string, listener: (arg: any) => void, options?: EventListenerOptions): this;
|
||||
}
|
||||
}
|
||||
global {
|
||||
namespace NodeJS {
|
||||
|
||||
4
desktop-operator/node_modules/@types/node/package.json
generated
vendored
4
desktop-operator/node_modules/@types/node/package.json
generated
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@types/node",
|
||||
"version": "22.18.6",
|
||||
"version": "22.18.8",
|
||||
"description": "TypeScript definitions for node",
|
||||
"homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node",
|
||||
"license": "MIT",
|
||||
@@ -140,6 +140,6 @@
|
||||
"undici-types": "~6.21.0"
|
||||
},
|
||||
"peerDependencies": {},
|
||||
"typesPublisherContentHash": "223d0ed2825fc2dbdef1d6dd0cb95b10912c9cb13dc3bdb5a089e502d84cbb1b",
|
||||
"typesPublisherContentHash": "044f75e3119c1f821a07c434b16c3cebf99c812c67c1db15d8b7abd8caad071d",
|
||||
"typeScriptVersion": "5.2"
|
||||
}
|
||||
25
desktop-operator/node_modules/@types/node/test.d.ts
generated
vendored
25
desktop-operator/node_modules/@types/node/test.d.ts
generated
vendored
@@ -79,6 +79,7 @@
|
||||
* @see [source](https://github.com/nodejs/node/blob/v22.x/lib/test.js)
|
||||
*/
|
||||
declare module "node:test" {
|
||||
import { AssertMethodNames } from "node:assert";
|
||||
import { Readable } from "node:stream";
|
||||
import TestFn = test.TestFn;
|
||||
import TestOptions = test.TestOptions;
|
||||
@@ -1157,29 +1158,7 @@ declare module "node:test" {
|
||||
*/
|
||||
readonly mock: MockTracker;
|
||||
}
|
||||
interface TestContextAssert extends
|
||||
Pick<
|
||||
typeof import("assert"),
|
||||
| "deepEqual"
|
||||
| "deepStrictEqual"
|
||||
| "doesNotMatch"
|
||||
| "doesNotReject"
|
||||
| "doesNotThrow"
|
||||
| "equal"
|
||||
| "fail"
|
||||
| "ifError"
|
||||
| "match"
|
||||
| "notDeepEqual"
|
||||
| "notDeepStrictEqual"
|
||||
| "notEqual"
|
||||
| "notStrictEqual"
|
||||
| "ok"
|
||||
| "partialDeepStrictEqual"
|
||||
| "rejects"
|
||||
| "strictEqual"
|
||||
| "throws"
|
||||
>
|
||||
{
|
||||
interface TestContextAssert extends Pick<typeof import("assert"), AssertMethodNames> {
|
||||
/**
|
||||
* This function serializes `value` and writes it to the file specified by `path`.
|
||||
*
|
||||
|
||||
3
desktop-operator/node_modules/@types/node/web-globals/events.d.ts
generated
vendored
3
desktop-operator/node_modules/@types/node/web-globals/events.d.ts
generated
vendored
@@ -51,6 +51,7 @@ interface EventListenerObject {
|
||||
handleEvent(object: Event): void;
|
||||
}
|
||||
|
||||
type _EventListenerOptions = typeof globalThis extends { onmessage: any } ? {} : EventListenerOptions;
|
||||
interface EventListenerOptions {
|
||||
capture?: boolean;
|
||||
}
|
||||
@@ -85,6 +86,8 @@ declare global {
|
||||
new(type: string, eventInitDict?: EventInit): Event;
|
||||
};
|
||||
|
||||
interface EventListenerOptions extends _EventListenerOptions {}
|
||||
|
||||
interface EventTarget extends _EventTarget {}
|
||||
var EventTarget: typeof globalThis extends { onmessage: any; EventTarget: infer T } ? T
|
||||
: {
|
||||
|
||||
66
desktop-operator/node_modules/@types/node/worker_threads.d.ts
generated
vendored
66
desktop-operator/node_modules/@types/node/worker_threads.d.ts
generated
vendored
@@ -56,7 +56,7 @@
|
||||
*/
|
||||
declare module "worker_threads" {
|
||||
import { Context } from "node:vm";
|
||||
import { EventEmitter } from "node:events";
|
||||
import { EventEmitter, NodeEventTarget } from "node:events";
|
||||
import { EventLoopUtilityFunction } from "node:perf_hooks";
|
||||
import { FileHandle } from "node:fs/promises";
|
||||
import { Readable, Writable } from "node:stream";
|
||||
@@ -111,7 +111,7 @@ declare module "worker_threads" {
|
||||
* This implementation matches [browser `MessagePort`](https://developer.mozilla.org/en-US/docs/Web/API/MessagePort) s.
|
||||
* @since v10.5.0
|
||||
*/
|
||||
class MessagePort extends EventEmitter {
|
||||
class MessagePort implements EventTarget {
|
||||
/**
|
||||
* Disables further sending of messages on either side of the connection.
|
||||
* This method can be called when no further communication will happen over this `MessagePort`.
|
||||
@@ -224,42 +224,32 @@ declare module "worker_threads" {
|
||||
* @since v10.5.0
|
||||
*/
|
||||
start(): void;
|
||||
addListener(event: "close", listener: () => void): this;
|
||||
addListener(event: "close", listener: (ev: Event) => void): this;
|
||||
addListener(event: "message", listener: (value: any) => void): this;
|
||||
addListener(event: "messageerror", listener: (error: Error) => void): this;
|
||||
addListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||
emit(event: "close"): boolean;
|
||||
addListener(event: string, listener: (arg: any) => void): this;
|
||||
emit(event: "close", ev: Event): boolean;
|
||||
emit(event: "message", value: any): boolean;
|
||||
emit(event: "messageerror", error: Error): boolean;
|
||||
emit(event: string | symbol, ...args: any[]): boolean;
|
||||
on(event: "close", listener: () => void): this;
|
||||
emit(event: string, arg: any): boolean;
|
||||
off(event: "close", listener: (ev: Event) => void, options?: EventListenerOptions): this;
|
||||
off(event: "message", listener: (value: any) => void, options?: EventListenerOptions): this;
|
||||
off(event: "messageerror", listener: (error: Error) => void, options?: EventListenerOptions): this;
|
||||
off(event: string, listener: (arg: any) => void, options?: EventListenerOptions): this;
|
||||
on(event: "close", listener: (ev: Event) => void): this;
|
||||
on(event: "message", listener: (value: any) => void): this;
|
||||
on(event: "messageerror", listener: (error: Error) => void): this;
|
||||
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||
once(event: "close", listener: () => void): this;
|
||||
on(event: string, listener: (arg: any) => void): this;
|
||||
once(event: "close", listener: (ev: Event) => void): this;
|
||||
once(event: "message", listener: (value: any) => void): this;
|
||||
once(event: "messageerror", listener: (error: Error) => void): this;
|
||||
once(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||
prependListener(event: "close", listener: () => void): this;
|
||||
prependListener(event: "message", listener: (value: any) => void): this;
|
||||
prependListener(event: "messageerror", listener: (error: Error) => void): this;
|
||||
prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||
prependOnceListener(event: "close", listener: () => void): this;
|
||||
prependOnceListener(event: "message", listener: (value: any) => void): this;
|
||||
prependOnceListener(event: "messageerror", listener: (error: Error) => void): this;
|
||||
prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||
removeListener(event: "close", listener: () => void): this;
|
||||
removeListener(event: "message", listener: (value: any) => void): this;
|
||||
removeListener(event: "messageerror", listener: (error: Error) => void): this;
|
||||
removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||
off(event: "close", listener: () => void): this;
|
||||
off(event: "message", listener: (value: any) => void): this;
|
||||
off(event: "messageerror", listener: (error: Error) => void): this;
|
||||
off(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||
addEventListener: EventTarget["addEventListener"];
|
||||
dispatchEvent: EventTarget["dispatchEvent"];
|
||||
removeEventListener: EventTarget["removeEventListener"];
|
||||
once(event: string, listener: (arg: any) => void): this;
|
||||
removeListener(event: "close", listener: (ev: Event) => void, options?: EventListenerOptions): this;
|
||||
removeListener(event: "message", listener: (value: any) => void, options?: EventListenerOptions): this;
|
||||
removeListener(event: "messageerror", listener: (error: Error) => void, options?: EventListenerOptions): this;
|
||||
removeListener(event: string, listener: (arg: any) => void, options?: EventListenerOptions): this;
|
||||
}
|
||||
interface MessagePort extends NodeEventTarget {}
|
||||
interface WorkerOptions {
|
||||
/**
|
||||
* List of arguments which would be stringified and appended to
|
||||
@@ -428,24 +418,6 @@ declare module "worker_threads" {
|
||||
* @since v10.5.0
|
||||
*/
|
||||
postMessage(value: any, transferList?: readonly Transferable[]): void;
|
||||
/**
|
||||
* Sends a value to another worker, identified by its thread ID.
|
||||
* @param threadId The target thread ID. If the thread ID is invalid, a `ERR_WORKER_MESSAGING_FAILED` error will be thrown.
|
||||
* If the target thread ID is the current thread ID, a `ERR_WORKER_MESSAGING_SAME_THREAD` error will be thrown.
|
||||
* @param value The value to send.
|
||||
* @param transferList If one or more `MessagePort`-like objects are passed in value, a `transferList` is required for those items
|
||||
* or `ERR_MISSING_MESSAGE_PORT_IN_TRANSFER_LIST` is thrown. See `port.postMessage()` for more information.
|
||||
* @param timeout Time to wait for the message to be delivered in milliseconds. By default it's `undefined`, which means wait forever.
|
||||
* If the operation times out, a `ERR_WORKER_MESSAGING_TIMEOUT` error is thrown.
|
||||
* @since v22.5.0
|
||||
*/
|
||||
postMessageToThread(threadId: number, value: any, timeout?: number): Promise<void>;
|
||||
postMessageToThread(
|
||||
threadId: number,
|
||||
value: any,
|
||||
transferList: readonly Transferable[],
|
||||
timeout?: number,
|
||||
): Promise<void>;
|
||||
/**
|
||||
* Opposite of `unref()`, calling `ref()` on a previously `unref()`ed worker does _not_ let the program exit if it's the only active handle left (the default
|
||||
* behavior). If the worker is `ref()`ed, calling `ref()` again has
|
||||
|
||||
150
desktop-operator/node_modules/electron/checksums.json
generated
vendored
150
desktop-operator/node_modules/electron/checksums.json
generated
vendored
@@ -1,77 +1,77 @@
|
||||
{
|
||||
"chromedriver-v38.2.0-darwin-arm64.zip": "97345d6f601c009ae810ee82dea77d90ff32040f95aefa7d1dbd95ab76ccebc7",
|
||||
"chromedriver-v38.2.0-darwin-x64.zip": "d116d52170eecf0b982c0019f538aa7f01646c8b32b85512ec36096d18a3ed68",
|
||||
"chromedriver-v38.2.0-linux-arm64.zip": "a1402389fe0b9687308020bc9b58909fa0987e5af3f5368557a88f18c9576a02",
|
||||
"chromedriver-v38.2.0-linux-armv7l.zip": "7d038066c6c708517c08f06972dc688364a60b4537e1b83c3bf1db1baf290e45",
|
||||
"chromedriver-v38.2.0-linux-x64.zip": "0ad0238eedb81f71ade28056288b13a3c6a5223654300c423eb266ac0163765c",
|
||||
"chromedriver-v38.2.0-mas-arm64.zip": "df053233dc2f84e240bb62aee370eefd06632aa7b4e7a0cf747ff6f1e2654c83",
|
||||
"chromedriver-v38.2.0-mas-x64.zip": "f576fa428820d0f1f086fbe8f9c81efb3828fbbf37b23042f2f100e2ceb09a49",
|
||||
"chromedriver-v38.2.0-win32-arm64.zip": "d25061c60a757c506b5ca5b909f376f3b75e78035754e6cfb5765455010c4379",
|
||||
"chromedriver-v38.2.0-win32-ia32.zip": "39b1d363415ae196c8c6ad8699831349a8af88f71dfae2e055d86fd3b005270d",
|
||||
"chromedriver-v38.2.0-win32-x64.zip": "3d9e1bda42ced7d839389247f324ace56dab8d568ef579fefe9b1c97b3e32ba2",
|
||||
"electron-api.json": "076c18e4c5a4760d01ea1b44b1bd978524370d696ce3f2f226ead63d41e4f707",
|
||||
"electron-v38.2.0-darwin-arm64-dsym-snapshot.zip": "6ad66396e62ee5650fab7cd69efcf02904a7ed02127f17956c8bb901658458c7",
|
||||
"electron-v38.2.0-darwin-arm64-dsym.zip": "f87a8e54516b390f8d0fac79c6ecd014826a751a8b257f02ad22235033bf75bc",
|
||||
"electron-v38.2.0-darwin-arm64-symbols.zip": "dce9b62139bf577a98af028a41abe05afc3590c877bab0153eb301cd66673a5c",
|
||||
"electron-v38.2.0-darwin-arm64.zip": "cff178e2cb9ae0d957d43009ef46d249d5594bc107d7704130bc0ce2e234bbd1",
|
||||
"electron-v38.2.0-darwin-x64-dsym-snapshot.zip": "7749e09b87dba4a555c199e9e17f39c79ca66ba55403dcd2193d58ed7e9d92fe",
|
||||
"electron-v38.2.0-darwin-x64-dsym.zip": "4f089113390d471067d8de2e52b865fcfda85f9068322e5674914cc8f45305cf",
|
||||
"electron-v38.2.0-darwin-x64-symbols.zip": "b6212cebfc0ad6401d98bad0644d9ceb0b9a5827d7a5478f709bae85169e35b8",
|
||||
"electron-v38.2.0-darwin-x64.zip": "232a83cb11b37f67dc0683402463ef30ac0309afb8e96f3bc1ea53e72fafa789",
|
||||
"electron-v38.2.0-linux-arm64-debug.zip": "b60a4ee1093bdd289c67764bd03cd96c328fae31717a9e6b6dc74afb1b6dd0de",
|
||||
"electron-v38.2.0-linux-arm64-symbols.zip": "dcf2f6940778448782848b391fd0b7dde955bd9a80d1f3fef166b92c87785161",
|
||||
"electron-v38.2.0-linux-arm64.zip": "76116429b368c883f93eb98cbdb053f98d811c35943133fe3cf9b408018ebe2f",
|
||||
"electron-v38.2.0-linux-armv7l-debug.zip": "df1e16509c44c7e2e93ac59e364f47391acdcad5d5da769668678b861191716c",
|
||||
"electron-v38.2.0-linux-armv7l-symbols.zip": "ec6cac3347c256565a64909b96a9756f078cecada64c8c265421ea9e678f72b8",
|
||||
"electron-v38.2.0-linux-armv7l.zip": "a4345bb87504b6b2bef29c0dc53b99770b203a7052fd2c5d38fd3e16177d3e68",
|
||||
"electron-v38.2.0-linux-x64-debug.zip": "845c3d04899b3198c7f7c6cde91994c5216fccbd88864130877aac37d286ecd4",
|
||||
"electron-v38.2.0-linux-x64-symbols.zip": "d7730b9c0b29e779d8c8f5fc9b2796ccb9dace6eab96464bc9b6c25b0f470b0b",
|
||||
"electron-v38.2.0-linux-x64.zip": "f0028975282a6f2946797175ac406a95096f29c5dcda98048148668dfa36eff8",
|
||||
"electron-v38.2.0-mas-arm64-dsym-snapshot.zip": "e44122e13946f35993ea2e0a4ce5ac4ca5d06aaf21d9d413284f851cfe7b4fbd",
|
||||
"electron-v38.2.0-mas-arm64-dsym.zip": "449248269ba9640cf903df0491ef4560834b75393e70da98008efe659c611458",
|
||||
"electron-v38.2.0-mas-arm64-symbols.zip": "f9ce155f70b020ff0c8f17e452c65bc136ccc0abb9718e8223c9d3cab4e8e952",
|
||||
"electron-v38.2.0-mas-arm64.zip": "9d20149b1ab5f8075d9a13d6afac42af0070ce508804a4bd391cdb73beb4f6ce",
|
||||
"electron-v38.2.0-mas-x64-dsym-snapshot.zip": "64f8e69d3f60ba74e9c63c44809e9f9cbc12ac5fc5ce5264273fbc20d100e6a8",
|
||||
"electron-v38.2.0-mas-x64-dsym.zip": "99078e8754894bc08086ec94a127fd3451001247cca4c42285a4850a77766a01",
|
||||
"electron-v38.2.0-mas-x64-symbols.zip": "c3f499e8b0b6e97d49bbe0915c5ffb7bc3744f9af48fcccf7ead0c17e56d5f1f",
|
||||
"electron-v38.2.0-mas-x64.zip": "ea1decf697475333dc6dcf6649f809764224108575b63d23964aee3389bafedd",
|
||||
"electron-v38.2.0-win32-arm64-pdb.zip": "0139650ab1ad003fe6b6b10a0bab1b5a2a594e30dd2bc3f45d7a0fdbe00ed312",
|
||||
"electron-v38.2.0-win32-arm64-symbols.zip": "9701d4605fcb3440f296d9b0ae8eba40f6dc80c831cac14449bf7ae5a87db43f",
|
||||
"electron-v38.2.0-win32-arm64-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5",
|
||||
"electron-v38.2.0-win32-arm64.zip": "801e520e3ec8a0af1bdab5110846def06af3f427267351eb3c4359a00cd1294e",
|
||||
"electron-v38.2.0-win32-ia32-pdb.zip": "d413d24833fc3f4ea9da0c4577c28c1ccd5e684288f54b2da17d7e999ed22561",
|
||||
"electron-v38.2.0-win32-ia32-symbols.zip": "2f1441dbd2ab6ea8b5998f343d27c9a3485ec6395f4643dd2a09a71281378f8e",
|
||||
"electron-v38.2.0-win32-ia32-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5",
|
||||
"electron-v38.2.0-win32-ia32.zip": "b3bd0de05613ab5312013133de1587c35fdfa22e11e1f76fcaf6ea0248128f0c",
|
||||
"electron-v38.2.0-win32-x64-pdb.zip": "7727b6b192b7a621ccb1b260b7204f59ecb9043361356f9b33204f1b760186c2",
|
||||
"electron-v38.2.0-win32-x64-symbols.zip": "e76f3db9e670dce9979a513ce16ca1275d8f048c73f8eeae8555085180b996e1",
|
||||
"electron-v38.2.0-win32-x64-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5",
|
||||
"electron-v38.2.0-win32-x64.zip": "4382b317dbbbc0bbf8a301304749324b88207218aac240b670f1c1247c2a02b0",
|
||||
"electron.d.ts": "e76a7d03aeb0b0f702c76dc9aeba8e8f0b12b22e5107b2135c1174228ac76947",
|
||||
"ffmpeg-v38.2.0-darwin-arm64.zip": "04d284c52ec7718c1d325f27ccf14fb7abf638db5e371d04b08eed307d1915e4",
|
||||
"ffmpeg-v38.2.0-darwin-x64.zip": "1680b9b2eec4868e7ef745997a29716f947551e79ca66dbe013508a943d5f107",
|
||||
"ffmpeg-v38.2.0-linux-arm64.zip": "c93699ce1c7944f94bbcc761b93367768b6c9e45c9fb48eec3cc5198cb7fc6e4",
|
||||
"ffmpeg-v38.2.0-linux-armv7l.zip": "41cb057e1b25203202d0b067bce4a9f554f47f85e674c888d890ef2b1c473991",
|
||||
"ffmpeg-v38.2.0-linux-x64.zip": "bb741cab02f42f0046ab0d38d2f52d5627a980d2e533609c83d451da5ef1d972",
|
||||
"ffmpeg-v38.2.0-mas-arm64.zip": "04d284c52ec7718c1d325f27ccf14fb7abf638db5e371d04b08eed307d1915e4",
|
||||
"ffmpeg-v38.2.0-mas-x64.zip": "1680b9b2eec4868e7ef745997a29716f947551e79ca66dbe013508a943d5f107",
|
||||
"ffmpeg-v38.2.0-win32-arm64.zip": "84a57167a9226e19304bde6728e6b88349c3bc6644bab056b98fb3449d5d928f",
|
||||
"ffmpeg-v38.2.0-win32-ia32.zip": "da003cce1929a74c6b90591a3a89ef7ef9b53ba8b3aa7752191353b807374410",
|
||||
"ffmpeg-v38.2.0-win32-x64.zip": "c736ac3c4281b60b8a02587c413ef1f1b83051ce18bfaaa483ac6afb01516285",
|
||||
"hunspell_dictionaries.zip": "67ed5ea6b3c90b81abaa6e7ea1c736f703abd93716782fee545c2a0ee541cd4a",
|
||||
"libcxx-objects-v38.2.0-linux-arm64.zip": "f2bdb8741e5e129ea23fde19744e349723b3c975d3b4ad1d95db77f1004e7448",
|
||||
"libcxx-objects-v38.2.0-linux-armv7l.zip": "ea9f3d3955dc494a948abfd02a2a67fd0500bbd3cf72d6da13a7271a6b579a56",
|
||||
"libcxx-objects-v38.2.0-linux-x64.zip": "77fb7ef16b09c49c15f2d568f332dd76942c1c5603127975f9fc66929bae2dad",
|
||||
"libcxx_headers.zip": "9e2f483547b92864f6deb7b575b71d4ece0e4ed1ec3d510c6b9c64cd9f3bb772",
|
||||
"libcxxabi_headers.zip": "006ccb83761a3bf5791d165bc9795e4de3308c65df646b4cbcaa61025fe7a6c5",
|
||||
"mksnapshot-v38.2.0-darwin-arm64.zip": "274a273cdbab09b7851a9a5515ee9c385fe0e0a841e25156541a9d464161e62a",
|
||||
"mksnapshot-v38.2.0-darwin-x64.zip": "576dc1d77dba2137d9700586542cdb9a993fadb622e4e119e6de06a5562c9d2a",
|
||||
"mksnapshot-v38.2.0-linux-arm64-x64.zip": "fb84bc0d58fcab474a04afd8e429675b68d30ce1005defc3082abf7110e946bb",
|
||||
"mksnapshot-v38.2.0-linux-armv7l-x64.zip": "9b0001ced0218770f18fab34928ad2df3c4d4e155bdc94949975f3b33a72916e",
|
||||
"mksnapshot-v38.2.0-linux-x64.zip": "3bba4a42ac6828553e931e6f44284877a06ec11f9d389684d1101b6023254ce5",
|
||||
"mksnapshot-v38.2.0-mas-arm64.zip": "a3995fb30ebaf916608ddcef8fbe393856395465178a21ec69198ca26ca67764",
|
||||
"mksnapshot-v38.2.0-mas-x64.zip": "d7f662ddc0e2b8346177eb9b87575f34e4bb6fba4a7b4894af6273ad4d5a9c6e",
|
||||
"mksnapshot-v38.2.0-win32-arm64-x64.zip": "7e92793dbb6b0e5e8bfa8b6e558f7a8841686faf5072e1a263855556760282ad",
|
||||
"mksnapshot-v38.2.0-win32-ia32.zip": "573c49311b5fbf44b00082092341739c893dbbd050400e4329d16e541f435aab",
|
||||
"mksnapshot-v38.2.0-win32-x64.zip": "55e03c4fd2caa3f4b1a52d0038fb129835a93328afa100b3c8bd7caa4c5dbebd"
|
||||
"chromedriver-v38.2.1-darwin-arm64.zip": "29e5cbaf4fce59fdc09c6fac4cbef9e40bb967cfcc191f757253c50051d64591",
|
||||
"chromedriver-v38.2.1-darwin-x64.zip": "0f941ed1f47a9ace7242b59ec94ea67c8ca1e38a8f5b9f7953fe397854874871",
|
||||
"chromedriver-v38.2.1-linux-arm64.zip": "b98fb4b96ccb84f5f59406570f3f9775e075ebf2995757ac8a02ff9d751a72dc",
|
||||
"chromedriver-v38.2.1-linux-armv7l.zip": "ddc4ccc54c0be867e416acf760da26491a95463da15688a9ecb71e9294f682ed",
|
||||
"chromedriver-v38.2.1-linux-x64.zip": "1b235b1ee31a824b16494fc0740485b00db446a4bfb25b4dcf4e72fc48f2c10b",
|
||||
"chromedriver-v38.2.1-mas-arm64.zip": "5dbf61e83b62cfac2ee7d09649f94ff862cf8490c97b8da848f7f8d1799eca00",
|
||||
"chromedriver-v38.2.1-mas-x64.zip": "92ea7656078d0baf2ff8c10b7cbaeb1683a5bfe5475aee18a66ea1f07b832f7c",
|
||||
"chromedriver-v38.2.1-win32-arm64.zip": "8f1b9d91defe9ff9e4a5ef0a5aa4812bd63c8a48639c99a0e112f755b2bb33c1",
|
||||
"chromedriver-v38.2.1-win32-ia32.zip": "2defbe13bba2977d41c2ee92ebf86dd87841b665ea58644afc984bfef15c2e1e",
|
||||
"chromedriver-v38.2.1-win32-x64.zip": "9bfec31346954fb5c3f44ab2031df117838603bd36444e52620a257e188ac024",
|
||||
"electron-api.json": "6575b7ad9db9b79b014384d3f8d6c1bfe59a1f37cc22409fe6cec45f7c447974",
|
||||
"electron-v38.2.1-darwin-arm64-dsym-snapshot.zip": "2fd04efe16f5af71da2369a895610f723c47e7083599187d7cfe8205784604c1",
|
||||
"electron-v38.2.1-darwin-arm64-dsym.zip": "cf152b6a3a335589185444e92fc748c9228e27408ae14e9687b13f817f3490da",
|
||||
"electron-v38.2.1-darwin-arm64-symbols.zip": "044f5ac4f5e31805b85fcb8b940467a17571a6d2922fd6d4a29986251c7e8e98",
|
||||
"electron-v38.2.1-darwin-arm64.zip": "8f8eb31c69bbf0fb45bc596e271571ade426cf076a3e07a858390c45c399e213",
|
||||
"electron-v38.2.1-darwin-x64-dsym-snapshot.zip": "59327f344d3021ae072b5c1f1080f321ceb823f8f02bec092b55f6f10e4762a7",
|
||||
"electron-v38.2.1-darwin-x64-dsym.zip": "e94a9e006ca8e60d1608a9d2e8eb5cd7ab78da2737ec6871adace34d60957c48",
|
||||
"electron-v38.2.1-darwin-x64-symbols.zip": "9651b24a6fe375c081f2f44c266a1f93fde6dbf93bfdcfcdcbf147ae48902661",
|
||||
"electron-v38.2.1-darwin-x64.zip": "3b636e2826a90f6e8b9ebf1c6dc5a6fb7c7fad876aa91520eed520b40bcab3c8",
|
||||
"electron-v38.2.1-linux-arm64-debug.zip": "57b8315a082483ea4a8ec49dde4a4b841ac5f5a8eb86d64e428e5bab6fff816a",
|
||||
"electron-v38.2.1-linux-arm64-symbols.zip": "62ea8e51ff4c4098a3ec5bb42efdb9d2149301409b9ef67d283009c76dfc6913",
|
||||
"electron-v38.2.1-linux-arm64.zip": "99ed0b3e4edbdf4f8c51e8dabb92dccc7b0b5d728aa5c014d5e5adaf17a6993c",
|
||||
"electron-v38.2.1-linux-armv7l-debug.zip": "43528f34953b1b4b3605d68430d5535e77fde583bc9b7d8452d2e34f292306b0",
|
||||
"electron-v38.2.1-linux-armv7l-symbols.zip": "c7d31193109ddcdb7bf5eea5b8cf1b34286aa12c480d9b35f36df70d8b8fa9e8",
|
||||
"electron-v38.2.1-linux-armv7l.zip": "634371ed0224e4ccc96b09f8887530068f478d438df6ecfd7fdbdde7fde588e3",
|
||||
"electron-v38.2.1-linux-x64-debug.zip": "3b90f171dd23f2187f424e2ba32780fe08134600760614552f2c9685036a9a5b",
|
||||
"electron-v38.2.1-linux-x64-symbols.zip": "70c479a8d7cb8952aa4db2b6cde7dbbc25430d93faa4900e8c8e953af00ee501",
|
||||
"electron-v38.2.1-linux-x64.zip": "471b91628357ffd40f4f9d61f2421b6e9fb7aa1769d6c9728d24f8376acf775a",
|
||||
"electron-v38.2.1-mas-arm64-dsym-snapshot.zip": "146c418b0424e4fac20e16a83ecf64625e09e7aef3e49bb7babf721a6746b53d",
|
||||
"electron-v38.2.1-mas-arm64-dsym.zip": "f080e0eedef215fdae2939c7ff1323911aac0b89db0bbfde8eda44028db6a2a9",
|
||||
"electron-v38.2.1-mas-arm64-symbols.zip": "9433e3400581e684efdcd1e958b35de07506dea4d9eb10f5fa4d4ade4b4c1d66",
|
||||
"electron-v38.2.1-mas-arm64.zip": "fbd21868231849a7904a046168b88afc892e081d5cf36216b44c366334da59d6",
|
||||
"electron-v38.2.1-mas-x64-dsym-snapshot.zip": "310ac182253c215d206a4b5a64a25c919f929d6d424ad540e266dcc27c317361",
|
||||
"electron-v38.2.1-mas-x64-dsym.zip": "4ca5cffb3851916107634ea20a1d847453d25aa654455b9e4e73b80042c9ab98",
|
||||
"electron-v38.2.1-mas-x64-symbols.zip": "d7301076c860ccc5c4581c99b36a482b924d394b1b2649db534c0d2f03128799",
|
||||
"electron-v38.2.1-mas-x64.zip": "6a2872c54c57488ec6fc6bb7503c990749e79dd36cd93df3816fd554fd555904",
|
||||
"electron-v38.2.1-win32-arm64-pdb.zip": "d86eb73f8ee643dc9f78e7ae7b9386ab1dfd95728dc7c55087f8499001302904",
|
||||
"electron-v38.2.1-win32-arm64-symbols.zip": "15080c33e7efff13c260d077f1e514e2e9e9c9e48be833db89f68f2c4bccc305",
|
||||
"electron-v38.2.1-win32-arm64-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5",
|
||||
"electron-v38.2.1-win32-arm64.zip": "ff21bafbb2f64037a1bdf31101ae5395b3aa49e02dc7a52b8cacf0d8c5ac4fb3",
|
||||
"electron-v38.2.1-win32-ia32-pdb.zip": "17932a5766b748f504b4e35e6e460c8c264ff57435c0cfe4cf7ef6e784fb5df0",
|
||||
"electron-v38.2.1-win32-ia32-symbols.zip": "acdbc221c64b41ba7a7fc3c2c7d102127cd02082042c21adf07130674e1291e7",
|
||||
"electron-v38.2.1-win32-ia32-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5",
|
||||
"electron-v38.2.1-win32-ia32.zip": "86e2b1e76801b4ce0388467189593bcc58a75ad2ed436810c0e604f9ecfb2df6",
|
||||
"electron-v38.2.1-win32-x64-pdb.zip": "c8d0ee47bdb9f805c35fd6adfc06c85773e808527a81dd2bafccb53185d1a370",
|
||||
"electron-v38.2.1-win32-x64-symbols.zip": "d3063d90a188b1665b189e9d0974b3ca5604dd48aca1d322226cde9cd24b1cf9",
|
||||
"electron-v38.2.1-win32-x64-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5",
|
||||
"electron-v38.2.1-win32-x64.zip": "e3831387518acc8430fa674e585d24833aabb994dae43bcca0257302c0816967",
|
||||
"electron.d.ts": "e8db7913668fb6e676b4ba887711cc74da190eff89f4f885fc5295624fd5d750",
|
||||
"ffmpeg-v38.2.1-darwin-arm64.zip": "04d284c52ec7718c1d325f27ccf14fb7abf638db5e371d04b08eed307d1915e4",
|
||||
"ffmpeg-v38.2.1-darwin-x64.zip": "1680b9b2eec4868e7ef745997a29716f947551e79ca66dbe013508a943d5f107",
|
||||
"ffmpeg-v38.2.1-linux-arm64.zip": "c93699ce1c7944f94bbcc761b93367768b6c9e45c9fb48eec3cc5198cb7fc6e4",
|
||||
"ffmpeg-v38.2.1-linux-armv7l.zip": "41cb057e1b25203202d0b067bce4a9f554f47f85e674c888d890ef2b1c473991",
|
||||
"ffmpeg-v38.2.1-linux-x64.zip": "bb741cab02f42f0046ab0d38d2f52d5627a980d2e533609c83d451da5ef1d972",
|
||||
"ffmpeg-v38.2.1-mas-arm64.zip": "04d284c52ec7718c1d325f27ccf14fb7abf638db5e371d04b08eed307d1915e4",
|
||||
"ffmpeg-v38.2.1-mas-x64.zip": "1680b9b2eec4868e7ef745997a29716f947551e79ca66dbe013508a943d5f107",
|
||||
"ffmpeg-v38.2.1-win32-arm64.zip": "84a57167a9226e19304bde6728e6b88349c3bc6644bab056b98fb3449d5d928f",
|
||||
"ffmpeg-v38.2.1-win32-ia32.zip": "da003cce1929a74c6b90591a3a89ef7ef9b53ba8b3aa7752191353b807374410",
|
||||
"ffmpeg-v38.2.1-win32-x64.zip": "c736ac3c4281b60b8a02587c413ef1f1b83051ce18bfaaa483ac6afb01516285",
|
||||
"hunspell_dictionaries.zip": "e159462fd2c8c6d245878df9b6a60e5d737fe737c19c39bd0ed15bcdffcb8849",
|
||||
"libcxx-objects-v38.2.1-linux-arm64.zip": "73e23f2a0d7197a8002ccfa47df5cf12fae9d8de09f7ae8986f161735d5ac97d",
|
||||
"libcxx-objects-v38.2.1-linux-armv7l.zip": "1d913d9381570551ca379abce68ab8dea10021e27f9ef94cedee8655b0bd9275",
|
||||
"libcxx-objects-v38.2.1-linux-x64.zip": "dac28dbf41082ae06524dd2d4e5e1431eb13fdf18106494ca0917663d2450d6e",
|
||||
"libcxx_headers.zip": "fa7b84db331f95f703c83f1e91788bcafb50db4aec882ef0f59227f232ab11b2",
|
||||
"libcxxabi_headers.zip": "db3018609bce502c307c59074b3d5273080a68fb50ac1e7fc580994a2e80cc25",
|
||||
"mksnapshot-v38.2.1-darwin-arm64.zip": "0ca89892f1f83a10306fba4cd97bcb8f1f8b7ac8eaff15a3bb69a002a6adc89d",
|
||||
"mksnapshot-v38.2.1-darwin-x64.zip": "7a40dddf3e4ff9cf0bfdad26ebfaacb3cfa5460207a3fb4d3bbd7d44aaa4b48e",
|
||||
"mksnapshot-v38.2.1-linux-arm64-x64.zip": "254930fca75d71da47a36cbbb419129ce3b888746fb949811e5d34b45cfdde9c",
|
||||
"mksnapshot-v38.2.1-linux-armv7l-x64.zip": "a0ca4d1c49841ff4704722d35539225be9cf909284e29f527833c88dea9fdfdb",
|
||||
"mksnapshot-v38.2.1-linux-x64.zip": "11d10476db26eec1298a717fdba37d4e338440746f95c63cd03c39b5eb25e0fb",
|
||||
"mksnapshot-v38.2.1-mas-arm64.zip": "c422a6d4ec42b4cdb67a31e8d2fdae5ecca854a6ed50e028368f147f47bfc28a",
|
||||
"mksnapshot-v38.2.1-mas-x64.zip": "a2f49735e326e6c1f3f9014f7d4c298a3e220fcae7a3a0abe715947e710486bc",
|
||||
"mksnapshot-v38.2.1-win32-arm64-x64.zip": "234a78c158c11c5972990c97552e16d19c00a86409209a199d516011d24dfa68",
|
||||
"mksnapshot-v38.2.1-win32-ia32.zip": "061fc432799cd129002b9e0aae1a9d71bf996fd35b6e886f88c9ccac9b8c4acc",
|
||||
"mksnapshot-v38.2.1-win32-x64.zip": "ee13d6045f25b56e3b28d91cc3c72e37a73e549ba560eb4b9111caacd9b1a588"
|
||||
}
|
||||
BIN
desktop-operator/node_modules/electron/dist/electron
generated
vendored
BIN
desktop-operator/node_modules/electron/dist/electron
generated
vendored
Binary file not shown.
2
desktop-operator/node_modules/electron/dist/version
generated
vendored
2
desktop-operator/node_modules/electron/dist/version
generated
vendored
@@ -1 +1 @@
|
||||
38.2.0
|
||||
38.2.1
|
||||
2
desktop-operator/node_modules/electron/electron.d.ts
generated
vendored
2
desktop-operator/node_modules/electron/electron.d.ts
generated
vendored
@@ -1,4 +1,4 @@
|
||||
// Type definitions for Electron 38.2.0
|
||||
// Type definitions for Electron 38.2.1
|
||||
// Project: http://electronjs.org/
|
||||
// Definitions by: The Electron Team <https://github.com/electron/electron>
|
||||
// Definitions: https://github.com/electron/typescript-definitions
|
||||
|
||||
2
desktop-operator/node_modules/electron/package.json
generated
vendored
2
desktop-operator/node_modules/electron/package.json
generated
vendored
@@ -23,5 +23,5 @@
|
||||
"keywords": [
|
||||
"electron"
|
||||
],
|
||||
"version": "38.2.0"
|
||||
"version": "38.2.1"
|
||||
}
|
||||
36
desktop-operator/node_modules/typescript/lib/_tsc.js
generated
vendored
36
desktop-operator/node_modules/typescript/lib/_tsc.js
generated
vendored
@@ -18,7 +18,7 @@ and limitations under the License.
|
||||
|
||||
// src/compiler/corePublic.ts
|
||||
var versionMajorMinor = "5.9";
|
||||
var version = "5.9.2";
|
||||
var version = "5.9.3";
|
||||
|
||||
// src/compiler/core.ts
|
||||
var emptyArray = [];
|
||||
@@ -20254,10 +20254,22 @@ function createParenthesizerRules(factory2) {
|
||||
}
|
||||
return parenthesizerRule;
|
||||
}
|
||||
function mixingBinaryOperatorsRequiresParentheses(a, b) {
|
||||
if (a === 61 /* QuestionQuestionToken */) {
|
||||
return b === 56 /* AmpersandAmpersandToken */ || b === 57 /* BarBarToken */;
|
||||
}
|
||||
if (b === 61 /* QuestionQuestionToken */) {
|
||||
return a === 56 /* AmpersandAmpersandToken */ || a === 57 /* BarBarToken */;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function binaryOperandNeedsParentheses(binaryOperator, operand, isLeftSideOfBinary, leftOperand) {
|
||||
const emittedOperand = skipPartiallyEmittedExpressions(operand);
|
||||
if (isBinaryExpression(emittedOperand) && mixingBinaryOperatorsRequiresParentheses(binaryOperator, emittedOperand.operatorToken.kind)) {
|
||||
return true;
|
||||
}
|
||||
const binaryOperatorPrecedence = getOperatorPrecedence(227 /* BinaryExpression */, binaryOperator);
|
||||
const binaryOperatorAssociativity = getOperatorAssociativity(227 /* BinaryExpression */, binaryOperator);
|
||||
const emittedOperand = skipPartiallyEmittedExpressions(operand);
|
||||
if (!isLeftSideOfBinary && operand.kind === 220 /* ArrowFunction */ && binaryOperatorPrecedence > 3 /* Assignment */) {
|
||||
return true;
|
||||
}
|
||||
@@ -53296,7 +53308,22 @@ function createTypeChecker(host) {
|
||||
function getPropertyNameNodeForSymbol(symbol, context) {
|
||||
const hashPrivateName = getClonedHashPrivateName(symbol);
|
||||
if (hashPrivateName) {
|
||||
return hashPrivateName;
|
||||
const shouldEmitErroneousFieldName = !!context.tracker.reportPrivateInBaseOfClassExpression && context.flags & 2048 /* WriteClassExpressionAsTypeLiteral */;
|
||||
if (!shouldEmitErroneousFieldName) {
|
||||
return hashPrivateName;
|
||||
} else {
|
||||
let rawName2 = unescapeLeadingUnderscores(symbol.escapedName);
|
||||
rawName2 = rawName2.replace(/__#\d+@#/g, "__#private@#");
|
||||
return createPropertyNameNodeForIdentifierOrLiteral(
|
||||
rawName2,
|
||||
getEmitScriptTarget(compilerOptions),
|
||||
/*singleQuote*/
|
||||
false,
|
||||
/*stringNamed*/
|
||||
true,
|
||||
!!(symbol.flags & 8192 /* Method */)
|
||||
);
|
||||
}
|
||||
}
|
||||
const stringNamed = !!length(symbol.declarations) && every(symbol.declarations, isStringNamed);
|
||||
const singleQuote = !!length(symbol.declarations) && every(symbol.declarations, isSingleQuotedStringNamed);
|
||||
@@ -124188,10 +124215,9 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi
|
||||
}
|
||||
const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(resolvedRef.commandLine, !host.useCaseSensitiveFileNames()));
|
||||
commandLine.fileNames.forEach((fileName) => {
|
||||
if (isDeclarationFileName(fileName)) return;
|
||||
const path = toPath3(fileName);
|
||||
let outputDts;
|
||||
if (!fileExtensionIs(fileName, ".json" /* Json */)) {
|
||||
if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) {
|
||||
if (!commandLine.options.outFile) {
|
||||
outputDts = getOutputDeclarationFileName(fileName, resolvedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3);
|
||||
mapOutputFileToResolvedRef.set(toPath3(outputDts), { resolvedRef, source: fileName });
|
||||
|
||||
2
desktop-operator/node_modules/typescript/lib/lib.esnext.float16.d.ts
generated
vendored
2
desktop-operator/node_modules/typescript/lib/lib.esnext.float16.d.ts
generated
vendored
@@ -374,6 +374,8 @@ interface Float16ArrayConstructor {
|
||||
new (length?: number): Float16Array<ArrayBuffer>;
|
||||
new (array: ArrayLike<number> | Iterable<number>): Float16Array<ArrayBuffer>;
|
||||
new <TArrayBuffer extends ArrayBufferLike = ArrayBuffer>(buffer: TArrayBuffer, byteOffset?: number, length?: number): Float16Array<TArrayBuffer>;
|
||||
new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Float16Array<ArrayBuffer>;
|
||||
new (array: ArrayLike<number> | ArrayBuffer): Float16Array<ArrayBuffer>;
|
||||
|
||||
/**
|
||||
* The size in bytes of each element in the array.
|
||||
|
||||
1
desktop-operator/node_modules/typescript/lib/typescript.d.ts
generated
vendored
1
desktop-operator/node_modules/typescript/lib/typescript.d.ts
generated
vendored
@@ -5907,7 +5907,6 @@ declare namespace ts {
|
||||
*/
|
||||
interface SourceFileLike {
|
||||
readonly text: string;
|
||||
languageVariant?: LanguageVariant;
|
||||
}
|
||||
interface SourceFileLike {
|
||||
getLineAndCharacterOfPosition(pos: number): LineAndCharacter;
|
||||
|
||||
59
desktop-operator/node_modules/typescript/lib/typescript.js
generated
vendored
59
desktop-operator/node_modules/typescript/lib/typescript.js
generated
vendored
@@ -2285,7 +2285,7 @@ module.exports = __toCommonJS(typescript_exports);
|
||||
|
||||
// src/compiler/corePublic.ts
|
||||
var versionMajorMinor = "5.9";
|
||||
var version = "5.9.2";
|
||||
var version = "5.9.3";
|
||||
var Comparison = /* @__PURE__ */ ((Comparison3) => {
|
||||
Comparison3[Comparison3["LessThan"] = -1] = "LessThan";
|
||||
Comparison3[Comparison3["EqualTo"] = 0] = "EqualTo";
|
||||
@@ -6790,10 +6790,10 @@ var ScriptTarget = /* @__PURE__ */ ((ScriptTarget12) => {
|
||||
ScriptTarget12[ScriptTarget12["Latest"] = 99 /* ESNext */] = "Latest";
|
||||
return ScriptTarget12;
|
||||
})(ScriptTarget || {});
|
||||
var LanguageVariant = /* @__PURE__ */ ((LanguageVariant3) => {
|
||||
LanguageVariant3[LanguageVariant3["Standard"] = 0] = "Standard";
|
||||
LanguageVariant3[LanguageVariant3["JSX"] = 1] = "JSX";
|
||||
return LanguageVariant3;
|
||||
var LanguageVariant = /* @__PURE__ */ ((LanguageVariant4) => {
|
||||
LanguageVariant4[LanguageVariant4["Standard"] = 0] = "Standard";
|
||||
LanguageVariant4[LanguageVariant4["JSX"] = 1] = "JSX";
|
||||
return LanguageVariant4;
|
||||
})(LanguageVariant || {});
|
||||
var WatchDirectoryFlags = /* @__PURE__ */ ((WatchDirectoryFlags3) => {
|
||||
WatchDirectoryFlags3[WatchDirectoryFlags3["None"] = 0] = "None";
|
||||
@@ -24351,10 +24351,22 @@ function createParenthesizerRules(factory2) {
|
||||
}
|
||||
return parenthesizerRule;
|
||||
}
|
||||
function mixingBinaryOperatorsRequiresParentheses(a, b) {
|
||||
if (a === 61 /* QuestionQuestionToken */) {
|
||||
return b === 56 /* AmpersandAmpersandToken */ || b === 57 /* BarBarToken */;
|
||||
}
|
||||
if (b === 61 /* QuestionQuestionToken */) {
|
||||
return a === 56 /* AmpersandAmpersandToken */ || a === 57 /* BarBarToken */;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function binaryOperandNeedsParentheses(binaryOperator, operand, isLeftSideOfBinary, leftOperand) {
|
||||
const emittedOperand = skipPartiallyEmittedExpressions(operand);
|
||||
if (isBinaryExpression(emittedOperand) && mixingBinaryOperatorsRequiresParentheses(binaryOperator, emittedOperand.operatorToken.kind)) {
|
||||
return true;
|
||||
}
|
||||
const binaryOperatorPrecedence = getOperatorPrecedence(227 /* BinaryExpression */, binaryOperator);
|
||||
const binaryOperatorAssociativity = getOperatorAssociativity(227 /* BinaryExpression */, binaryOperator);
|
||||
const emittedOperand = skipPartiallyEmittedExpressions(operand);
|
||||
if (!isLeftSideOfBinary && operand.kind === 220 /* ArrowFunction */ && binaryOperatorPrecedence > 3 /* Assignment */) {
|
||||
return true;
|
||||
}
|
||||
@@ -57907,7 +57919,22 @@ function createTypeChecker(host) {
|
||||
function getPropertyNameNodeForSymbol(symbol, context) {
|
||||
const hashPrivateName = getClonedHashPrivateName(symbol);
|
||||
if (hashPrivateName) {
|
||||
return hashPrivateName;
|
||||
const shouldEmitErroneousFieldName = !!context.tracker.reportPrivateInBaseOfClassExpression && context.flags & 2048 /* WriteClassExpressionAsTypeLiteral */;
|
||||
if (!shouldEmitErroneousFieldName) {
|
||||
return hashPrivateName;
|
||||
} else {
|
||||
let rawName2 = unescapeLeadingUnderscores(symbol.escapedName);
|
||||
rawName2 = rawName2.replace(/__#\d+@#/g, "__#private@#");
|
||||
return createPropertyNameNodeForIdentifierOrLiteral(
|
||||
rawName2,
|
||||
getEmitScriptTarget(compilerOptions),
|
||||
/*singleQuote*/
|
||||
false,
|
||||
/*stringNamed*/
|
||||
true,
|
||||
!!(symbol.flags & 8192 /* Method */)
|
||||
);
|
||||
}
|
||||
}
|
||||
const stringNamed = !!length(symbol.declarations) && every(symbol.declarations, isStringNamed);
|
||||
const singleQuote = !!length(symbol.declarations) && every(symbol.declarations, isSingleQuotedStringNamed);
|
||||
@@ -129038,10 +129065,9 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi
|
||||
}
|
||||
const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(resolvedRef.commandLine, !host.useCaseSensitiveFileNames()));
|
||||
commandLine.fileNames.forEach((fileName) => {
|
||||
if (isDeclarationFileName(fileName)) return;
|
||||
const path = toPath3(fileName);
|
||||
let outputDts;
|
||||
if (!fileExtensionIs(fileName, ".json" /* Json */)) {
|
||||
if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) {
|
||||
if (!commandLine.options.outFile) {
|
||||
outputDts = getOutputDeclarationFileName(fileName, resolvedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3);
|
||||
mapOutputFileToResolvedRef.set(toPath3(outputDts), { resolvedRef, source: fileName });
|
||||
@@ -140403,7 +140429,7 @@ function isInsideJsxElementOrAttribute(sourceFile, position) {
|
||||
if (token && token.kind === 20 /* CloseBraceToken */ && token.parent.kind === 295 /* JsxExpression */) {
|
||||
return true;
|
||||
}
|
||||
if (token.kind === 31 /* LessThanSlashToken */ && token.parent.kind === 288 /* JsxClosingElement */) {
|
||||
if (token.kind === 30 /* LessThanToken */ && token.parent.kind === 288 /* JsxClosingElement */) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -140431,7 +140457,7 @@ function isInJSXText(sourceFile, position) {
|
||||
function isInsideJsxElement(sourceFile, position) {
|
||||
function isInsideJsxElementTraversal(node) {
|
||||
while (node) {
|
||||
if (node.kind >= 286 /* JsxSelfClosingElement */ && node.kind <= 295 /* JsxExpression */ || node.kind === 12 /* JsxText */ || node.kind === 30 /* LessThanToken */ || node.kind === 32 /* GreaterThanToken */ || node.kind === 80 /* Identifier */ || node.kind === 20 /* CloseBraceToken */ || node.kind === 19 /* OpenBraceToken */ || node.kind === 44 /* SlashToken */ || node.kind === 31 /* LessThanSlashToken */) {
|
||||
if (node.kind >= 286 /* JsxSelfClosingElement */ && node.kind <= 295 /* JsxExpression */ || node.kind === 12 /* JsxText */ || node.kind === 30 /* LessThanToken */ || node.kind === 32 /* GreaterThanToken */ || node.kind === 80 /* Identifier */ || node.kind === 20 /* CloseBraceToken */ || node.kind === 19 /* OpenBraceToken */ || node.kind === 44 /* SlashToken */) {
|
||||
node = node.parent;
|
||||
} else if (node.kind === 285 /* JsxElement */) {
|
||||
if (position > node.getStart(sourceFile)) return true;
|
||||
@@ -151873,9 +151899,7 @@ function createChildren(node, sourceFile) {
|
||||
});
|
||||
return children;
|
||||
}
|
||||
const languageVariant = (sourceFile == null ? void 0 : sourceFile.languageVariant) ?? 0 /* Standard */;
|
||||
scanner.setText((sourceFile || node.getSourceFile()).text);
|
||||
scanner.setLanguageVariant(languageVariant);
|
||||
let pos = node.pos;
|
||||
const processNode = (child) => {
|
||||
addSyntheticNodes(children, pos, child.pos, node);
|
||||
@@ -151892,7 +151916,6 @@ function createChildren(node, sourceFile) {
|
||||
node.forEachChild(processNode, processNodes);
|
||||
addSyntheticNodes(children, pos, node.end, node);
|
||||
scanner.setText(void 0);
|
||||
scanner.setLanguageVariant(0 /* Standard */);
|
||||
return children;
|
||||
}
|
||||
function addSyntheticNodes(nodes, pos, end, parent2) {
|
||||
@@ -167606,7 +167629,7 @@ function getJsxClosingTagCompletion(location, sourceFile) {
|
||||
switch (node.kind) {
|
||||
case 288 /* JsxClosingElement */:
|
||||
return true;
|
||||
case 31 /* LessThanSlashToken */:
|
||||
case 44 /* SlashToken */:
|
||||
case 32 /* GreaterThanToken */:
|
||||
case 80 /* Identifier */:
|
||||
case 212 /* PropertyAccessExpression */:
|
||||
@@ -168942,7 +168965,7 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position,
|
||||
location = currentToken;
|
||||
}
|
||||
break;
|
||||
case 31 /* LessThanSlashToken */:
|
||||
case 44 /* SlashToken */:
|
||||
if (currentToken.parent.kind === 286 /* JsxSelfClosingElement */) {
|
||||
location = currentToken;
|
||||
}
|
||||
@@ -168951,7 +168974,7 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position,
|
||||
}
|
||||
switch (parent2.kind) {
|
||||
case 288 /* JsxClosingElement */:
|
||||
if (contextToken.kind === 31 /* LessThanSlashToken */) {
|
||||
if (contextToken.kind === 44 /* SlashToken */) {
|
||||
isStartingCloseTag = true;
|
||||
location = contextToken;
|
||||
}
|
||||
@@ -170572,7 +170595,7 @@ function isValidTrigger(sourceFile, triggerCharacter, contextToken, position) {
|
||||
case "<":
|
||||
return !!contextToken && contextToken.kind === 30 /* LessThanToken */ && (!isBinaryExpression(contextToken.parent) || binaryExpressionMayBeOpenTag(contextToken.parent));
|
||||
case "/":
|
||||
return !!contextToken && (isStringLiteralLike(contextToken) ? !!tryGetImportFromModuleSpecifier(contextToken) : contextToken.kind === 31 /* LessThanSlashToken */ && isJsxClosingElement(contextToken.parent));
|
||||
return !!contextToken && (isStringLiteralLike(contextToken) ? !!tryGetImportFromModuleSpecifier(contextToken) : contextToken.kind === 44 /* SlashToken */ && isJsxClosingElement(contextToken.parent));
|
||||
case " ":
|
||||
return !!contextToken && isImportKeyword(contextToken) && contextToken.parent.kind === 308 /* SourceFile */;
|
||||
default:
|
||||
|
||||
4
desktop-operator/node_modules/typescript/package.json
generated
vendored
4
desktop-operator/node_modules/typescript/package.json
generated
vendored
@@ -2,7 +2,7 @@
|
||||
"name": "typescript",
|
||||
"author": "Microsoft Corp.",
|
||||
"homepage": "https://www.typescriptlang.org/",
|
||||
"version": "5.9.2",
|
||||
"version": "5.9.3",
|
||||
"license": "Apache-2.0",
|
||||
"description": "TypeScript is a language for application scale JavaScript development",
|
||||
"keywords": [
|
||||
@@ -116,5 +116,5 @@
|
||||
"node": "20.1.0",
|
||||
"npm": "8.19.4"
|
||||
},
|
||||
"gitHead": "5be33469d551655d878876faa9e30aa3b49f8ee9"
|
||||
"gitHead": "c63de15a992d37f0d6cec03ac7631872838602cb"
|
||||
}
|
||||
|
||||
18
desktop-operator/package-lock.json
generated
18
desktop-operator/package-lock.json
generated
@@ -689,9 +689,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "22.18.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz",
|
||||
"integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==",
|
||||
"version": "22.18.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz",
|
||||
"integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~6.21.0"
|
||||
@@ -2019,9 +2019,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/electron": {
|
||||
"version": "38.2.0",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-38.2.0.tgz",
|
||||
"integrity": "sha512-Cw5Mb+N5NxsG0Hc1qr8I65Kt5APRrbgTtEEn3zTod30UNJRnAE1xbGk/1NOaDn3ODzI/MYn6BzT9T9zreP7xWA==",
|
||||
"version": "38.2.1",
|
||||
"resolved": "https://registry.npmjs.org/electron/-/electron-38.2.1.tgz",
|
||||
"integrity": "sha512-P4pE2RpRg3kM8IeOK+heg6iAxR5wcXnNHrbVchn7M3GBnYAhjfJRkROusdOro5PlKzdtfKjesbbqaG4MqQXccg==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
@@ -4621,9 +4621,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.9.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
|
||||
"integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
|
||||
"version": "5.9.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
|
||||
@@ -21,7 +21,7 @@ class ConfigManager {
|
||||
// Конфигурация по умолчанию
|
||||
return {
|
||||
server: {
|
||||
url: 'http://localhost:3001',
|
||||
url: 'http://localhost:3002',
|
||||
autoConnect: false,
|
||||
reconnectAttempts: 3,
|
||||
reconnectInterval: 5000
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -11,11 +11,101 @@
|
||||
<!-- Header -->
|
||||
<header class="app-header">
|
||||
<div class="logo">
|
||||
<h1>🔍 GodEye Operator</h1>
|
||||
<!-- SVG Logo Icon -->
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" class="logo-icon">
|
||||
<defs>
|
||||
<linearGradient id="logoGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#4CAF50"/>
|
||||
<stop offset="100%" style="stop-color:#8BC34A"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<circle cx="16" cy="16" r="15" fill="url(#logoGradient)" stroke="#2E7D32" stroke-width="2"/>
|
||||
<circle cx="16" cy="16" r="8" fill="none" stroke="#fff" stroke-width="2"/>
|
||||
<circle cx="16" cy="16" r="3" fill="#fff"/>
|
||||
<path d="M8 8 L12 12 M24 8 L20 12 M8 24 L12 20 M24 24 L20 20" stroke="#fff" stroke-width="2" stroke-linecap="round"/>
|
||||
</svg>
|
||||
<h1>GodEye Operator</h1>
|
||||
</div>
|
||||
<div class="connection-status">
|
||||
<span id="connection-indicator" class="status disconnected">● Отключен</span>
|
||||
<span id="session-info"></span>
|
||||
|
||||
<div class="header-controls">
|
||||
<!-- Connection Status & Info -->
|
||||
<div class="connection-info">
|
||||
<span id="connection-status-text">Не подключен</span>
|
||||
<span id="ping-indicator">Ping: --</span>
|
||||
</div>
|
||||
|
||||
<!-- Connection Button -->
|
||||
<button id="connection-toggle" class="connection-toggle disconnected" title="Нажмите для подключения/отключения">
|
||||
<svg id="connection-status-icon" width="16" height="16" viewBox="0 0 16 16" class="status-icon disconnected">
|
||||
<circle cx="8" cy="8" r="6" fill="none" stroke="currentColor" stroke-width="2"/>
|
||||
<circle cx="8" cy="8" r="2" fill="currentColor"/>
|
||||
</svg>
|
||||
<span id="connection-button-text">Отключен</span>
|
||||
</button>
|
||||
|
||||
<!-- Settings Dropdown -->
|
||||
<div class="settings-dropdown">
|
||||
<button id="settings-toggle" class="settings-button" title="Настройки">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20">
|
||||
<path fill="currentColor" d="M10 6a4 4 0 100 8 4 4 0 000-8zM8 10a2 2 0 114 0 2 2 0 01-4 0z"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M10 2a1 1 0 011 1v1.323l1.532.884a1 1 0 01.5.866v.654l1.532.884a1 1 0 010 1.732L13.032 10l1.532.884a1 1 0 010 1.732l-1.532.884v.654a1 1 0 01-.5.866L11 16.677V18a1 1 0 11-2 0v-1.323L7.468 15.793a1 1 0 01-.5-.866v-.654l-1.532-.884a1 1 0 010-1.732L6.968 10 5.436 9.116a1 1 0 010-1.732l1.532-.884v-.654a1 1 0 01.5-.866L9 4.323V3a1 1 0 011-1z"/>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<div id="settings-menu" class="settings-menu">
|
||||
<!-- Server URL -->
|
||||
<div class="setting-item">
|
||||
<label for="server-url">URL сервера:</label>
|
||||
<input type="text" id="server-url" value="http://localhost:3001" placeholder="http://localhost:3001">
|
||||
</div>
|
||||
|
||||
<!-- Auto-connect -->
|
||||
<div class="setting-item">
|
||||
<label>
|
||||
<input type="checkbox" id="auto-connect"> Автоподключение
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Advanced Settings Divider -->
|
||||
<div class="setting-divider"></div>
|
||||
<div class="setting-label">Расширенные настройки</div>
|
||||
|
||||
<!-- Connection Timeout -->
|
||||
<div class="setting-item">
|
||||
<label for="connection-timeout">Таймаут (мс):</label>
|
||||
<input type="number" id="connection-timeout" value="10000" min="1000" max="60000">
|
||||
</div>
|
||||
|
||||
<!-- Reconnect Attempts -->
|
||||
<div class="setting-item">
|
||||
<label for="reconnect-attempts">Попытки переподключения:</label>
|
||||
<input type="number" id="reconnect-attempts" value="5" min="0" max="20">
|
||||
</div>
|
||||
|
||||
<!-- Ping Interval -->
|
||||
<div class="setting-item">
|
||||
<label for="ping-interval">Интервал пинга (мс):</label>
|
||||
<input type="number" id="ping-interval" value="25000" min="5000" max="120000">
|
||||
</div>
|
||||
|
||||
<!-- Compression -->
|
||||
<div class="setting-item">
|
||||
<label>
|
||||
<input type="checkbox" id="compression" checked> Сжатие данных
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Debug Mode -->
|
||||
<div class="setting-item">
|
||||
<label>
|
||||
<input type="checkbox" id="debug-mode"> Режим отладки
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Session Info -->
|
||||
<span id="session-info" class="session-info"></span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
@@ -99,69 +189,104 @@
|
||||
|
||||
<!-- Right Panel - Devices & Sessions -->
|
||||
<div class="control-panel">
|
||||
<!-- Connection Settings -->
|
||||
<div class="connection-panel panel-section collapsible">
|
||||
<div class="panel-header clickable" id="connection-toggle">
|
||||
<h3>🔌 Подключение к серверу</h3>
|
||||
<span class="collapse-icon collapsed">▼</span>
|
||||
</div>
|
||||
<div class="panel-content collapsed" id="connection-content">
|
||||
<div class="input-group">
|
||||
<label for="server-url">URL сервера:</label>
|
||||
<input type="text" id="server-url" value="http://localhost:3001" placeholder="http://localhost:3001">
|
||||
</div>
|
||||
<div class="checkbox-group">
|
||||
<label>
|
||||
<input type="checkbox" id="auto-connect"> Автоматически подключаться при запуске
|
||||
</label>
|
||||
</div>
|
||||
<div class="button-group">
|
||||
<button id="connect-btn" class="btn-primary">Подключиться</button>
|
||||
<button id="disconnect-btn" class="btn-secondary" disabled>Отключиться</button>
|
||||
</div>
|
||||
<div id="connection-info" class="connection-info">
|
||||
<span id="connection-status-text">Не подключен</span>
|
||||
<span id="ping-indicator">Ping: --</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-header">
|
||||
<h2>Панель управления</h2>
|
||||
<button id="sidebar-toggle" class="btn-collapse sidebar-collapse" title="Свернуть/развернуть сайдбар">
|
||||
<span class="collapse-icon">◄</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div id="sidebar-content" class="sidebar-content">
|
||||
|
||||
<!-- Available Devices -->
|
||||
<div class="devices-panel panel-section">
|
||||
<div class="devices-panel">
|
||||
<div class="panel-header">
|
||||
<h3>📱 Доступные устройства</h3>
|
||||
<button id="refresh-devices" class="btn-icon" title="Обновить список">🔄</button>
|
||||
<h3>Доступные устройства</h3>
|
||||
<button id="devices-toggle" class="btn-collapse" title="Свернуть/развернуть">
|
||||
<span class="collapse-icon">▲</span>
|
||||
</button>
|
||||
</div>
|
||||
<div id="devices-list" class="devices-list compact-list">
|
||||
<div class="no-devices">Нет подключенных устройств</div>
|
||||
<div id="devices-content" class="panel-content">
|
||||
<div class="devices-header" style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<span></span>
|
||||
<button id="refresh-devices" class="btn-secondary btn-small" title="Обновить список устройств">🔄 Обновить</button>
|
||||
</div>
|
||||
<div id="devices-list" class="devices-list">
|
||||
<div class="no-devices">Нет подключенных устройств</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Active Sessions -->
|
||||
<div class="sessions-panel panel-section">
|
||||
<h3>🔗 Активные сессии</h3>
|
||||
<div id="sessions-list" class="sessions-list compact-list">
|
||||
<div class="no-sessions">Нет активных сессий</div>
|
||||
<div class="sessions-panel">
|
||||
<div class="panel-header">
|
||||
<h3>Активные сессии</h3>
|
||||
<button id="sessions-toggle" class="btn-collapse" title="Свернуть/развернуть">
|
||||
<span class="collapse-icon">▲</span>
|
||||
</button>
|
||||
</div>
|
||||
<div id="sessions-content" class="panel-content">
|
||||
<div id="sessions-list" class="sessions-list">
|
||||
<div class="no-sessions">Нет активных сессий</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Session History -->
|
||||
<div class="history-panel">
|
||||
<div class="panel-header">
|
||||
<h3>История сессий</h3>
|
||||
<button id="history-toggle" class="btn-collapse" title="Свернуть/развернуть">
|
||||
<span class="collapse-icon">▲</span>
|
||||
</button>
|
||||
</div>
|
||||
<div id="history-content" class="history-content panel-content">
|
||||
<div class="history-stats">
|
||||
<div class="stat-item">
|
||||
<span class="stat-label">Всего сессий:</span>
|
||||
<span id="total-sessions">0</span>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<span class="stat-label">Успешных:</span>
|
||||
<span id="successful-sessions">0</span>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<span class="stat-label">Общее время:</span>
|
||||
<span id="total-duration">0:00</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="history-controls">
|
||||
<button id="export-history" class="btn-secondary btn-small">📊 Экспорт</button>
|
||||
<button id="clear-history" class="btn-secondary btn-small">🗑️ Очистить</button>
|
||||
</div>
|
||||
<div id="history-list" class="history-list">
|
||||
<div class="no-history">История пуста</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Logs -->
|
||||
<div class="logs-panel panel-section collapsible">
|
||||
<div class="panel-header clickable" id="logs-toggle">
|
||||
<h3>📋 Журнал событий</h3>
|
||||
<span class="collapse-icon">▲</span>
|
||||
<div class="logs-panel">
|
||||
<div class="panel-header">
|
||||
<h3>Журнал событий</h3>
|
||||
<button id="logs-toggle" class="btn-collapse" title="Свернуть/развернуть">
|
||||
<span class="collapse-icon">▲</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="panel-content" id="logs-content">
|
||||
<div id="logs-container" class="logs-container"></div>
|
||||
<div id="logs-content" class="panel-content">
|
||||
<div id="logs-container" class="logs-container" style="max-height: 180px; overflow-y: auto;"></div>
|
||||
<button id="clear-logs" class="btn-secondary btn-small">Очистить</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Toast Notifications Container -->
|
||||
<div id="toast-container" class="toast-container"></div>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="/socket.io/socket.io.js"></script>
|
||||
<script src="https://cdn.socket.io/4.8.1/socket.io.min.js"></script>
|
||||
<script src="app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
4908
desktop-operator/src/renderer/socket.io.js
Normal file
4908
desktop-operator/src/renderer/socket.io.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
background: #1a1a1a;
|
||||
background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%);
|
||||
color: #ffffff;
|
||||
overflow: hidden;
|
||||
}
|
||||
@@ -20,34 +20,184 @@ body {
|
||||
|
||||
/* Header */
|
||||
.app-header {
|
||||
background: #2d2d2d;
|
||||
padding: 10px 20px;
|
||||
background: linear-gradient(135deg, #2d2d2d 0%, #3d3d3d 100%);
|
||||
padding: 15px 25px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
border-bottom: 2px solid #333;
|
||||
border-bottom: 2px solid #4CAF50;
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.3);
|
||||
position: relative;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.logo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.logo-icon {
|
||||
animation: logoRotate 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes logoRotate {
|
||||
0%, 100% { transform: rotate(0deg); }
|
||||
50% { transform: rotate(5deg); }
|
||||
}
|
||||
|
||||
.logo h1 {
|
||||
font-size: 20px;
|
||||
color: #4CAF50;
|
||||
font-size: 22px;
|
||||
font-weight: 700;
|
||||
background: linear-gradient(135deg, #4CAF50, #8BC34A);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
text-shadow: 0 2px 4px rgba(0,0,0,0.3);
|
||||
}
|
||||
|
||||
.connection-status {
|
||||
.header-controls {
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.status {
|
||||
padding: 4px 12px;
|
||||
border-radius: 12px;
|
||||
.connection-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
.status.connected {
|
||||
background: #4CAF50;
|
||||
.connection-toggle {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 8px 16px;
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
.connection-toggle.connected {
|
||||
background: linear-gradient(135deg, #4CAF50, #66BB6A);
|
||||
color: white;
|
||||
box-shadow: 0 2px 12px rgba(76, 175, 80, 0.4);
|
||||
}
|
||||
|
||||
.connection-toggle.disconnected {
|
||||
background: linear-gradient(135deg, #f44336, #ef5350);
|
||||
color: white;
|
||||
box-shadow: 0 2px 12px rgba(244, 67, 54, 0.4);
|
||||
}
|
||||
|
||||
.connection-toggle:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 16px rgba(0,0,0,0.3);
|
||||
}
|
||||
|
||||
.settings-dropdown {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.settings-button {
|
||||
background: none;
|
||||
border: 1px solid #555;
|
||||
border-radius: 8px;
|
||||
padding: 8px;
|
||||
color: #888;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.settings-button:hover {
|
||||
background: rgba(255,255,255,0.1);
|
||||
color: #fff;
|
||||
border-color: #4CAF50;
|
||||
}
|
||||
|
||||
.settings-menu {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
right: 0;
|
||||
background: linear-gradient(135deg, #2d2d2d 0%, #3d3d3d 100%);
|
||||
border: 1px solid #555;
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
min-width: 300px;
|
||||
max-height: 400px;
|
||||
overflow-y: auto;
|
||||
box-shadow: 0 8px 32px rgba(0,0,0,0.4);
|
||||
z-index: 2000;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.settings-menu.show {
|
||||
display: block;
|
||||
animation: settingsSlideIn 0.2s ease-out;
|
||||
}
|
||||
|
||||
@keyframes settingsSlideIn {
|
||||
0% {
|
||||
opacity: 0;
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.setting-item {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.setting-item label {
|
||||
display: block;
|
||||
color: #ccc;
|
||||
font-size: 13px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.setting-item input[type="text"],
|
||||
.setting-item input[type="number"] {
|
||||
width: 100%;
|
||||
padding: 8px 12px;
|
||||
background: rgba(255,255,255,0.1);
|
||||
border: 1px solid #555;
|
||||
border-radius: 6px;
|
||||
color: #fff;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.setting-item input[type="checkbox"] {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.setting-divider {
|
||||
height: 1px;
|
||||
background: #555;
|
||||
margin: 15px 0;
|
||||
}
|
||||
|
||||
.setting-label {
|
||||
font-weight: 600;
|
||||
color: #4CAF50;
|
||||
font-size: 12px;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.session-info {
|
||||
font-size: 12px;
|
||||
color: #4CAF50;
|
||||
font-weight: 500;
|
||||
}
|
||||
color: white;
|
||||
}
|
||||
|
||||
@@ -306,91 +456,19 @@ body {
|
||||
background: #252525;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
max-width: 380px;
|
||||
min-width: 300px;
|
||||
transition: max-width 0.3s ease;
|
||||
}
|
||||
|
||||
.control-panel.logs-collapsed {
|
||||
max-width: 320px;
|
||||
max-width: 350px;
|
||||
}
|
||||
|
||||
.control-panel > div {
|
||||
padding: 15px;
|
||||
border-bottom: 1px solid #333;
|
||||
}
|
||||
|
||||
/* Panel Sections */
|
||||
.panel-section {
|
||||
padding: 12px;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.panel-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.panel-header.clickable {
|
||||
cursor: pointer;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.panel-header.clickable:hover {
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
margin: -5px;
|
||||
padding: 5px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.collapse-icon {
|
||||
font-size: 12px;
|
||||
transition: transform 0.3s ease;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
.collapse-icon.collapsed {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.panel-content {
|
||||
transition: all 0.3s ease;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.panel-content.collapsed {
|
||||
max-height: 0;
|
||||
padding: 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
/* Connection Panel */
|
||||
.connection-panel {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.connection-panel.collapsed {
|
||||
flex: none;
|
||||
}
|
||||
|
||||
.connection-panel h3 {
|
||||
margin-bottom: 8px;
|
||||
margin-bottom: 15px;
|
||||
color: #4CAF50;
|
||||
font-size: 13px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.connection-panel h3 span {
|
||||
font-size: 10px;
|
||||
margin-left: auto;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
@@ -457,53 +535,32 @@ button:disabled {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
/* Devices and Sessions Panels */
|
||||
.devices-panel,
|
||||
.sessions-panel {
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
/* Devices Panel */
|
||||
.devices-panel h3,
|
||||
.sessions-panel h3 {
|
||||
margin-bottom: 8px;
|
||||
margin-bottom: 15px;
|
||||
color: #2196F3;
|
||||
font-size: 13px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.compact-list {
|
||||
max-height: 180px;
|
||||
.devices-list,
|
||||
.sessions-list {
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
transition: max-height 0.3s ease;
|
||||
}
|
||||
|
||||
.control-panel.logs-collapsed .compact-list {
|
||||
max-height: 250px;
|
||||
}
|
||||
|
||||
.device-item,
|
||||
.session-item {
|
||||
background: #3a3a3a;
|
||||
margin-bottom: 6px;
|
||||
padding: 8px;
|
||||
margin-bottom: 8px;
|
||||
padding: 10px;
|
||||
border-radius: 4px;
|
||||
border-left: 3px solid #4CAF50;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.device-item:hover,
|
||||
.session-item:hover {
|
||||
background: #404040;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.device-info {
|
||||
font-size: 11px;
|
||||
margin-bottom: 4px;
|
||||
line-height: 1.3;
|
||||
font-size: 12px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.device-info strong {
|
||||
@@ -511,56 +568,28 @@ button:disabled {
|
||||
}
|
||||
|
||||
.device-capabilities {
|
||||
font-size: 10px;
|
||||
font-size: 11px;
|
||||
color: #888;
|
||||
margin-bottom: 6px;
|
||||
line-height: 1.2;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.device-actions {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
flex-wrap: wrap;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.btn-device {
|
||||
background: #2196F3;
|
||||
border: none;
|
||||
color: white;
|
||||
padding: 3px 6px;
|
||||
padding: 4px 8px;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
font-size: 9px;
|
||||
transition: all 0.2s ease;
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.btn-device:hover {
|
||||
background: #1976D2;
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
.btn-device.btn-success {
|
||||
background: #4CAF50;
|
||||
}
|
||||
|
||||
.btn-device.btn-success:hover {
|
||||
background: #45a049;
|
||||
}
|
||||
|
||||
.btn-icon {
|
||||
background: none;
|
||||
border: none;
|
||||
color: #888;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
padding: 2px;
|
||||
border-radius: 3px;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.btn-icon:hover {
|
||||
color: #fff;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.no-devices,
|
||||
@@ -571,119 +600,29 @@ button:disabled {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
/* Session styles */
|
||||
.session-item {
|
||||
border-left: 3px solid #2196F3;
|
||||
}
|
||||
|
||||
.session-item.session-pending {
|
||||
border-left-color: #FF9800;
|
||||
}
|
||||
|
||||
.session-item.session-active {
|
||||
border-left-color: #4CAF50;
|
||||
}
|
||||
|
||||
.session-item.session-rejected {
|
||||
border-left-color: #f44336;
|
||||
}
|
||||
|
||||
.session-item.session-ended {
|
||||
border-left-color: #666;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.session-item.active {
|
||||
background: #4a4a4a;
|
||||
border: 2px solid #4CAF50;
|
||||
border-left: 3px solid #4CAF50;
|
||||
}
|
||||
|
||||
.session-header {
|
||||
font-size: 12px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.session-header strong {
|
||||
color: #4CAF50;
|
||||
}
|
||||
|
||||
.status-pending { color: #FF9800; }
|
||||
.status-active { color: #4CAF50; }
|
||||
.status-rejected { color: #f44336; }
|
||||
.status-ended { color: #666; }
|
||||
|
||||
.session-actions {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.btn-small {
|
||||
padding: 2px 6px;
|
||||
font-size: 10px;
|
||||
border: none;
|
||||
border-radius: 2px;
|
||||
cursor: pointer;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-small.btn-primary {
|
||||
background: #2196F3;
|
||||
}
|
||||
|
||||
.btn-small.btn-success {
|
||||
background: #4CAF50;
|
||||
}
|
||||
|
||||
.btn-small.btn-secondary {
|
||||
background: #757575;
|
||||
}
|
||||
|
||||
.btn-small.btn-danger {
|
||||
background: #f44336;
|
||||
}
|
||||
|
||||
.btn-small:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
/* Logs Panel */
|
||||
.logs-panel {
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.logs-panel.collapsed {
|
||||
flex: none;
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.logs-panel h3 {
|
||||
margin-bottom: 8px;
|
||||
margin-bottom: 15px;
|
||||
color: #FF9800;
|
||||
font-size: 13px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.logs-container {
|
||||
flex: 1;
|
||||
background: #1a1a1a;
|
||||
border: 1px solid #333;
|
||||
border-radius: 4px;
|
||||
padding: 6px;
|
||||
padding: 8px;
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 10px;
|
||||
font-size: 11px;
|
||||
overflow-y: auto;
|
||||
margin-bottom: 8px;
|
||||
max-height: 120px;
|
||||
transition: max-height 0.3s ease;
|
||||
}
|
||||
|
||||
.control-panel.logs-collapsed .logs-container {
|
||||
max-height: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.log-entry {
|
||||
@@ -906,4 +845,399 @@ button:disabled {
|
||||
border-right: 1px solid #333;
|
||||
border-bottom: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Toast Notifications */
|
||||
.toast-container {
|
||||
position: fixed;
|
||||
top: 20px;
|
||||
right: 20px;
|
||||
z-index: 10000;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.toast {
|
||||
background: linear-gradient(135deg, #2d2d2d 0%, #3d3d3d 100%);
|
||||
color: white;
|
||||
padding: 16px 20px;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 8px 32px rgba(0,0,0,0.3);
|
||||
border-left: 4px solid #4CAF50;
|
||||
min-width: 300px;
|
||||
max-width: 400px;
|
||||
position: relative;
|
||||
pointer-events: auto;
|
||||
opacity: 0;
|
||||
transform: translateX(100%);
|
||||
animation: toastSlideIn 0.3s ease-out forwards;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.toast.removing {
|
||||
animation: toastSlideOut 0.3s ease-in forwards;
|
||||
}
|
||||
|
||||
.toast.success {
|
||||
border-left-color: #4CAF50;
|
||||
}
|
||||
|
||||
.toast.error {
|
||||
border-left-color: #f44336;
|
||||
}
|
||||
|
||||
.toast.warning {
|
||||
border-left-color: #ff9800;
|
||||
}
|
||||
|
||||
.toast.info {
|
||||
border-left-color: #2196F3;
|
||||
}
|
||||
|
||||
.toast-content {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.toast-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
flex-shrink: 0;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.toast-text {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.toast-title {
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.toast-message {
|
||||
font-size: 13px;
|
||||
opacity: 0.9;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.toast-close {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
right: 8px;
|
||||
background: none;
|
||||
border: none;
|
||||
color: #888;
|
||||
cursor: pointer;
|
||||
font-size: 18px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 50%;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.toast-close:hover {
|
||||
background: rgba(255,255,255,0.1);
|
||||
color: white;
|
||||
}
|
||||
|
||||
@keyframes toastSlideIn {
|
||||
0% {
|
||||
opacity: 0;
|
||||
transform: translateX(100%);
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes toastSlideOut {
|
||||
0% {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
|
||||
/* Advanced Settings */
|
||||
.advanced-toggle {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.btn-link {
|
||||
background: none;
|
||||
border: none;
|
||||
color: #4CAF50;
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
text-decoration: underline;
|
||||
padding: 4px 0;
|
||||
transition: color 0.2s ease;
|
||||
}
|
||||
|
||||
.btn-link:hover {
|
||||
color: #66BB6A;
|
||||
}
|
||||
|
||||
.advanced-settings {
|
||||
background: rgba(255,255,255,0.05);
|
||||
border: 1px solid #333;
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
margin: 10px 0;
|
||||
animation: slideDown 0.3s ease-out;
|
||||
}
|
||||
|
||||
.advanced-settings.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.settings-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.settings-grid .input-group,
|
||||
.settings-grid .checkbox-group {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 1200px) {
|
||||
.settings-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideDown {
|
||||
0% {
|
||||
opacity: 0;
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Session History */
|
||||
.history-panel {
|
||||
background: #2d2d2d;
|
||||
border-radius: 12px;
|
||||
margin-bottom: 20px;
|
||||
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Collapsible Panels */
|
||||
.panel-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 15px 20px;
|
||||
background: linear-gradient(135deg, #3d3d3d, #4d4d4d);
|
||||
border-bottom: 1px solid #555;
|
||||
cursor: pointer;
|
||||
transition: background 0.2s ease;
|
||||
}
|
||||
|
||||
.panel-header:hover {
|
||||
background: linear-gradient(135deg, #4d4d4d, #5d5d5d);
|
||||
}
|
||||
|
||||
.panel-header h3 {
|
||||
color: #4CAF50;
|
||||
margin: 0;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.panel-content {
|
||||
padding: 20px;
|
||||
transition: all 0.3s ease;
|
||||
max-height: 500px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.panel-content.collapsed {
|
||||
max-height: 0;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.btn-collapse {
|
||||
background: none;
|
||||
border: none;
|
||||
color: #888;
|
||||
cursor: pointer;
|
||||
padding: 4px 8px;
|
||||
border-radius: 4px;
|
||||
transition: all 0.2s ease;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.btn-collapse:hover {
|
||||
background: rgba(255,255,255,0.1);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.collapse-icon {
|
||||
transition: transform 0.2s ease;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.collapse-icon.collapsed {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
/* Sidebar Collapsible */
|
||||
.sidebar-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 15px 20px;
|
||||
background: linear-gradient(135deg, #3d3d3d, #4d4d4d);
|
||||
border-bottom: 2px solid #4CAF50;
|
||||
}
|
||||
|
||||
.sidebar-header h2 {
|
||||
color: #4CAF50;
|
||||
margin: 0;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.sidebar-collapse {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.sidebar-content {
|
||||
transition: all 0.3s ease;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.control-panel.collapsed .sidebar-content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.control-panel.collapsed {
|
||||
width: 60px;
|
||||
min-width: 60px;
|
||||
}
|
||||
|
||||
.control-panel.collapsed .sidebar-header {
|
||||
padding: 15px 10px;
|
||||
}
|
||||
|
||||
.control-panel.collapsed .sidebar-header h2 {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.control-panel.collapsed .collapse-icon {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.history-panel {
|
||||
background: #2d2d2d;
|
||||
border-radius: 12px;
|
||||
margin-bottom: 20px;
|
||||
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.history-stats {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.stat-item {
|
||||
background: rgba(76, 175, 80, 0.1);
|
||||
padding: 10px;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
border: 1px solid rgba(76, 175, 80, 0.3);
|
||||
}
|
||||
|
||||
.stat-label {
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.stat-item span:last-child {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: #4CAF50;
|
||||
}
|
||||
|
||||
.history-controls {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.history-list {
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.history-item {
|
||||
background: rgba(255,255,255,0.05);
|
||||
padding: 12px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 8px;
|
||||
border-left: 3px solid #4CAF50;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.history-item:hover {
|
||||
background: rgba(255,255,255,0.08);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.history-item.failed {
|
||||
border-left-color: #f44336;
|
||||
}
|
||||
|
||||
.history-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.history-device {
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.history-duration {
|
||||
font-size: 12px;
|
||||
color: #4CAF50;
|
||||
}
|
||||
|
||||
.history-details {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.no-history {
|
||||
text-align: center;
|
||||
color: #666;
|
||||
font-style: italic;
|
||||
padding: 20px;
|
||||
}
|
||||
Reference in New Issue
Block a user