@cloudcli-ai/cloudcli 1.35.0 → 1.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -7
- package/dist/api-docs.html +8 -2
- package/dist/assets/{index-CtwxqzGG.js → index-S6cIy7hj.js} +271 -260
- package/dist/assets/index-uLUE6Qt1.css +32 -0
- package/dist/index.html +12 -4
- package/dist-server/server/claude-sdk.js +25 -26
- package/dist-server/server/claude-sdk.js.map +1 -1
- package/dist-server/server/index.js +0 -13
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +70 -1
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +52 -11
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +138 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js +5 -0
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-models.service.js +1 -1
- package/dist-server/server/modules/providers/tests/opencode-models.test.js +58 -1
- package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -1
- package/dist-server/server/modules/websocket/services/websocket-server.service.js +0 -5
- package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -1
- package/dist-server/server/openai-codex.js +9 -8
- package/dist-server/server/openai-codex.js.map +1 -1
- package/dist-server/server/opencode-cli.js +20 -2
- package/dist-server/server/opencode-cli.js.map +1 -1
- package/dist-server/server/routes/agent.js +14 -3
- package/dist-server/server/routes/agent.js.map +1 -1
- package/electron/desktopWindow.js +0 -15
- package/electron/launcher/launcher.js +1 -143
- package/electron/main.js +1 -117
- package/electron/preload.cjs +0 -3
- package/package.json +3 -8
- package/public/api-docs.html +8 -2
- package/scripts/release/prepare-desktop-app.js +0 -6
- package/server/claude-sdk.js +32 -26
- package/server/index.js +0 -14
- package/server/modules/providers/list/claude/claude-models.provider.ts +73 -1
- package/server/modules/providers/list/codex/codex-models.provider.ts +59 -11
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +180 -1
- package/server/modules/providers/services/provider-capabilities.service.ts +7 -0
- package/server/modules/providers/services/provider-models.service.ts +1 -1
- package/server/modules/providers/tests/opencode-models.test.ts +62 -0
- package/server/modules/websocket/services/websocket-server.service.ts +0 -6
- package/server/openai-codex.js +9 -7
- package/server/opencode-cli.js +21 -2
- package/server/routes/agent.js +14 -3
- package/server/shared/types.ts +7 -0
- package/dist/assets/index-DlvtxFyt.css +0 -32
- package/dist-server/server/computer-use-agent.js +0 -242
- package/dist-server/server/computer-use-agent.js.map +0 -1
- package/dist-server/server/computer-use-mcp.js +0 -519
- package/dist-server/server/computer-use-mcp.js.map +0 -1
- package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js +0 -55
- package/dist-server/server/modules/computer-use/actions/raw-action-dispatcher.js.map +0 -1
- package/dist-server/server/modules/computer-use/actions/raw-action-types.js +0 -2
- package/dist-server/server/modules/computer-use/actions/raw-action-types.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-executor.js +0 -212
- package/dist-server/server/modules/computer-use/computer-executor.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-semantics.service.js +0 -422
- package/dist-server/server/modules/computer-use/computer-semantics.service.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js +0 -126
- package/dist-server/server/modules/computer-use/computer-use-mcp.routes.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-use.routes.js +0 -196
- package/dist-server/server/modules/computer-use/computer-use.routes.js.map +0 -1
- package/dist-server/server/modules/computer-use/computer-use.service.js +0 -759
- package/dist-server/server/modules/computer-use/computer-use.service.js.map +0 -1
- package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js +0 -126
- package/dist-server/server/modules/computer-use/desktop-agent-relay.service.js.map +0 -1
- package/dist-server/server/modules/computer-use/index.js +0 -3
- package/dist-server/server/modules/computer-use/index.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js +0 -59
- package/dist-server/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js +0 -5
- package/dist-server/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js +0 -2
- package/dist-server/server/modules/computer-use/semantics/adapters/semantic-adapter.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js +0 -5
- package/dist-server/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
- package/dist-server/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
- package/dist-server/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
- package/dist-server/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
- package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js +0 -106
- package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-process.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js +0 -78
- package/dist-server/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js +0 -68
- package/dist-server/server/modules/computer-use/semantics/semantic-session-store.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js +0 -16
- package/dist-server/server/modules/computer-use/semantics/semantic-tool-dispatcher.js.map +0 -1
- package/dist-server/server/modules/computer-use/semantics/semantic-types.js +0 -2
- package/dist-server/server/modules/computer-use/semantics/semantic-types.js.map +0 -1
- package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js +0 -39
- package/dist-server/server/modules/websocket/services/desktop-agent-websocket.service.js.map +0 -1
- package/electron/computerAgent.js +0 -290
- package/scripts/build-computer-semantics.mjs +0 -133
- package/scripts/copy-computer-semantics-bin.mjs +0 -24
- package/server/computer-use-agent.ts +0 -279
- package/server/computer-use-mcp.ts +0 -574
- package/server/modules/computer-use/actions/raw-action-dispatcher.ts +0 -67
- package/server/modules/computer-use/actions/raw-action-types.ts +0 -28
- package/server/modules/computer-use/computer-executor.ts +0 -242
- package/server/modules/computer-use/computer-semantics.service.ts +0 -460
- package/server/modules/computer-use/computer-use-mcp.routes.ts +0 -141
- package/server/modules/computer-use/computer-use.routes.ts +0 -211
- package/server/modules/computer-use/computer-use.service.ts +0 -920
- package/server/modules/computer-use/desktop-agent-relay.service.ts +0 -158
- package/server/modules/computer-use/index.ts +0 -2
- package/server/modules/computer-use/semantics/adapters/helper-semantic-adapter.ts +0 -82
- package/server/modules/computer-use/semantics/adapters/macos/macos-semantic-adapter.ts +0 -5
- package/server/modules/computer-use/semantics/adapters/semantic-adapter.ts +0 -23
- package/server/modules/computer-use/semantics/adapters/windows/windows-semantic-adapter.ts +0 -5
- package/server/modules/computer-use/semantics/bin/darwin-arm64/CloudCLISemantics +0 -0
- package/server/modules/computer-use/semantics/bin/darwin-x64/CloudCLISemantics +0 -0
- package/server/modules/computer-use/semantics/bin/win32-arm64/CloudCLISemantics.exe +0 -0
- package/server/modules/computer-use/semantics/bin/win32-x64/CloudCLISemantics.exe +0 -0
- package/server/modules/computer-use/semantics/helpers/macos/CloudCLISemantics.swift +0 -467
- package/server/modules/computer-use/semantics/helpers/semantic-helper-process.ts +0 -124
- package/server/modules/computer-use/semantics/helpers/semantic-helper-resolver.ts +0 -97
- package/server/modules/computer-use/semantics/helpers/windows/CloudCLISemantics.csproj +0 -11
- package/server/modules/computer-use/semantics/helpers/windows/Program.cs +0 -534
- package/server/modules/computer-use/semantics/semantic-session-store.ts +0 -87
- package/server/modules/computer-use/semantics/semantic-tool-dispatcher.ts +0 -17
- package/server/modules/computer-use/semantics/semantic-types.ts +0 -58
- package/server/modules/websocket/services/desktop-agent-websocket.service.ts +0 -51
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
|
|
3
|
-
import type { WebSocket } from 'ws';
|
|
4
|
-
|
|
5
|
-
const RELAY_TIMEOUT_MS = Number.parseInt(process.env.CLOUDCLI_COMPUTER_USE_RELAY_TIMEOUT_MS || '60000', 10);
|
|
6
|
-
const WS_OPEN = 1;
|
|
7
|
-
|
|
8
|
-
type PendingRelay = {
|
|
9
|
-
resolve: (value: unknown) => void;
|
|
10
|
-
reject: (reason: Error) => void;
|
|
11
|
-
timer: ReturnType<typeof setTimeout>;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
type ConnectedAgent = {
|
|
15
|
-
ws: WebSocket;
|
|
16
|
-
label: string;
|
|
17
|
-
registeredAt: string;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
type RelayLifecycleHooks = {
|
|
21
|
-
canAcceptConnection?: () => boolean;
|
|
22
|
-
onFirstConnect?: () => void | Promise<void>;
|
|
23
|
-
onLastDisconnect?: () => void | Promise<void>;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
const agents = new Map<WebSocket, ConnectedAgent>();
|
|
27
|
-
const pending = new Map<string, PendingRelay>();
|
|
28
|
-
let hooks: RelayLifecycleHooks = {};
|
|
29
|
-
|
|
30
|
-
function rejectAllPending(reason: string): void {
|
|
31
|
-
for (const [callId, call] of pending.entries()) {
|
|
32
|
-
clearTimeout(call.timer);
|
|
33
|
-
call.reject(new Error(reason));
|
|
34
|
-
pending.delete(callId);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function pickAgent(): ConnectedAgent | undefined {
|
|
39
|
-
for (const agent of agents.values()) {
|
|
40
|
-
if (agent.ws.readyState === WS_OPEN) {
|
|
41
|
-
return agent;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Cloud-side registry of linked desktop agents and the request/response relay
|
|
49
|
-
* used to drive the user's real desktop. The hosted server never touches the OS
|
|
50
|
-
* itself — it only forwards `computer_*` actions to a connected desktop agent
|
|
51
|
-
* and awaits the screenshot it returns.
|
|
52
|
-
*/
|
|
53
|
-
export const desktopAgentRelay = {
|
|
54
|
-
setHooks(next: RelayLifecycleHooks): void {
|
|
55
|
-
hooks = next;
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
register(ws: WebSocket, label = 'desktop-agent'): boolean {
|
|
59
|
-
if (hooks.canAcceptConnection && !hooks.canAcceptConnection()) {
|
|
60
|
-
console.log(`[DesktopAgent] Rejected (${label}); Computer Use is disabled.`);
|
|
61
|
-
try {
|
|
62
|
-
ws.close(1008, 'Computer Use is disabled in this environment.');
|
|
63
|
-
} catch {
|
|
64
|
-
// ignore close failures
|
|
65
|
-
}
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const wasEmpty = pickAgent() === undefined;
|
|
70
|
-
agents.set(ws, { ws, label, registeredAt: new Date().toISOString() });
|
|
71
|
-
console.log(`[DesktopAgent] Registered (${label}); ${agents.size} connected.`);
|
|
72
|
-
|
|
73
|
-
ws.on('close', () => {
|
|
74
|
-
const wasRegistered = agents.delete(ws);
|
|
75
|
-
console.log(`[DesktopAgent] Disconnected (${label}); ${agents.size} remain.`);
|
|
76
|
-
if (wasRegistered && pickAgent() === undefined) {
|
|
77
|
-
rejectAllPending('Desktop agent disconnected.');
|
|
78
|
-
void hooks.onLastDisconnect?.();
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
if (wasEmpty) {
|
|
83
|
-
void hooks.onFirstConnect?.();
|
|
84
|
-
}
|
|
85
|
-
return true;
|
|
86
|
-
},
|
|
87
|
-
|
|
88
|
-
disconnectAll(reason = 'Desktop agent disconnected.'): void {
|
|
89
|
-
const hadAgent = pickAgent() !== undefined;
|
|
90
|
-
const sockets = [...agents.keys()];
|
|
91
|
-
agents.clear();
|
|
92
|
-
for (const ws of sockets) {
|
|
93
|
-
try {
|
|
94
|
-
ws.close(1008, reason);
|
|
95
|
-
} catch {
|
|
96
|
-
// ignore close failures
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
rejectAllPending(reason);
|
|
100
|
-
if (hadAgent) {
|
|
101
|
-
void hooks.onLastDisconnect?.();
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
|
|
105
|
-
/** Resolves a pending relay call with the desktop agent's reply. */
|
|
106
|
-
handleResult(id: string, result: unknown, error?: string): void {
|
|
107
|
-
const call = pending.get(id);
|
|
108
|
-
if (!call) {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
clearTimeout(call.timer);
|
|
112
|
-
pending.delete(id);
|
|
113
|
-
if (error) {
|
|
114
|
-
call.reject(new Error(error));
|
|
115
|
-
} else {
|
|
116
|
-
call.resolve(result);
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
|
|
120
|
-
isConnected(): boolean {
|
|
121
|
-
return pickAgent() !== undefined;
|
|
122
|
-
},
|
|
123
|
-
|
|
124
|
-
connectedCount(): number {
|
|
125
|
-
let count = 0;
|
|
126
|
-
for (const agent of agents.values()) {
|
|
127
|
-
if (agent.ws.readyState === WS_OPEN) {
|
|
128
|
-
count++;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return count;
|
|
132
|
-
},
|
|
133
|
-
|
|
134
|
-
async relay(type: string, params: Record<string, unknown>): Promise<unknown> {
|
|
135
|
-
const agent = pickAgent();
|
|
136
|
-
if (!agent) {
|
|
137
|
-
throw new Error(
|
|
138
|
-
'No desktop is linked. Open CloudCLI Desktop on this computer, connect the same account, and enable Computer Use.'
|
|
139
|
-
);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const id = randomUUID();
|
|
143
|
-
return new Promise<unknown>((resolve, reject) => {
|
|
144
|
-
const timer = setTimeout(() => {
|
|
145
|
-
pending.delete(id);
|
|
146
|
-
reject(new Error('Desktop agent did not respond in time.'));
|
|
147
|
-
}, RELAY_TIMEOUT_MS);
|
|
148
|
-
pending.set(id, { resolve, reject, timer });
|
|
149
|
-
try {
|
|
150
|
-
agent.ws.send(JSON.stringify({ kind: 'computer_relay', id, type, params }));
|
|
151
|
-
} catch (error) {
|
|
152
|
-
clearTimeout(timer);
|
|
153
|
-
pending.delete(id);
|
|
154
|
-
reject(error instanceof Error ? error : new Error('Failed to send to desktop agent.'));
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
},
|
|
158
|
-
};
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { SemanticHelperProcess } from '@/modules/computer-use/semantics/helpers/semantic-helper-process.js';
|
|
2
|
-
import { resolveSemanticHelper } from '@/modules/computer-use/semantics/helpers/semantic-helper-resolver.js';
|
|
3
|
-
import type { SemanticAdapter, SemanticAdapterCapabilities } from '@/modules/computer-use/semantics/adapters/semantic-adapter.js';
|
|
4
|
-
import type { SemanticApp, SemanticAppState, SemanticToolInput } from '@/modules/computer-use/semantics/semantic-types.js';
|
|
5
|
-
|
|
6
|
-
type HelperMethod =
|
|
7
|
-
| 'list_apps'
|
|
8
|
-
| 'get_app_state'
|
|
9
|
-
| 'click_element'
|
|
10
|
-
| 'perform_secondary_action'
|
|
11
|
-
| 'set_value'
|
|
12
|
-
| 'type_text'
|
|
13
|
-
| 'press_key'
|
|
14
|
-
| 'scroll_element'
|
|
15
|
-
| 'drag';
|
|
16
|
-
|
|
17
|
-
export class HelperSemanticAdapter implements SemanticAdapter {
|
|
18
|
-
private helper: SemanticHelperProcess | null = null;
|
|
19
|
-
|
|
20
|
-
constructor(
|
|
21
|
-
private readonly platform: NodeJS.Platform,
|
|
22
|
-
private readonly arch: NodeJS.Architecture = process.arch,
|
|
23
|
-
) {}
|
|
24
|
-
|
|
25
|
-
capabilities(): SemanticAdapterCapabilities {
|
|
26
|
-
return {
|
|
27
|
-
platform: this.platform,
|
|
28
|
-
appDiscovery: true,
|
|
29
|
-
accessibilityTree: true,
|
|
30
|
-
nativeElementActions: true,
|
|
31
|
-
nativeValueSetting: true,
|
|
32
|
-
targetedInput: true,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async listApps(): Promise<SemanticApp[]> {
|
|
37
|
-
return await this.request('list_apps', {}) as SemanticApp[];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
async getAppState(input: SemanticToolInput): Promise<SemanticAppState> {
|
|
41
|
-
return await this.request('get_app_state', input) as SemanticAppState;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
async clickElement(input: SemanticToolInput): Promise<SemanticAppState> {
|
|
45
|
-
return await this.request('click_element', input) as SemanticAppState;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async performSecondaryAction(input: SemanticToolInput): Promise<SemanticAppState> {
|
|
49
|
-
return await this.request('perform_secondary_action', input) as SemanticAppState;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async setValue(input: SemanticToolInput): Promise<SemanticAppState> {
|
|
53
|
-
return await this.request('set_value', input) as SemanticAppState;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async typeText(input: SemanticToolInput): Promise<SemanticAppState> {
|
|
57
|
-
return await this.request('type_text', input) as SemanticAppState;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async pressKey(input: SemanticToolInput): Promise<SemanticAppState> {
|
|
61
|
-
return await this.request('press_key', input) as SemanticAppState;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async scrollElement(input: SemanticToolInput): Promise<SemanticAppState> {
|
|
65
|
-
return await this.request('scroll_element', input) as SemanticAppState;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async drag(input: SemanticToolInput): Promise<SemanticAppState> {
|
|
69
|
-
return await this.request('drag', input) as SemanticAppState;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
private async request(method: HelperMethod, params: Record<string, unknown>): Promise<unknown> {
|
|
73
|
-
if (!this.helper) {
|
|
74
|
-
const resolution = resolveSemanticHelper(this.platform, this.arch);
|
|
75
|
-
if (!resolution.available || !resolution.path) {
|
|
76
|
-
throw new Error(resolution.reason || `Semantic helper is unavailable for ${this.platform}-${this.arch}.`);
|
|
77
|
-
}
|
|
78
|
-
this.helper = new SemanticHelperProcess(resolution.path);
|
|
79
|
-
}
|
|
80
|
-
return this.helper.request(method, params);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { SemanticApp, SemanticAppState, SemanticToolInput } from '@/modules/computer-use/semantics/semantic-types.js';
|
|
2
|
-
|
|
3
|
-
export type SemanticAdapterCapabilities = {
|
|
4
|
-
platform: NodeJS.Platform;
|
|
5
|
-
appDiscovery: boolean;
|
|
6
|
-
accessibilityTree: boolean;
|
|
7
|
-
nativeElementActions: boolean;
|
|
8
|
-
nativeValueSetting: boolean;
|
|
9
|
-
targetedInput: boolean;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export type SemanticAdapter = {
|
|
13
|
-
capabilities(): SemanticAdapterCapabilities;
|
|
14
|
-
listApps(): Promise<SemanticApp[]>;
|
|
15
|
-
getAppState(input: SemanticToolInput): Promise<SemanticAppState>;
|
|
16
|
-
clickElement(input: SemanticToolInput): Promise<SemanticAppState>;
|
|
17
|
-
performSecondaryAction(input: SemanticToolInput): Promise<SemanticAppState>;
|
|
18
|
-
setValue(input: SemanticToolInput): Promise<SemanticAppState>;
|
|
19
|
-
typeText(input: SemanticToolInput): Promise<SemanticAppState>;
|
|
20
|
-
pressKey(input: SemanticToolInput): Promise<SemanticAppState>;
|
|
21
|
-
scrollElement(input: SemanticToolInput): Promise<SemanticAppState>;
|
|
22
|
-
drag(input: SemanticToolInput): Promise<SemanticAppState>;
|
|
23
|
-
};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|