@anionex/dsh-computer-use 0.1.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/LICENSE +21 -0
- package/README.i18n.yaml +6 -0
- package/README.md +307 -0
- package/README.zh.md +307 -0
- package/assets/computer-use-fixture.png +0 -0
- package/assets/cursor.png +0 -0
- package/cordis.patch.yml +13 -0
- package/docs/interaction-policy.i18n.yaml +4 -0
- package/docs/interaction-policy.md +140 -0
- package/docs/interaction-policy.zh.md +140 -0
- package/lib/approval-policy.js +12 -0
- package/lib/approval-policy.js.map +1 -0
- package/lib/artifacts.js +79 -0
- package/lib/artifacts.js.map +1 -0
- package/lib/backend.js +3 -0
- package/lib/backend.js.map +1 -0
- package/lib/client.js +349 -0
- package/lib/client.js.map +1 -0
- package/lib/config.js +120 -0
- package/lib/config.js.map +1 -0
- package/lib/confirmations.js +99 -0
- package/lib/confirmations.js.map +1 -0
- package/lib/diff.js +58 -0
- package/lib/diff.js.map +1 -0
- package/lib/errors.js +22 -0
- package/lib/errors.js.map +1 -0
- package/lib/exposure.js +231 -0
- package/lib/exposure.js.map +1 -0
- package/lib/index.js +56 -0
- package/lib/index.js.map +1 -0
- package/lib/leases.js +259 -0
- package/lib/leases.js.map +1 -0
- package/lib/providers/macos.js +148 -0
- package/lib/providers/macos.js.map +1 -0
- package/lib/providers/native-helper.js +356 -0
- package/lib/providers/native-helper.js.map +1 -0
- package/lib/service.js +480 -0
- package/lib/service.js.map +1 -0
- package/lib/skill.js +119 -0
- package/lib/skill.js.map +1 -0
- package/lib/target-resolver.js +180 -0
- package/lib/target-resolver.js.map +1 -0
- package/lib/tools.js +493 -0
- package/lib/tools.js.map +1 -0
- package/lib/types/approval-policy.d.ts +13 -0
- package/lib/types/approval-policy.d.ts.map +1 -0
- package/lib/types/artifacts.d.ts +10 -0
- package/lib/types/artifacts.d.ts.map +1 -0
- package/lib/types/backend.d.ts +94 -0
- package/lib/types/backend.d.ts.map +1 -0
- package/lib/types/client/index.d.ts +78 -0
- package/lib/types/client/index.d.ts.map +1 -0
- package/lib/types/config.d.ts +75 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/confirmations.d.ts +23 -0
- package/lib/types/confirmations.d.ts.map +1 -0
- package/lib/types/diff.d.ts +5 -0
- package/lib/types/diff.d.ts.map +1 -0
- package/lib/types/errors.d.ts +15 -0
- package/lib/types/errors.d.ts.map +1 -0
- package/lib/types/exposure.d.ts +30 -0
- package/lib/types/exposure.d.ts.map +1 -0
- package/lib/types/index.d.ts +21 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/leases.d.ts +80 -0
- package/lib/types/leases.d.ts.map +1 -0
- package/lib/types/providers/macos.d.ts +15 -0
- package/lib/types/providers/macos.d.ts.map +1 -0
- package/lib/types/providers/native-helper.d.ts +36 -0
- package/lib/types/providers/native-helper.d.ts.map +1 -0
- package/lib/types/service.d.ts +52 -0
- package/lib/types/service.d.ts.map +1 -0
- package/lib/types/skill.d.ts +9 -0
- package/lib/types/skill.d.ts.map +1 -0
- package/lib/types/target-resolver.d.ts +38 -0
- package/lib/types/target-resolver.d.ts.map +1 -0
- package/lib/types/tools.d.ts +6 -0
- package/lib/types/tools.d.ts.map +1 -0
- package/lib/types/types.d.ts +246 -0
- package/lib/types/types.d.ts.map +1 -0
- package/lib/types/web.d.ts +32 -0
- package/lib/types/web.d.ts.map +1 -0
- package/lib/types.js +9 -0
- package/lib/types.js.map +1 -0
- package/lib/web.js +163 -0
- package/lib/web.js.map +1 -0
- package/native/macos/Sources/Fixture/main.swift +366 -0
- package/native/macos/Sources/Helper/CursorImage.swift +11 -0
- package/native/macos/Sources/Helper/CursorOverlay.swift +488 -0
- package/native/macos/Sources/Helper/TargetedPointer.swift +314 -0
- package/native/macos/Sources/Helper/main.swift +1140 -0
- package/native/macos/Sources/Monitor/main.swift +139 -0
- package/native/macos/bin/dsh-computer-use-helper +0 -0
- package/native/macos/manifest.json +14 -0
- package/package.json +128 -0
- package/scripts/build-client.mjs +24 -0
- package/scripts/build-native.mjs +158 -0
- package/scripts/check-native.mjs +92 -0
- package/scripts/model-e2e.mjs +291 -0
- package/scripts/session-transcript.mjs +117 -0
- package/scripts/validate.mjs +256 -0
- package/src/approval-policy.ts +16 -0
- package/src/artifacts.ts +93 -0
- package/src/backend.ts +103 -0
- package/src/client/index.tsx +539 -0
- package/src/config.ts +196 -0
- package/src/confirmations.ts +128 -0
- package/src/diff.ts +52 -0
- package/src/errors.ts +39 -0
- package/src/exposure.ts +236 -0
- package/src/index.ts +66 -0
- package/src/leases.ts +337 -0
- package/src/providers/macos.ts +185 -0
- package/src/providers/native-helper.ts +393 -0
- package/src/service.ts +583 -0
- package/src/skill.ts +123 -0
- package/src/target-resolver.ts +237 -0
- package/src/tools.ts +528 -0
- package/src/types.ts +299 -0
- package/src/web.ts +180 -0
package/lib/leases.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/** Session-sidecar read leases, durable denials, and per-turn control leases. */
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { defineDomain, domainTable } from '@deepseek-ai/dsh-storage-domain';
|
|
4
|
+
import { approvalPolicy } from "./approval-policy.js";
|
|
5
|
+
import { ComputerUseError } from "./errors.js";
|
|
6
|
+
const nonNegativeSafeInteger = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);
|
|
7
|
+
const leaseScopeSchema = z.union([z.literal('read'), z.literal('control')]);
|
|
8
|
+
const sessionIdentitySchema = z.object({
|
|
9
|
+
createdAt: nonNegativeSafeInteger,
|
|
10
|
+
cwd: z.string().optional(),
|
|
11
|
+
});
|
|
12
|
+
const deniedLeaseSchema = z.object({
|
|
13
|
+
bundleId: z.string().min(1),
|
|
14
|
+
scope: leaseScopeSchema,
|
|
15
|
+
});
|
|
16
|
+
/** Runtime validation for the whole-Session Computer Use sidecar row. */
|
|
17
|
+
export const computerUseSessionStateSchema = z.object({
|
|
18
|
+
session: sessionIdentitySchema,
|
|
19
|
+
readGrants: z.array(z.string().min(1)),
|
|
20
|
+
denied: z.array(deniedLeaseSchema),
|
|
21
|
+
}).superRefine((row, ctx) => {
|
|
22
|
+
const readGrants = new Set();
|
|
23
|
+
row.readGrants.forEach((bundleId, index) => {
|
|
24
|
+
if (readGrants.has(bundleId)) {
|
|
25
|
+
ctx.addIssue({
|
|
26
|
+
code: 'custom',
|
|
27
|
+
path: ['readGrants', index],
|
|
28
|
+
message: `duplicate Computer Use read grant '${bundleId}'`,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
readGrants.add(bundleId);
|
|
32
|
+
});
|
|
33
|
+
const denials = new Set();
|
|
34
|
+
row.denied.forEach((denial, index) => {
|
|
35
|
+
const key = `${denial.scope}\0${denial.bundleId}`;
|
|
36
|
+
if (denials.has(key)) {
|
|
37
|
+
ctx.addIssue({
|
|
38
|
+
code: 'custom',
|
|
39
|
+
path: ['denied', index],
|
|
40
|
+
message: `duplicate Computer Use ${denial.scope} denial '${denial.bundleId}'`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
denials.add(key);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
/** One lifecycle-bound Computer Use sidecar record per Session id. */
|
|
47
|
+
export const computerUseStateDomainSpec = defineDomain({
|
|
48
|
+
name: 'computer_use_state',
|
|
49
|
+
version: 0,
|
|
50
|
+
tables: {
|
|
51
|
+
sessions: domainTable(computerUseSessionStateSchema),
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
function currentTurn(events) {
|
|
55
|
+
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
56
|
+
const event = events[index];
|
|
57
|
+
if (event?.type === 'turn/end')
|
|
58
|
+
return undefined;
|
|
59
|
+
if (event?.type === 'turn/start')
|
|
60
|
+
return event.data.turn;
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
function identityOf(header) {
|
|
65
|
+
return Object.freeze({
|
|
66
|
+
createdAt: header.createdAt,
|
|
67
|
+
...(header.cwd === undefined ? {} : { cwd: header.cwd }),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function sameIdentity(row, header) {
|
|
71
|
+
return row.session.createdAt === header.createdAt && row.session.cwd === header.cwd;
|
|
72
|
+
}
|
|
73
|
+
function stateSnapshot(header, readGrants, denied) {
|
|
74
|
+
const readGrantSnapshot = Object.freeze([...readGrants]);
|
|
75
|
+
const deniedSnapshot = Object.freeze([...denied].map(item => Object.freeze({ ...item })));
|
|
76
|
+
return Object.freeze({
|
|
77
|
+
session: identityOf(header),
|
|
78
|
+
readGrants: readGrantSnapshot,
|
|
79
|
+
denied: deniedSnapshot,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function configuredAccess(config, bundleId, scope) {
|
|
83
|
+
if (config.allowAllApps)
|
|
84
|
+
return true;
|
|
85
|
+
return config.grants.find(grant => grant.bundleId === bundleId)?.[scope] === true;
|
|
86
|
+
}
|
|
87
|
+
function boundedFailure(error) {
|
|
88
|
+
return (error instanceof Error ? error.message : String(error)).slice(0, 500);
|
|
89
|
+
}
|
|
90
|
+
/** Applies configured app policy and routes missing leases through DSH approval. */
|
|
91
|
+
export class ComputerLeaseManager {
|
|
92
|
+
ctx;
|
|
93
|
+
config;
|
|
94
|
+
storage;
|
|
95
|
+
storageFiber;
|
|
96
|
+
decisionTails = new Map();
|
|
97
|
+
mutationTails = new Map();
|
|
98
|
+
controlGrants = new WeakMap();
|
|
99
|
+
constructor(ctx, config) {
|
|
100
|
+
this.ctx = ctx;
|
|
101
|
+
this.config = config;
|
|
102
|
+
this.storageFiber = ctx.inject(['storageDomain'], async (storageCtx) => {
|
|
103
|
+
const domain = await storageCtx.storageDomain.open(computerUseStateDomainSpec);
|
|
104
|
+
const binding = { table: domain.table('sessions') };
|
|
105
|
+
this.storage = binding;
|
|
106
|
+
return async () => {
|
|
107
|
+
if (this.storage === binding)
|
|
108
|
+
this.storage = undefined;
|
|
109
|
+
await Promise.all(this.mutationTails.values());
|
|
110
|
+
await domain.close();
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
ctx.effect(() => () => this.storageFiber.dispose(), 'dsh-computer-use: optional lease sidecar');
|
|
114
|
+
}
|
|
115
|
+
/** Wait for an already-composed storage-domain service to finish opening. */
|
|
116
|
+
async initialize() {
|
|
117
|
+
await this.prepareStorage();
|
|
118
|
+
}
|
|
119
|
+
/** Ensure one Agent may read or control one exact running application. */
|
|
120
|
+
async ensure(agent, app, scope, toolName, callId, signal) {
|
|
121
|
+
if (configuredAccess(this.config(), app.bundleId, scope))
|
|
122
|
+
return 'configured';
|
|
123
|
+
return await this.enqueueDecision(agent.session.id, async () => {
|
|
124
|
+
if (configuredAccess(this.config(), app.bundleId, scope))
|
|
125
|
+
return 'configured';
|
|
126
|
+
return await this.ensureInteractive(agent, app, scope, toolName, callId, signal);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/** Forget process-local control grants when their Agent is disposed. */
|
|
130
|
+
releaseAgent(agent) {
|
|
131
|
+
this.controlGrants.delete(agent);
|
|
132
|
+
}
|
|
133
|
+
async ensureInteractive(agent, app, scope, toolName, callId, signal) {
|
|
134
|
+
await this.prepareStorage();
|
|
135
|
+
const turn = currentTurn(agent.session.events);
|
|
136
|
+
if (turn === undefined) {
|
|
137
|
+
throw new ComputerUseError('COMPUTER_PERMISSION_REQUIRED', `${scope} access for ${app.name} must be requested inside an open Agent turn`);
|
|
138
|
+
}
|
|
139
|
+
if (scope === 'control' && this.controlGrants.get(agent)?.get(app.bundleId) === turn) {
|
|
140
|
+
return 'approved';
|
|
141
|
+
}
|
|
142
|
+
const stored = this.currentState(agent);
|
|
143
|
+
if (scope === 'read' && stored?.readGrants.includes(app.bundleId) === true) {
|
|
144
|
+
return 'approved';
|
|
145
|
+
}
|
|
146
|
+
if (stored?.denied.some(denial => denial.bundleId === app.bundleId && denial.scope === scope) === true) {
|
|
147
|
+
throw new ComputerUseError('COMPUTER_PERMISSION_REQUIRED', `${scope} access for ${app.name} was rejected earlier in this Session; do not retry without new user instructions`);
|
|
148
|
+
}
|
|
149
|
+
if (approvalPolicy(this.ctx, agent) === 'never') {
|
|
150
|
+
throw new ComputerUseError('COMPUTER_PERMISSION_REQUIRED', `${scope} access for ${app.name} is blocked because approval prompts are disabled in this Session (approval/policy: never, e.g. the danger-full-access preset); add "${app.bundleId}" to the computer-use grants in Settings, or switch the permission preset to one with approval ask`);
|
|
151
|
+
}
|
|
152
|
+
if (scope === 'read' && this.storage === undefined) {
|
|
153
|
+
throw this.storageRequired(app, scope, 'a Session-wide interactive read grant');
|
|
154
|
+
}
|
|
155
|
+
const outcome = await this.ctx.approval.request({
|
|
156
|
+
agent,
|
|
157
|
+
toolName,
|
|
158
|
+
...(callId === undefined ? {} : { callId }),
|
|
159
|
+
reason: scope === 'read'
|
|
160
|
+
? `Allow this Agent to inspect the Accessibility state and requested screenshot of ${app.name} (${app.bundleId}) for this Session.`
|
|
161
|
+
: `Allow this Agent to send UI input to ${app.name} (${app.bundleId}) for the current turn.`,
|
|
162
|
+
signal,
|
|
163
|
+
});
|
|
164
|
+
if (outcome === 'cancelled') {
|
|
165
|
+
throw new ComputerUseError('COMPUTER_CANCELLED', `${scope} access request for ${app.name} was cancelled`);
|
|
166
|
+
}
|
|
167
|
+
if (outcome === 'rejected') {
|
|
168
|
+
if (this.storage === undefined) {
|
|
169
|
+
throw this.storageRequired(app, scope, 'the rejected interactive decision');
|
|
170
|
+
}
|
|
171
|
+
await this.persist(agent, app, { kind: 'denied', scope });
|
|
172
|
+
throw new ComputerUseError('COMPUTER_PERMISSION_REQUIRED', `${scope} access for ${app.name} was not granted (rejected); do not retry in this Session without new user instructions`);
|
|
173
|
+
}
|
|
174
|
+
if (outcome !== 'allowed-once') {
|
|
175
|
+
throw new ComputerUseError('COMPUTER_PERMISSION_REQUIRED', `${scope} access for ${app.name} was not granted (${outcome})`);
|
|
176
|
+
}
|
|
177
|
+
if (scope === 'control') {
|
|
178
|
+
let grants = this.controlGrants.get(agent);
|
|
179
|
+
if (grants === undefined) {
|
|
180
|
+
grants = new Map();
|
|
181
|
+
this.controlGrants.set(agent, grants);
|
|
182
|
+
}
|
|
183
|
+
grants.set(app.bundleId, turn);
|
|
184
|
+
return 'approved';
|
|
185
|
+
}
|
|
186
|
+
await this.persist(agent, app, { kind: 'read-granted' });
|
|
187
|
+
return 'approved';
|
|
188
|
+
}
|
|
189
|
+
currentState(agent) {
|
|
190
|
+
const row = this.storage?.table.get(agent.session.id);
|
|
191
|
+
return row !== undefined && sameIdentity(row, agent.session.header) ? row : undefined;
|
|
192
|
+
}
|
|
193
|
+
async prepareStorage() {
|
|
194
|
+
if (this.storage !== undefined)
|
|
195
|
+
return this.storage;
|
|
196
|
+
if (this.ctx.get('storageDomain') === undefined)
|
|
197
|
+
return undefined;
|
|
198
|
+
await this.storageFiber;
|
|
199
|
+
return this.storage;
|
|
200
|
+
}
|
|
201
|
+
async persist(agent, app, decision) {
|
|
202
|
+
const purpose = decision.kind === 'read-granted'
|
|
203
|
+
? 'the Session-wide read grant'
|
|
204
|
+
: `the Session-wide ${decision.scope} denial`;
|
|
205
|
+
try {
|
|
206
|
+
const participated = await this.ctx.sessions.flush(agent.session);
|
|
207
|
+
if (!participated) {
|
|
208
|
+
throw new Error('no Session persistence listener participated in ctx.sessions.flush');
|
|
209
|
+
}
|
|
210
|
+
await this.enqueueMutation(agent.session.id, async () => {
|
|
211
|
+
const binding = this.storage;
|
|
212
|
+
if (binding === undefined)
|
|
213
|
+
throw this.storageRequired(app, decision.kind === 'read-granted' ? 'read' : decision.scope, purpose);
|
|
214
|
+
const current = binding.table.get(agent.session.id);
|
|
215
|
+
const row = current !== undefined && sameIdentity(current, agent.session.header)
|
|
216
|
+
? current
|
|
217
|
+
: stateSnapshot(agent.session.header, [], []);
|
|
218
|
+
const readGrants = new Set(row.readGrants);
|
|
219
|
+
const denied = [...row.denied];
|
|
220
|
+
if (decision.kind === 'read-granted') {
|
|
221
|
+
readGrants.add(app.bundleId);
|
|
222
|
+
}
|
|
223
|
+
else if (!denied.some(item => item.bundleId === app.bundleId && item.scope === decision.scope)) {
|
|
224
|
+
denied.push({ bundleId: app.bundleId, scope: decision.scope });
|
|
225
|
+
}
|
|
226
|
+
await binding.table.put(agent.session.id, stateSnapshot(agent.session.header, readGrants, denied));
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
if (error instanceof ComputerUseError)
|
|
231
|
+
throw error;
|
|
232
|
+
throw new ComputerUseError('COMPUTER_PERMISSION_REQUIRED', `${purpose} for ${app.name} could not be persisted after the approval audit: ${boundedFailure(error)}; configure working Session persistence and @deepseek-ai/dsh-storage-domain before retrying`, { cause: error });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
storageRequired(app, scope, purpose) {
|
|
236
|
+
return new ComputerUseError('COMPUTER_PERMISSION_REQUIRED', `${scope} access for ${app.name} requires ctx.storageDomain to persist ${purpose}; compose @deepseek-ai/dsh-storage-domain or add an exact static grant for "${app.bundleId}" before retrying`);
|
|
237
|
+
}
|
|
238
|
+
enqueueDecision(sessionId, operation) {
|
|
239
|
+
const previous = this.decisionTails.get(sessionId) ?? Promise.resolve();
|
|
240
|
+
const result = previous.then(operation);
|
|
241
|
+
const tail = result.then(() => undefined, () => undefined);
|
|
242
|
+
this.decisionTails.set(sessionId, tail);
|
|
243
|
+
return result.finally(() => {
|
|
244
|
+
if (this.decisionTails.get(sessionId) === tail)
|
|
245
|
+
this.decisionTails.delete(sessionId);
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
enqueueMutation(sessionId, operation) {
|
|
249
|
+
const previous = this.mutationTails.get(sessionId) ?? Promise.resolve();
|
|
250
|
+
const result = previous.then(operation);
|
|
251
|
+
const tail = result.then(() => undefined, () => undefined);
|
|
252
|
+
this.mutationTails.set(sessionId, tail);
|
|
253
|
+
return result.finally(() => {
|
|
254
|
+
if (this.mutationTails.get(sessionId) === tail)
|
|
255
|
+
this.mutationTails.delete(sessionId);
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=leases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leases.js","sourceRoot":"","sources":["../src/leases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/** macOS Accessibility/CoreGraphics/ScreenCaptureKit provider for `ctx.computerUse`. */
|
|
2
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
3
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
4
|
+
import { Config, COMPUTER_USE_SETTINGS_NAMESPACE, resolveConfig, } from "../config.js";
|
|
5
|
+
import { ComputerUseError } from "../errors.js";
|
|
6
|
+
import { ComputerUseService } from "../service.js";
|
|
7
|
+
import { NativeHelperClient } from "./native-helper.js";
|
|
8
|
+
/** Fixed-command native backend. */
|
|
9
|
+
class MacOSBackend {
|
|
10
|
+
config;
|
|
11
|
+
name = 'macos-ax';
|
|
12
|
+
client;
|
|
13
|
+
constructor(ctx, config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.client = new NativeHelperClient(ctx, config);
|
|
16
|
+
}
|
|
17
|
+
get helperPath() {
|
|
18
|
+
return this.client.helperPath;
|
|
19
|
+
}
|
|
20
|
+
async resolveApp(selector, signal) {
|
|
21
|
+
return await this.client.invoke({ command: 'resolve-app', selector }, signal);
|
|
22
|
+
}
|
|
23
|
+
async listApps(signal) {
|
|
24
|
+
return await this.client.invoke({ command: 'list-apps' }, signal);
|
|
25
|
+
}
|
|
26
|
+
async observe(app, options, signal) {
|
|
27
|
+
return await this.client.invoke({
|
|
28
|
+
command: 'observe',
|
|
29
|
+
app,
|
|
30
|
+
options,
|
|
31
|
+
}, signal);
|
|
32
|
+
}
|
|
33
|
+
async act(request, signal) {
|
|
34
|
+
return await this.client.invoke({
|
|
35
|
+
command: 'act',
|
|
36
|
+
request: {
|
|
37
|
+
...request,
|
|
38
|
+
actionTimeoutMs: this.config.actionTimeoutMs,
|
|
39
|
+
limits: {
|
|
40
|
+
maxNodes: this.config.maxNodes,
|
|
41
|
+
maxDepth: this.config.maxDepth,
|
|
42
|
+
maxTextBytes: this.config.maxTextBytes,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
}, signal);
|
|
46
|
+
}
|
|
47
|
+
async visualizeCursor(action, phase, signal) {
|
|
48
|
+
if (this.config.interaction.cursorVisualization !== 'visible')
|
|
49
|
+
return;
|
|
50
|
+
const autoHideMs = this.config.interaction.cursorAutoHideMs;
|
|
51
|
+
const move = async (point, durationMs) => {
|
|
52
|
+
await this.client.cursorCommand({
|
|
53
|
+
op: 'move',
|
|
54
|
+
x: point.x,
|
|
55
|
+
y: point.y,
|
|
56
|
+
durationMs,
|
|
57
|
+
autoHideMs,
|
|
58
|
+
targetPid: action.targetPid,
|
|
59
|
+
targetWindowNumber: action.targetWindowNumber,
|
|
60
|
+
targetWindowFrame: action.targetWindowFrame,
|
|
61
|
+
}, signal);
|
|
62
|
+
};
|
|
63
|
+
if (phase === 'after') {
|
|
64
|
+
if (action.kind === 'drag')
|
|
65
|
+
await this.client.cursorCommand({
|
|
66
|
+
op: 'release',
|
|
67
|
+
autoHideMs,
|
|
68
|
+
targetPid: action.targetPid,
|
|
69
|
+
targetWindowNumber: action.targetWindowNumber,
|
|
70
|
+
targetWindowFrame: action.targetWindowFrame,
|
|
71
|
+
}, signal);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const start = action.kind === 'drag' ? action.from : action.to;
|
|
75
|
+
if (start === undefined)
|
|
76
|
+
return;
|
|
77
|
+
await move(start, this.config.interaction.cursorMotionMs);
|
|
78
|
+
if (this.config.interaction.cursorMotionMs > 0) {
|
|
79
|
+
await delay(this.config.interaction.cursorMotionMs, undefined, { signal });
|
|
80
|
+
}
|
|
81
|
+
if (action.kind === 'scroll')
|
|
82
|
+
return;
|
|
83
|
+
await this.client.cursorCommand({
|
|
84
|
+
op: 'press',
|
|
85
|
+
autoHideMs,
|
|
86
|
+
targetPid: action.targetPid,
|
|
87
|
+
targetWindowNumber: action.targetWindowNumber,
|
|
88
|
+
targetWindowFrame: action.targetWindowFrame,
|
|
89
|
+
sustainedPress: action.kind === 'drag',
|
|
90
|
+
}, signal);
|
|
91
|
+
if (action.kind === 'drag') {
|
|
92
|
+
await move(action.to, Math.max(this.config.interaction.cursorMotionMs, 240));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async dispose() {
|
|
96
|
+
await this.client.dispose();
|
|
97
|
+
}
|
|
98
|
+
async health(signal) {
|
|
99
|
+
const prepared = await this.client.prepare(signal);
|
|
100
|
+
const health = await this.client.invoke({ command: 'health' }, signal);
|
|
101
|
+
return {
|
|
102
|
+
helperVersion: health.helperVersion || prepared.version,
|
|
103
|
+
helperSha256: prepared.sha256,
|
|
104
|
+
accessibility: health.accessibility,
|
|
105
|
+
screenRecording: health.screenRecording,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async openSettings(kind, signal) {
|
|
109
|
+
await this.client.invoke({ command: 'open-settings', kind }, signal);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Cordis Service provider loaded by the Bundle before the model-facing consumer. */
|
|
113
|
+
export class MacOSComputerUseProvider extends ComputerUseService {
|
|
114
|
+
static inject = ['subprocess', 'approval', 'settings', 'sessions', 'agents'];
|
|
115
|
+
static Config = Config;
|
|
116
|
+
settings;
|
|
117
|
+
constructor(ctx, config = {}) {
|
|
118
|
+
if (process.platform !== 'darwin') {
|
|
119
|
+
throw new ComputerUseError('COMPUTER_UNSUPPORTED_PLATFORM', `dsh-computer-use 0.1.0 supports macOS only; current platform is ${process.platform}`);
|
|
120
|
+
}
|
|
121
|
+
const settings = ctx.settings.register(COMPUTER_USE_SETTINGS_NAMESPACE, Config, {
|
|
122
|
+
base: config,
|
|
123
|
+
applies: 'live',
|
|
124
|
+
validate: (value) => { resolveConfig(value); },
|
|
125
|
+
});
|
|
126
|
+
const resolved = resolveConfig(settings.get());
|
|
127
|
+
super(ctx, new MacOSBackend(ctx, resolved), resolved);
|
|
128
|
+
this.settings = settings;
|
|
129
|
+
ctx.effect(() => this.settings.watch(async (next) => {
|
|
130
|
+
const candidate = resolveConfig(next);
|
|
131
|
+
const backend = new MacOSBackend(ctx, candidate);
|
|
132
|
+
try {
|
|
133
|
+
await this.reconfigure(backend, candidate);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
await backend.dispose();
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}), 'dsh-computer-use: Settings watch');
|
|
140
|
+
ctx.effect(() => ctx.on('agent/disposed', ({ agent }) => { this.releaseAgent(agent); }), 'dsh-computer-use: Agent cleanup');
|
|
141
|
+
}
|
|
142
|
+
/** Verify helper integrity and permissions before the service is injectable. */
|
|
143
|
+
async [Service.init]() {
|
|
144
|
+
await this.initialize();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export default MacOSComputerUseProvider;
|
|
148
|
+
//# sourceMappingURL=macos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos.js","sourceRoot":"","sources":["../../src/providers/macos.ts"],"names":[],"mappings":"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"}
|