@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
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/** One-use just-in-time confirmation tokens for sensitive Computer Use actions. */
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { approvalPolicy } from "./approval-policy.js";
|
|
4
|
+
import { ComputerUseError } from "./errors.js";
|
|
5
|
+
import { ComputerConfirmationToken, } from "./types.js";
|
|
6
|
+
function stable(value) {
|
|
7
|
+
if (value === null || typeof value !== 'object')
|
|
8
|
+
return JSON.stringify(value);
|
|
9
|
+
if (Array.isArray(value))
|
|
10
|
+
return `[${value.map(stable).join(',')}]`;
|
|
11
|
+
const record = value;
|
|
12
|
+
return `{${Object.keys(record).sort().filter(key => record[key] !== undefined).map(key => `${JSON.stringify(key)}:${stable(record[key])}`).join(',')}}`;
|
|
13
|
+
}
|
|
14
|
+
function actionHash(action) {
|
|
15
|
+
const { confirmationToken: _token, ...rest } = action;
|
|
16
|
+
return createHash('sha256').update(stable(rest)).digest('hex');
|
|
17
|
+
}
|
|
18
|
+
/** Issues, validates, consumes, and releases scoped sensitive-action tokens. */
|
|
19
|
+
export class ComputerConfirmationManager {
|
|
20
|
+
ctx;
|
|
21
|
+
config;
|
|
22
|
+
records = new Map();
|
|
23
|
+
constructor(ctx, config) {
|
|
24
|
+
this.ctx = ctx;
|
|
25
|
+
this.config = config;
|
|
26
|
+
}
|
|
27
|
+
/** Request user approval and mint one token bound to the exact action. */
|
|
28
|
+
async confirm(agent, app, request, callId, signal) {
|
|
29
|
+
if (approvalPolicy(this.ctx, agent) === 'never') {
|
|
30
|
+
throw new ComputerUseError('COMPUTER_CONFIRMATION_REQUIRED', 'sensitive action confirmation is blocked because approval prompts are disabled in this Session (approval/policy: never); do not execute the action, and ask the user to switch the permission preset to one with approval ask or run it manually');
|
|
31
|
+
}
|
|
32
|
+
const outcome = await this.ctx.approval.request({
|
|
33
|
+
agent,
|
|
34
|
+
toolName: 'computer_confirm',
|
|
35
|
+
...(callId === undefined ? {} : { callId }),
|
|
36
|
+
reason: `${request.reason} Target: ${request.target}.${request.dataSummary === undefined ? '' : ` Data: ${request.dataSummary}.`}`,
|
|
37
|
+
signal,
|
|
38
|
+
});
|
|
39
|
+
if (outcome === 'cancelled')
|
|
40
|
+
throw new ComputerUseError('COMPUTER_CANCELLED', 'sensitive action confirmation was cancelled');
|
|
41
|
+
if (outcome !== 'allowed-once') {
|
|
42
|
+
throw new ComputerUseError('COMPUTER_CONFIRMATION_REQUIRED', `sensitive action was not confirmed (${outcome})`);
|
|
43
|
+
}
|
|
44
|
+
const token = ComputerConfirmationToken(randomUUID());
|
|
45
|
+
const expiresAt = Date.now() + this.config().confirmationTtlMs;
|
|
46
|
+
let agentRecords = this.records.get(agent);
|
|
47
|
+
if (agentRecords === undefined) {
|
|
48
|
+
agentRecords = new Map();
|
|
49
|
+
this.records.set(agent, agentRecords);
|
|
50
|
+
}
|
|
51
|
+
agentRecords.set(token, {
|
|
52
|
+
app,
|
|
53
|
+
observationId: request.action.observationId,
|
|
54
|
+
actionHash: actionHash(request.action),
|
|
55
|
+
expiresAt,
|
|
56
|
+
});
|
|
57
|
+
return { token, observationId: request.action.observationId, app, expiresAt: new Date(expiresAt).toISOString() };
|
|
58
|
+
}
|
|
59
|
+
/** Require and consume the one matching token when an action is marked sensitive. */
|
|
60
|
+
consume(agent, app, action) {
|
|
61
|
+
if (action.sensitive !== true) {
|
|
62
|
+
if (action.confirmationToken !== undefined) {
|
|
63
|
+
throw new ComputerUseError('COMPUTER_CONFIRMATION_REQUIRED', 'confirmationToken is valid only when sensitive is true');
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const token = action.confirmationToken;
|
|
68
|
+
if (token === undefined) {
|
|
69
|
+
throw new ComputerUseError('COMPUTER_CONFIRMATION_REQUIRED', 'sensitive action requires a token from computer_confirm');
|
|
70
|
+
}
|
|
71
|
+
const agentRecords = this.records.get(agent);
|
|
72
|
+
const record = agentRecords?.get(token);
|
|
73
|
+
if (record === undefined) {
|
|
74
|
+
throw new ComputerUseError('COMPUTER_CONFIRMATION_REQUIRED', 'confirmation token is unknown, expired, or already consumed');
|
|
75
|
+
}
|
|
76
|
+
agentRecords?.delete(token);
|
|
77
|
+
if (record.expiresAt < Date.now()) {
|
|
78
|
+
throw new ComputerUseError('COMPUTER_CONFIRMATION_REQUIRED', 'confirmation token expired');
|
|
79
|
+
}
|
|
80
|
+
if (record.app.bundleId !== app.bundleId || record.app.pid !== app.pid
|
|
81
|
+
|| record.observationId !== action.observationId || record.actionHash !== actionHash(action)) {
|
|
82
|
+
throw new ComputerUseError('COMPUTER_CONFIRMATION_REQUIRED', 'confirmation token does not match this app, observation, or action');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Invalidate one pending token after target identity changes before input. */
|
|
86
|
+
invalidate(agent, token) {
|
|
87
|
+
if (token !== undefined)
|
|
88
|
+
this.records.get(agent)?.delete(token);
|
|
89
|
+
}
|
|
90
|
+
/** Release every pending token owned by one Agent. */
|
|
91
|
+
releaseAgent(agent) {
|
|
92
|
+
this.records.delete(agent);
|
|
93
|
+
}
|
|
94
|
+
/** Release all pending tokens on provider teardown or generation replacement. */
|
|
95
|
+
clear() {
|
|
96
|
+
this.records.clear();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=confirmations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmations.js","sourceRoot":"","sources":["../src/confirmations.ts"],"names":[],"mappings":"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"}
|
package/lib/diff.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** Accessibility-tree diff projection for model-context efficiency. */
|
|
2
|
+
function identity(element) {
|
|
3
|
+
const frame = element.frame === undefined
|
|
4
|
+
? ''
|
|
5
|
+
: `${Math.round(element.frame.x)},${Math.round(element.frame.y)},${Math.round(element.frame.width)},${Math.round(element.frame.height)}`;
|
|
6
|
+
return [element.role, element.subrole ?? '', element.title ?? '', element.label ?? '', frame].join('|');
|
|
7
|
+
}
|
|
8
|
+
function summary(element, includeIndex) {
|
|
9
|
+
const parts = [includeIndex ? `[${element.index}]` : undefined, element.role];
|
|
10
|
+
if (element.title !== undefined)
|
|
11
|
+
parts.push(JSON.stringify(element.title));
|
|
12
|
+
else if (element.label !== undefined)
|
|
13
|
+
parts.push(JSON.stringify(element.label));
|
|
14
|
+
if (element.value !== undefined)
|
|
15
|
+
parts.push(`value=${JSON.stringify(element.value)}`);
|
|
16
|
+
if (element.enabled === false)
|
|
17
|
+
parts.push('disabled');
|
|
18
|
+
if (element.focused === true)
|
|
19
|
+
parts.push('focused');
|
|
20
|
+
if (element.selected === true)
|
|
21
|
+
parts.push('selected');
|
|
22
|
+
return parts.filter((part) => part !== undefined).join(' ');
|
|
23
|
+
}
|
|
24
|
+
function state(element) {
|
|
25
|
+
return JSON.stringify({
|
|
26
|
+
value: element.value,
|
|
27
|
+
enabled: element.enabled,
|
|
28
|
+
focused: element.focused,
|
|
29
|
+
selected: element.selected,
|
|
30
|
+
actions: element.actions,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/** Return a bounded full-to-full element diff whose current rows use current indexes. */
|
|
34
|
+
export function diffElements(previous, current, maxBytes) {
|
|
35
|
+
const before = new Map(previous.map(element => [identity(element), element]));
|
|
36
|
+
const after = new Map(current.map(element => [identity(element), element]));
|
|
37
|
+
const lines = [];
|
|
38
|
+
for (const [key, element] of before) {
|
|
39
|
+
if (!after.has(key))
|
|
40
|
+
lines.push(`- ${summary(element, false)}`);
|
|
41
|
+
}
|
|
42
|
+
for (const [key, element] of after) {
|
|
43
|
+
const old = before.get(key);
|
|
44
|
+
if (old === undefined)
|
|
45
|
+
lines.push(`+ ${summary(element, true)}`);
|
|
46
|
+
else if (state(old) !== state(element))
|
|
47
|
+
lines.push(`~ ${summary(element, true)}`);
|
|
48
|
+
}
|
|
49
|
+
if (lines.length === 0)
|
|
50
|
+
return '(no accessibility changes)';
|
|
51
|
+
const text = lines.join('\n');
|
|
52
|
+
const bytes = Buffer.byteLength(text);
|
|
53
|
+
if (bytes <= maxBytes)
|
|
54
|
+
return text;
|
|
55
|
+
const suffix = '\n… diff truncated';
|
|
56
|
+
return `${Buffer.from(text).subarray(0, Math.max(0, maxBytes - Buffer.byteLength(suffix))).toString('utf8')}${suffix}`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=diff.js.map
|
package/lib/diff.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|
package/lib/errors.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Error with a stable model-visible code and bounded public details. */
|
|
2
|
+
export class ComputerUseError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
/**
|
|
5
|
+
* @param code - Stable failure category.
|
|
6
|
+
* @param message - Bounded correction-oriented description without UI secrets.
|
|
7
|
+
* @param options - Optional original cause retained outside the model-facing message.
|
|
8
|
+
*/
|
|
9
|
+
constructor(code, message, options) {
|
|
10
|
+
super(`${code}: ${message}`, options);
|
|
11
|
+
this.name = 'ComputerUseError';
|
|
12
|
+
this.code = code;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Convert an unknown failure into the provider-failure category without leaking unbounded native text. */
|
|
16
|
+
export function computerUseError(error, fallback) {
|
|
17
|
+
if (error instanceof ComputerUseError)
|
|
18
|
+
return error;
|
|
19
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
20
|
+
return new ComputerUseError('COMPUTER_PROVIDER_FAILURE', `${fallback}: ${message.slice(0, 1000)}`, { cause: error });
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAiBA,yEAAyE;AACzE,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAsB;IAEnC;;;;OAIG;IACH,YAAY,IAA0B,EAAE,OAAe,EAAE,OAAsB;QAC7E,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED,2GAA2G;AAC3G,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,QAAgB;IAC/D,IAAI,KAAK,YAAY,gBAAgB;QAAE,OAAO,KAAK,CAAA;IACnD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO,IAAI,gBAAgB,CAAC,2BAA2B,EAAE,GAAG,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;AACtH,CAAC"}
|
package/lib/exposure.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/** Agent-scoped progressive exposure for Computer Use execution Tools. */
|
|
2
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
3
|
+
import { COMPUTER_USE_SKILL_CONTENT, COMPUTER_USE_SKILL_NAME } from "./skill.js";
|
|
4
|
+
/** One global bootstrap retained until the current Agent loads the Skill. */
|
|
5
|
+
export const COMPUTER_USE_ACTIVATE = 'computer_use_activate';
|
|
6
|
+
const VISION_TOOL_NAMES = [
|
|
7
|
+
'vision_glance',
|
|
8
|
+
'vision_ground',
|
|
9
|
+
'vision_detect',
|
|
10
|
+
'vision_crop',
|
|
11
|
+
'vision_long_screenshot_ocr',
|
|
12
|
+
'vision_toolkit_activate',
|
|
13
|
+
];
|
|
14
|
+
const COMMAND_PREFIX = /^(?:(?:[A-Za-z_][A-Za-z0-9_]*=\S+)\s+)*(?:(?:\S*\/)?(?:sudo|env|nohup|time|command|exec)\s+(?:(?:-\S+|[A-Za-z_][A-Za-z0-9_]*=\S+)\s+)*)?/iu;
|
|
15
|
+
const OCR_COMMAND_PROBE = /^(?:which|type|command\s+-v)\b[^\n;&|]*\b(?:tesseract|screencapture)\b/iu;
|
|
16
|
+
const OCR_EXECUTABLE = /^(?:\S*\/)?(?:tesseract|screencapture)(?:\s|$)/iu;
|
|
17
|
+
const OCR_STACK_SETUP = /^(?:(?:\S*\/)?(?:brew|port|apt(?:-get)?|dnf|yum|pacman)\b[^\n]*(?:install|add)\b[^\n]*\btesseract(?:-ocr)?\b|(?:\S*\/)?(?:pip(?:3(?:\.\d+)*)?|uv\s+pip|poetry\s+add|pdm\s+add)\b[^\n]*(?:install|add)?[^\n]*\b(?:pytesseract|easyocr|ocrmypdf)\b)/iu;
|
|
18
|
+
const SCRIPTED_OCR_EXECUTABLE = /^(?:\S*\/)?(?:python(?:3(?:\.\d+)*)?|swift)(?:\s|$)/iu;
|
|
19
|
+
const SCRIPTED_OCR_MARKER = /(?:\bpytesseract\b|\beasyocr\b|\bocrmypdf\b|VNRecognizeTextRequest|\bimport\s+Vision\b)/iu;
|
|
20
|
+
const SHELL_META = /(?:&&|\|\||[;|\n])/u;
|
|
21
|
+
function renderJson(_args, value) {
|
|
22
|
+
return [{ type: 'text', text: JSON.stringify(value, null, 2) }];
|
|
23
|
+
}
|
|
24
|
+
function isRecord(value) {
|
|
25
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
26
|
+
}
|
|
27
|
+
function adHocOcrCommand(value) {
|
|
28
|
+
if (!isRecord(value) || typeof value.command !== 'string')
|
|
29
|
+
return false;
|
|
30
|
+
const commands = value.command.split(SHELL_META)
|
|
31
|
+
.map(command => command.trimStart().replace(COMMAND_PREFIX, ''));
|
|
32
|
+
if (commands.some(command => OCR_COMMAND_PROBE.test(command)
|
|
33
|
+
|| OCR_EXECUTABLE.test(command)
|
|
34
|
+
|| OCR_STACK_SETUP.test(command)))
|
|
35
|
+
return true;
|
|
36
|
+
return SCRIPTED_OCR_MARKER.test(value.command)
|
|
37
|
+
&& commands.some(command => SCRIPTED_OCR_EXECUTABLE.test(command));
|
|
38
|
+
}
|
|
39
|
+
function isSkillArguments(value) {
|
|
40
|
+
return isRecord(value) && value.name === COMPUTER_USE_SKILL_NAME;
|
|
41
|
+
}
|
|
42
|
+
function nativeSkillCall(raw) {
|
|
43
|
+
try {
|
|
44
|
+
return isSkillArguments(JSON.parse(raw));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function containsSkillContent(blocks) {
|
|
51
|
+
return blocks.some(block => isRecord(block)
|
|
52
|
+
&& block.type === 'text'
|
|
53
|
+
&& typeof block.text === 'string'
|
|
54
|
+
&& block.text.includes(COMPUTER_USE_SKILL_CONTENT));
|
|
55
|
+
}
|
|
56
|
+
function isSkillResult(value) {
|
|
57
|
+
return isRecord(value)
|
|
58
|
+
&& value.name === COMPUTER_USE_SKILL_NAME
|
|
59
|
+
&& value.content === COMPUTER_USE_SKILL_CONTENT;
|
|
60
|
+
}
|
|
61
|
+
/** Whether durable Session history proves that the bundled Skill was loaded. */
|
|
62
|
+
export function hasLoadedComputerUseSkill(session) {
|
|
63
|
+
const nativeCalls = new Set();
|
|
64
|
+
for (const event of session.events) {
|
|
65
|
+
if (event.type === 'user/message') {
|
|
66
|
+
const source = event.data.source;
|
|
67
|
+
if (source.kind === 'skill-invocation'
|
|
68
|
+
&& source.name === COMPUTER_USE_SKILL_NAME
|
|
69
|
+
&& containsSkillContent(event.data.content))
|
|
70
|
+
return true;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (event.type === 'tool/call') {
|
|
74
|
+
if (event.data.name === 'skill' && nativeSkillCall(event.data.arguments))
|
|
75
|
+
nativeCalls.add(String(event.data.callId));
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (event.type === 'tool/result') {
|
|
79
|
+
const [block] = event.data.message.content;
|
|
80
|
+
if (block?.type === 'tool-result'
|
|
81
|
+
&& block.isError !== true
|
|
82
|
+
&& nativeCalls.has(String(block.toolCallId))
|
|
83
|
+
&& containsSkillContent(block.content))
|
|
84
|
+
return true;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (event.type === 'tool/code-dispatch'
|
|
88
|
+
&& event.data.name === 'skill'
|
|
89
|
+
&& event.data.isError === false
|
|
90
|
+
&& isSkillArguments(event.data.arguments)
|
|
91
|
+
&& containsSkillContent(event.data.content))
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
/** Owns one progressive Tool-exposure generation. */
|
|
97
|
+
export class ComputerUseExposure {
|
|
98
|
+
ctx;
|
|
99
|
+
createTools;
|
|
100
|
+
activationTool;
|
|
101
|
+
states = new Map();
|
|
102
|
+
installed = false;
|
|
103
|
+
constructor(ctx, createTools) {
|
|
104
|
+
this.ctx = ctx;
|
|
105
|
+
this.createTools = createTools;
|
|
106
|
+
this.activationTool = defineTool({
|
|
107
|
+
name: COMPUTER_USE_ACTIVATE,
|
|
108
|
+
description: `Activate the macOS Computer Use execution tools for this Agent after loading the ${COMPUTER_USE_SKILL_NAME} Skill. The Skill tool normally activates them automatically; call this only after a direct Skill invocation when the tools are still absent. This bootstrap disappears after success.`,
|
|
109
|
+
parameters: {},
|
|
110
|
+
output: {
|
|
111
|
+
schema: {
|
|
112
|
+
type: 'object',
|
|
113
|
+
additionalProperties: false,
|
|
114
|
+
properties: {
|
|
115
|
+
activated: { type: 'boolean', required: true },
|
|
116
|
+
tools: { type: 'array', items: { type: 'string' }, required: true },
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
render: renderJson,
|
|
120
|
+
},
|
|
121
|
+
execute: (_args, exec) => {
|
|
122
|
+
if (exec.agent === undefined)
|
|
123
|
+
throw new Error(`${COMPUTER_USE_ACTIVATE}: an Agent Session is required`);
|
|
124
|
+
if (!hasLoadedComputerUseSkill(exec.agent.session)) {
|
|
125
|
+
throw new Error(`${COMPUTER_USE_ACTIVATE}: load the ${COMPUTER_USE_SKILL_NAME} Skill first`);
|
|
126
|
+
}
|
|
127
|
+
return Promise.resolve(this.activate(exec.agent));
|
|
128
|
+
},
|
|
129
|
+
presentCall: () => ({ card: 'generic', title: 'Activate Computer Use', kind: 'execute' }),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/** Install lifecycle listeners and adopt existing Agents. */
|
|
133
|
+
install() {
|
|
134
|
+
if (this.installed)
|
|
135
|
+
throw new Error('dsh-computer-use: progressive exposure is already installed');
|
|
136
|
+
this.installed = true;
|
|
137
|
+
const effects = [
|
|
138
|
+
this.ctx.on('agent/created', ({ agent }) => { this.attach(agent); }),
|
|
139
|
+
this.ctx.on('agent/disposed', ({ agent }) => { this.detach(agent); }),
|
|
140
|
+
this.ctx.tools.guard((exec) => {
|
|
141
|
+
if (exec.name !== 'bash'
|
|
142
|
+
|| exec.agent === undefined
|
|
143
|
+
|| !hasLoadedComputerUseSkill(exec.agent.session)
|
|
144
|
+
|| !adHocOcrCommand(exec.arguments)
|
|
145
|
+
|| !VISION_TOOL_NAMES.some(name => this.ctx.tools.get(name, exec.agent) !== undefined))
|
|
146
|
+
return undefined;
|
|
147
|
+
return 'Computer Use screenshot analysis must use the installed Vision Toolkit instead of a shell-built OCR stack. If vision_glance is absent, call the skill tool with {"name":"vision-tools"}; then pass the existing screenshot Artifact path to vision_glance, vision_ground, vision_detect, vision_crop, or vision_long_screenshot_ocr.';
|
|
148
|
+
}),
|
|
149
|
+
this.ctx.on('tools/result', (exec, result) => {
|
|
150
|
+
if (result.isError === false
|
|
151
|
+
&& exec.name === 'skill'
|
|
152
|
+
&& exec.agent !== undefined
|
|
153
|
+
&& isSkillArguments(exec.arguments)
|
|
154
|
+
&& isSkillResult(result.value))
|
|
155
|
+
this.activate(exec.agent);
|
|
156
|
+
return undefined;
|
|
157
|
+
}),
|
|
158
|
+
];
|
|
159
|
+
try {
|
|
160
|
+
for (const agent of this.ctx.agents.list())
|
|
161
|
+
this.attach(agent);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
for (const dispose of effects.reverse())
|
|
165
|
+
dispose();
|
|
166
|
+
this.disposeStates();
|
|
167
|
+
this.installed = false;
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
return () => {
|
|
171
|
+
if (!this.installed)
|
|
172
|
+
return;
|
|
173
|
+
this.installed = false;
|
|
174
|
+
for (const dispose of effects.reverse())
|
|
175
|
+
dispose();
|
|
176
|
+
this.disposeStates();
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
attach(agent) {
|
|
180
|
+
if (this.states.has(agent))
|
|
181
|
+
return;
|
|
182
|
+
this.states.set(agent, { active: false, toolDisposers: [], toolNames: [] });
|
|
183
|
+
if (hasLoadedComputerUseSkill(agent.session))
|
|
184
|
+
this.activate(agent);
|
|
185
|
+
}
|
|
186
|
+
activate(agent) {
|
|
187
|
+
this.attach(agent);
|
|
188
|
+
const state = this.states.get(agent);
|
|
189
|
+
if (state === undefined)
|
|
190
|
+
throw new Error(`dsh-computer-use: Agent ${String(agent.id)} has no exposure state`);
|
|
191
|
+
if (state.active)
|
|
192
|
+
return { activated: false, tools: [...state.toolNames] };
|
|
193
|
+
const definitions = this.createTools();
|
|
194
|
+
const toolDisposers = [];
|
|
195
|
+
let hideActivation;
|
|
196
|
+
try {
|
|
197
|
+
for (const definition of definitions)
|
|
198
|
+
toolDisposers.push(agent.ctx.tools.register(definition));
|
|
199
|
+
hideActivation = agent.ctx.tools.restrict({ deny: [COMPUTER_USE_ACTIVATE] });
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
hideActivation?.();
|
|
203
|
+
for (const dispose of toolDisposers.reverse())
|
|
204
|
+
dispose();
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
state.active = true;
|
|
208
|
+
state.hideActivation = hideActivation;
|
|
209
|
+
state.toolDisposers = toolDisposers;
|
|
210
|
+
state.toolNames = definitions.map(definition => definition.name);
|
|
211
|
+
return { activated: true, tools: [...state.toolNames] };
|
|
212
|
+
}
|
|
213
|
+
detach(agent) {
|
|
214
|
+
const state = this.states.get(agent);
|
|
215
|
+
if (state === undefined)
|
|
216
|
+
return;
|
|
217
|
+
this.states.delete(agent);
|
|
218
|
+
this.disposeState(state);
|
|
219
|
+
}
|
|
220
|
+
disposeStates() {
|
|
221
|
+
for (const state of this.states.values())
|
|
222
|
+
this.disposeState(state);
|
|
223
|
+
this.states.clear();
|
|
224
|
+
}
|
|
225
|
+
disposeState(state) {
|
|
226
|
+
state.hideActivation?.();
|
|
227
|
+
for (const dispose of state.toolDisposers.reverse())
|
|
228
|
+
dispose();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=exposure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exposure.js","sourceRoot":"","sources":["../src/exposure.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** DSH Computer Use model-facing consumer and progressive Skill bundle. */
|
|
2
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
3
|
+
import { Config } from "./config.js";
|
|
4
|
+
import { ComputerUseExposure } from "./exposure.js";
|
|
5
|
+
import { MacOSComputerUseProvider } from "./providers/macos.js";
|
|
6
|
+
import { COMPUTER_USE_SKILL } from "./skill.js";
|
|
7
|
+
import { createComputerUseTools } from "./tools.js";
|
|
8
|
+
import { installComputerUseWeb } from "./web.js";
|
|
9
|
+
export { Config } from "./config.js";
|
|
10
|
+
export * from "./errors.js";
|
|
11
|
+
export * from "./service.js";
|
|
12
|
+
export * from "./types.js";
|
|
13
|
+
/** Register the portable Skill, bootstrap, Agent-scoped Tools, and optional Web diagnostics. */
|
|
14
|
+
export function installComputerUseConsumer(ctx) {
|
|
15
|
+
const exposure = new ComputerUseExposure(ctx, () => createComputerUseTools(ctx.computerUse));
|
|
16
|
+
let activation;
|
|
17
|
+
let skill;
|
|
18
|
+
let exposureDispose;
|
|
19
|
+
try {
|
|
20
|
+
activation = ctx.tools.register(exposure.activationTool);
|
|
21
|
+
skill = ctx.skills.register(COMPUTER_USE_SKILL);
|
|
22
|
+
exposureDispose = exposure.install();
|
|
23
|
+
installComputerUseWeb(ctx);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
exposureDispose?.();
|
|
27
|
+
skill?.();
|
|
28
|
+
activation?.();
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
return () => {
|
|
32
|
+
exposureDispose?.();
|
|
33
|
+
activation?.();
|
|
34
|
+
skill?.();
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** macOS provider plus the portable Skill, scoped Tools, and optional Web diagnostics. */
|
|
38
|
+
export class ComputerUseBundle extends MacOSComputerUseProvider {
|
|
39
|
+
static inject = ['subprocess', 'approval', 'settings', 'sessions', 'agents', 'tools', 'skills'];
|
|
40
|
+
static Config = Config;
|
|
41
|
+
consumerDispose;
|
|
42
|
+
constructor(ctx, config = {}) {
|
|
43
|
+
super(ctx, config);
|
|
44
|
+
ctx.effect(() => () => {
|
|
45
|
+
this.consumerDispose?.();
|
|
46
|
+
this.consumerDispose = undefined;
|
|
47
|
+
}, 'dsh-computer-use: consumer lifecycle');
|
|
48
|
+
}
|
|
49
|
+
/** Publish model-facing capabilities only after provider integrity and health pass. */
|
|
50
|
+
async [Service.init]() {
|
|
51
|
+
await super[Service.init]();
|
|
52
|
+
this.consumerDispose = installComputerUseConsumer(this.ctx);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export default ComputerUseBundle;
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,OAAO,EAAE,OAAO,EAAgB,MAAM,qBAAqB,CAAA;AAK3D,OAAO,EAAE,MAAM,EAA0B,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAE1B,gGAAgG;AAChG,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACrD,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA;IAC5F,IAAI,UAAoC,CAAA;IACxC,IAAI,KAA+B,CAAA;IACnC,IAAI,eAAyC,CAAA;IAC7C,IAAI,CAAC;QACH,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QACxD,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;QAC/C,eAAe,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAA;QACpC,qBAAqB,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAe,EAAE,EAAE,CAAA;QACnB,KAAK,EAAE,EAAE,CAAA;QACT,UAAU,EAAE,EAAE,CAAA;QACd,MAAM,KAAK,CAAA;IACb,CAAC;IACD,OAAO,GAAG,EAAE;QACV,eAAe,EAAE,EAAE,CAAA;QACnB,UAAU,EAAE,EAAE,CAAA;QACd,KAAK,EAAE,EAAE,CAAA;IACX,CAAC,CAAA;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,OAAO,iBAAkB,SAAQ,wBAAwB;IAC7D,MAAM,CAAU,MAAM,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IACxG,MAAM,CAAU,MAAM,GAAG,MAAM,CAAA;IAEvB,eAAe,CAA0B;IAEjD,YAAY,GAAY,EAAE,SAA4B,EAAE;QACtD,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAClB,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;YACpB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAA;YACxB,IAAI,CAAC,eAAe,GAAG,SAAS,CAAA;QAClC,CAAC,EAAE,sCAAsC,CAAC,CAAA;IAC5C,CAAC;IAED,uFAAuF;IACpE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACrC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;QAC3B,IAAI,CAAC,eAAe,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7D,CAAC;;AAGH,eAAe,iBAAiB,CAAA"}
|