@dyrra/sdk 0.1.1

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 ADDED
@@ -0,0 +1,20 @@
1
+ # @dyrra/sdk
2
+
3
+ Типизированный клиент Dyrra — единый API к Mac для ИИ-агентов.
4
+
5
+ ```bash
6
+ npm install @dyrra/sdk
7
+ ```
8
+
9
+ ```ts
10
+ import { Dyrra } from "@dyrra/sdk";
11
+
12
+ const dyrra = new Dyrra(process.env.DYRRA_API_KEY!);
13
+ const mac = dyrra.targets("con_…");
14
+
15
+ const tree = await mac.uiTree({ format: "compact" });
16
+ await mac.actions([{ type: "click_element", snapshotId: tree.snapshotId, elementId: "e12" }]);
17
+ ```
18
+
19
+ По умолчанию клиент обращается к `https://api.dyrra.dev`; другой адрес
20
+ задаётся параметром `baseUrl`.
@@ -0,0 +1,48 @@
1
+ import type { Action } from "@dyrra/protocol";
2
+ /**
3
+ * Переводчики действий computer-use в действия Dyrra.
4
+ *
5
+ * Названия сверены с официальной документацией 11.09.2026 (ТЗ 9.2, 22.10),
6
+ * а не написаны по памяти:
7
+ * - Anthropic: платформенный тулсет `computer_toolset_20260801`, где действие —
8
+ * это ИМЯ инструмента (left_click, key, …), а не поле `action`;
9
+ * - OpenAI: `action.type` (click, double_click, drag, keypress, move, scroll,
10
+ * type, wait, screenshot).
11
+ *
12
+ * ВАЖНО о координатах: обе модели работают в пикселях скриншота, а Dyrra —
13
+ * в логических точках экрана (ТЗ 7.6). Если скриншот запрашивался с maxWidth,
14
+ * передайте `scale` из ответа: координаты будут поделены на него.
15
+ */
16
+ export interface AdapterOptions {
17
+ /** `scale` из ответа screenshot: imageWidth / widthPoints. */
18
+ scale?: number;
19
+ }
20
+ export interface AnthropicToolUse {
21
+ /** Имя инструмента внутри тулсета: left_click, type, key, … */
22
+ name: string;
23
+ input: Record<string, unknown>;
24
+ }
25
+ /**
26
+ * Одно действие Anthropic → ноль или одно действие Dyrra.
27
+ * `screenshot`, `zoom` и `cursor_position` возвращают null: это запросы
28
+ * состояния, для них есть отдельные вызовы API.
29
+ */
30
+ export declare function fromAnthropicAction(toolUse: AnthropicToolUse, options?: AdapterOptions): Action | null;
31
+ export declare function fromAnthropicActions(toolUses: AnthropicToolUse[], options?: AdapterOptions): Action[];
32
+ export interface OpenAIComputerAction {
33
+ type: string;
34
+ x?: number;
35
+ y?: number;
36
+ button?: string;
37
+ path?: {
38
+ x: number;
39
+ y: number;
40
+ }[];
41
+ keys?: string[];
42
+ scroll_x?: number;
43
+ scroll_y?: number;
44
+ text?: string;
45
+ }
46
+ export declare function fromOpenAIAction(action: OpenAIComputerAction, options?: AdapterOptions): Action | null;
47
+ export declare function fromOpenAIActions(actions: OpenAIComputerAction[], options?: AdapterOptions): Action[];
48
+ //# sourceMappingURL=computerUse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computerUse.d.ts","sourceRoot":"","sources":["../src/computerUse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAY,MAAM,iBAAiB,CAAC;AAExD;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AA8CD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,cAAmB,GAC3B,MAAM,GAAG,IAAI,CAsEf;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,GAAE,cAAmB,GAC3B,MAAM,EAAE,CAIV;AAID,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqBD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE,cAAmB,GAC3B,MAAM,GAAG,IAAI,CAwDf;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,oBAAoB,EAAE,EAC/B,OAAO,GAAE,cAAmB,GAC3B,MAAM,EAAE,CAIV"}
@@ -0,0 +1,189 @@
1
+ function toPoints(value, scale) {
2
+ return scale === 1 ? value : value / scale;
3
+ }
4
+ const ANTHROPIC_MODIFIERS = {
5
+ super: "cmd",
6
+ cmd: "cmd",
7
+ ctrl: "ctrl",
8
+ control: "ctrl",
9
+ shift: "shift",
10
+ alt: "alt",
11
+ option: "alt",
12
+ };
13
+ /** Имена клавиш в стиле X11 → наши имена (ТЗ 8.4). */
14
+ const ANTHROPIC_KEYS = {
15
+ Return: "return",
16
+ Enter: "return",
17
+ Tab: "tab",
18
+ space: "space",
19
+ BackSpace: "delete",
20
+ Delete: "forwarddelete",
21
+ Escape: "escape",
22
+ Up: "up",
23
+ Down: "down",
24
+ Left: "left",
25
+ Right: "right",
26
+ Home: "home",
27
+ End: "end",
28
+ Page_Up: "pageup",
29
+ Page_Down: "pagedown",
30
+ };
31
+ function anthropicKeys(text) {
32
+ return text.split("+").map((part) => {
33
+ const trimmed = part.trim();
34
+ return ANTHROPIC_MODIFIERS[trimmed.toLowerCase()] ?? ANTHROPIC_KEYS[trimmed] ?? trimmed.toLowerCase();
35
+ });
36
+ }
37
+ function anthropicModifiers(text) {
38
+ if (typeof text !== "string" || !text)
39
+ return [];
40
+ return text
41
+ .split("+")
42
+ .map((part) => ANTHROPIC_MODIFIERS[part.trim().toLowerCase()])
43
+ .filter((value) => Boolean(value));
44
+ }
45
+ /**
46
+ * Одно действие Anthropic → ноль или одно действие Dyrra.
47
+ * `screenshot`, `zoom` и `cursor_position` возвращают null: это запросы
48
+ * состояния, для них есть отдельные вызовы API.
49
+ */
50
+ export function fromAnthropicAction(toolUse, options = {}) {
51
+ const scale = options.scale ?? 1;
52
+ const input = toolUse.input;
53
+ const coordinate = input["coordinate"];
54
+ const start = input["start_coordinate"];
55
+ const modifiers = anthropicModifiers(input["text"]);
56
+ const point = (pair) => pair ? { x: toPoints(pair[0], scale), y: toPoints(pair[1], scale) } : null;
57
+ switch (toolUse.name) {
58
+ case "left_click":
59
+ case "right_click":
60
+ case "middle_click":
61
+ case "double_click":
62
+ case "triple_click": {
63
+ const at = point(coordinate);
64
+ if (!at)
65
+ return null;
66
+ const button = toolUse.name === "right_click"
67
+ ? "right"
68
+ : toolUse.name === "middle_click"
69
+ ? "middle"
70
+ : "left";
71
+ const count = toolUse.name === "double_click" ? 2 : toolUse.name === "triple_click" ? 3 : 1;
72
+ return { type: "click", x: at.x, y: at.y, button, count, modifiers };
73
+ }
74
+ case "mouse_move": {
75
+ const at = point(coordinate);
76
+ return at ? { type: "move", x: at.x, y: at.y } : null;
77
+ }
78
+ case "left_click_drag": {
79
+ const from = point(start);
80
+ const to = point(coordinate);
81
+ if (!from || !to)
82
+ return null;
83
+ return { type: "drag", from, to, button: "left", durationMs: 300 };
84
+ }
85
+ case "scroll": {
86
+ const at = point(coordinate) ?? { x: 0, y: 0 };
87
+ const amount = Number(input["scroll_amount"] ?? 3) * 40;
88
+ const direction = String(input["scroll_direction"] ?? "down");
89
+ const deltas = {
90
+ up: { dx: 0, dy: amount },
91
+ down: { dx: 0, dy: -amount },
92
+ left: { dx: amount, dy: 0 },
93
+ right: { dx: -amount, dy: 0 },
94
+ };
95
+ const delta = deltas[direction] ?? deltas["down"];
96
+ return { type: "scroll", x: at.x, y: at.y, dx: delta.dx, dy: delta.dy };
97
+ }
98
+ case "type":
99
+ return { type: "type", text: String(input["text"] ?? "") };
100
+ case "key":
101
+ return { type: "key", keys: anthropicKeys(String(input["text"] ?? "")) };
102
+ case "wait":
103
+ case "hold_key": {
104
+ const seconds = Number(input["duration"] ?? 1);
105
+ return { type: "wait", ms: Math.min(5000, Math.round(seconds * 1000)) };
106
+ }
107
+ // screenshot, zoom, cursor_position, left_mouse_down/up — отдельные вызовы API.
108
+ default:
109
+ return null;
110
+ }
111
+ }
112
+ export function fromAnthropicActions(toolUses, options = {}) {
113
+ return toolUses
114
+ .map((toolUse) => fromAnthropicAction(toolUse, options))
115
+ .filter((action) => action !== null);
116
+ }
117
+ const OPENAI_KEYS = {
118
+ ENTER: "return",
119
+ RETURN: "return",
120
+ TAB: "tab",
121
+ SPACE: "space",
122
+ BACKSPACE: "delete",
123
+ ESC: "escape",
124
+ ESCAPE: "escape",
125
+ CMD: "cmd",
126
+ COMMAND: "cmd",
127
+ CTRL: "ctrl",
128
+ ALT: "alt",
129
+ SHIFT: "shift",
130
+ ARROWUP: "up",
131
+ ARROWDOWN: "down",
132
+ ARROWLEFT: "left",
133
+ ARROWRIGHT: "right",
134
+ };
135
+ export function fromOpenAIAction(action, options = {}) {
136
+ const scale = options.scale ?? 1;
137
+ const x = toPoints(action.x ?? 0, scale);
138
+ const y = toPoints(action.y ?? 0, scale);
139
+ switch (action.type) {
140
+ case "click": {
141
+ const button = action.button === "right" ? "right" : action.button === "middle" ? "middle" : "left";
142
+ return { type: "click", x, y, button, count: 1, modifiers: [] };
143
+ }
144
+ case "double_click":
145
+ return { type: "click", x, y, button: "left", count: 2, modifiers: [] };
146
+ case "move":
147
+ return { type: "move", x, y };
148
+ case "drag": {
149
+ const path = action.path ?? [];
150
+ const first = path[0];
151
+ const last = path[path.length - 1];
152
+ if (!first || !last)
153
+ return null;
154
+ return {
155
+ type: "drag",
156
+ from: { x: toPoints(first.x, scale), y: toPoints(first.y, scale) },
157
+ to: { x: toPoints(last.x, scale), y: toPoints(last.y, scale) },
158
+ button: "left",
159
+ durationMs: 300,
160
+ };
161
+ }
162
+ case "scroll":
163
+ return {
164
+ type: "scroll",
165
+ x,
166
+ y,
167
+ // У OpenAI положительный scroll_y — вниз, у macOS наоборот.
168
+ dx: -(action.scroll_x ?? 0),
169
+ dy: -(action.scroll_y ?? 0),
170
+ };
171
+ case "type":
172
+ return { type: "type", text: action.text ?? "" };
173
+ case "keypress":
174
+ return {
175
+ type: "key",
176
+ keys: (action.keys ?? []).map((key) => OPENAI_KEYS[key.toUpperCase()] ?? key.toLowerCase()),
177
+ };
178
+ case "wait":
179
+ return { type: "wait", ms: 1000 };
180
+ default:
181
+ return null;
182
+ }
183
+ }
184
+ export function fromOpenAIActions(actions, options = {}) {
185
+ return actions
186
+ .map((action) => fromOpenAIAction(action, options))
187
+ .filter((action) => action !== null);
188
+ }
189
+ //# sourceMappingURL=computerUse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computerUse.js","sourceRoot":"","sources":["../src/computerUse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import type { Action, CloudMac, Connection, CreateCloudMacRequest, CreateEndUserRequest, CreateLinkSessionRequest, EndUser, ErrorCode, LinkSession, QueuedCommand, Screenshot, ScreenshotRequest, ShellRequest, ShellResult, UiTree, UiTreeRequest, WebhookEvent } from "@dyrra/protocol";
2
+ export * from "./computerUse.js";
3
+ export interface DyrraOptions {
4
+ baseUrl?: string;
5
+ fetch?: typeof fetch;
6
+ /** Сколько раз повторять при machine_offline (ТЗ 9.2). */
7
+ maxRetries?: number;
8
+ }
9
+ /** Ошибка API в типизированном виде. */
10
+ export declare class DyrraApiError extends Error {
11
+ readonly code: ErrorCode | string;
12
+ readonly status: number;
13
+ readonly requestId: string | undefined;
14
+ readonly details?: Record<string, unknown> | undefined;
15
+ constructor(code: ErrorCode | string, message: string, status: number, requestId: string | undefined, details?: Record<string, unknown> | undefined);
16
+ }
17
+ export declare class Dyrra {
18
+ #private;
19
+ constructor(apiKey: string, options?: DyrraOptions);
20
+ readonly endUsers: {
21
+ create: (body: CreateEndUserRequest) => Promise<EndUser>;
22
+ get: (id: string) => Promise<EndUser>;
23
+ };
24
+ readonly linkSessions: {
25
+ create: (body: CreateLinkSessionRequest) => Promise<LinkSession>;
26
+ };
27
+ readonly connections: {
28
+ list: (params?: {
29
+ endUserId?: string;
30
+ }) => Promise<{
31
+ data: Connection[];
32
+ }>;
33
+ get: (connectionId: string) => Promise<Connection>;
34
+ revoke: (connectionId: string) => Promise<{
35
+ ok: true;
36
+ }>;
37
+ };
38
+ readonly cloudMacs: {
39
+ /**
40
+ * Облачные Mac сдаются только для разработки и тестирования ПО:
41
+ * это условие раздела 3 лицензии macOS (ТЗ 3.2).
42
+ */
43
+ create: (body: CreateCloudMacRequest) => Promise<CloudMac>;
44
+ list: () => Promise<{
45
+ data: CloudMac[];
46
+ }>;
47
+ get: (id: string) => Promise<CloudMac>;
48
+ extend: (id: string, term: "day" | "week" | "month") => Promise<CloudMac>;
49
+ end: (id: string) => Promise<CloudMac>;
50
+ };
51
+ readonly commands: {
52
+ get: (commandId: string) => Promise<QueuedCommand>;
53
+ cancel: (commandId: string) => Promise<QueuedCommand>;
54
+ };
55
+ /**
56
+ * Управление конкретным Mac. `target` — connectionId (личный Mac)
57
+ * или cloudMacId (облачный): API одинаковый (ТЗ 8.4).
58
+ */
59
+ targets(target: string): {
60
+ screenshot: (body?: Partial<ScreenshotRequest>) => Promise<Screenshot>;
61
+ actions: (actions: Action[], options?: {
62
+ screenshotAfter?: Partial<ScreenshotRequest>;
63
+ whenUnavailable?: "fail" | "queue";
64
+ ttlSeconds?: number;
65
+ /**
66
+ * Приложение, в котором должна идти серия. Если активно другое,
67
+ * Mac остановит серию с app_not_frontmost — ввод не уйдёт в чужое окно.
68
+ */
69
+ expectBundleId?: string;
70
+ }) => Promise<{
71
+ ok: boolean;
72
+ screenshot: Screenshot | null;
73
+ } | QueuedCommand>;
74
+ uiTree: (body?: Partial<UiTreeRequest>) => Promise<UiTree>;
75
+ cursor: () => Promise<{
76
+ x: number;
77
+ y: number;
78
+ }>;
79
+ shell: (body: ShellRequest) => Promise<ShellResult | QueuedCommand>;
80
+ /** Завершается, когда приложение стало активным; возвращает его bundle id. */
81
+ openApp: (body: {
82
+ bundleId?: string;
83
+ name?: string;
84
+ }) => Promise<{
85
+ ok: true;
86
+ bundleId?: string;
87
+ name?: string;
88
+ }>;
89
+ activateApp: (bundleId: string) => Promise<{
90
+ ok: true;
91
+ bundleId?: string;
92
+ name?: string;
93
+ }>;
94
+ apps: () => Promise<{
95
+ data: unknown[];
96
+ }>;
97
+ windows: () => Promise<{
98
+ data: unknown[];
99
+ }>;
100
+ openUrl: (url: string) => Promise<{
101
+ ok: true;
102
+ }>;
103
+ getClipboard: () => Promise<{
104
+ text: string;
105
+ }>;
106
+ setClipboard: (text: string) => Promise<{
107
+ ok: true;
108
+ }>;
109
+ readFile: (path: string) => Promise<{
110
+ mime: string;
111
+ data: string;
112
+ }>;
113
+ writeFile: (path: string, data: string, sha256: string) => Promise<{
114
+ ok: true;
115
+ }>;
116
+ };
117
+ readonly webhooks: {
118
+ /** Проверка подписи Dyrra-Signature (ТЗ 8.6). */
119
+ verify(signatureHeader: string, body: string, secret: string, toleranceSec?: number): boolean;
120
+ parse(body: string): WebhookEvent;
121
+ };
122
+ private request;
123
+ private retryDelay;
124
+ }
125
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,MAAM,EACN,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,OAAO,EACP,SAAS,EACT,WAAW,EACX,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,MAAM,EACN,aAAa,EACb,YAAY,EACb,MAAM,iBAAiB,CAAC;AAGzB,cAAc,kBAAkB,CAAC;AAEjC,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wCAAwC;AACxC,qBAAa,aAAc,SAAQ,KAAK;IAEpC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAEjC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAL5C,YACW,IAAI,EAAE,SAAS,GAAG,MAAM,EACjC,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA,EAI3C;CACF;AAID,qBAAa,KAAK;;IAMhB,YAAY,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAMrD;IAGD,QAAQ,CAAC,QAAQ;QACf,MAAM,SAAS,oBAAoB,KAAG,OAAO,CAAC,OAAO,CAAC;QAEtD,GAAG,OAAO,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;MACnC;IAGF,QAAQ,CAAC,YAAY;QACnB,MAAM,SAAS,wBAAwB,KAAG,OAAO,CAAC,WAAW,CAAC;MAE9D;IAGF,QAAQ,CAAC,WAAW;QAClB,IAAI,YAAW;YAAE,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,KAAQ,OAAO,CAAC;YAAE,IAAI,EAAE,UAAU,EAAE,CAAA;SAAE,CAAC;QAI5E,GAAG,iBAAiB,MAAM,KAAG,OAAO,CAAC,UAAU,CAAC;QAEhD,MAAM,iBAAiB,MAAM,KAAG,OAAO,CAAC;YAAE,EAAE,EAAE,IAAI,CAAA;SAAE,CAAC;MAErD;IAGF,QAAQ,CAAC,SAAS;QAChB;;;WAGG;QACH,MAAM,SAAS,qBAAqB,KAAG,OAAO,CAAC,QAAQ,CAAC;QAExD,IAAI,QAAM,OAAO,CAAC;YAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;SAAE,CAAC;QACvC,GAAG,OAAO,MAAM,KAAG,OAAO,CAAC,QAAQ,CAAC;QACpC,MAAM,OAAO,MAAM,QAAQ,KAAK,GAAG,MAAM,GAAG,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;QAEvE,GAAG,OAAO,MAAM,KAAG,OAAO,CAAC,QAAQ,CAAC;MACpC;IAEF,QAAQ,CAAC,QAAQ;QACf,GAAG,cAAc,MAAM,KAAG,OAAO,CAAC,aAAa,CAAC;QAEhD,MAAM,cAAc,MAAM,KAAG,OAAO,CAAC,aAAa,CAAC;MAEnD;IAEF;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM;QAGlB,UAAU,UAAS,OAAO,CAAC,iBAAiB,CAAC,KAAQ,OAAO,CAAC,UAAU,CAAC;QAGxE,OAAO,YACI,MAAM,EAAE,YACR;YACP,eAAe,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC7C,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;YACnC,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB;;;eAGG;YACH,cAAc,CAAC,EAAE,MAAM,CAAC;SACzB,KACA,OAAO,CAAC;YAAE,EAAE,EAAE,OAAO,CAAC;YAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAA;SAAE,GAAG,aAAa,CAAC;QAG1E,MAAM,UAAS,OAAO,CAAC,aAAa,CAAC,KAAQ,OAAO,CAAC,MAAM,CAAC;QAG5D,MAAM,QAAM,OAAO,CAAC;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAE7C,KAAK,SAAS,YAAY,KAAG,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC;QAGjE,8EAA8E;QAC9E,OAAO,SAAS;YACd,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,KAAG,OAAO,CAAC;YAAE,EAAE,EAAE,IAAI,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAG3D,WAAW,aAAa,MAAM,KAAG,OAAO,CAAC;YAAE,EAAE,EAAE,IAAI,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAGxF,IAAI,QAAM,OAAO,CAAC;YAAE,IAAI,EAAE,OAAO,EAAE,CAAA;SAAE,CAAC;QACtC,OAAO,QAAM,OAAO,CAAC;YAAE,IAAI,EAAE,OAAO,EAAE,CAAA;SAAE,CAAC;QAEzC,OAAO,QAAQ,MAAM,KAAG,OAAO,CAAC;YAAE,EAAE,EAAE,IAAI,CAAA;SAAE,CAAC;QAG7C,YAAY,QAAM,OAAO,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3C,YAAY,SAAS,MAAM,KAAG,OAAO,CAAC;YAAE,EAAE,EAAE,IAAI,CAAA;SAAE,CAAC;QAGnD,QAAQ,SAAS,MAAM,KAAG,OAAO,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAGjE,SAAS,SAAS,MAAM,QAAQ,MAAM,UAAU,MAAM,KAAG,OAAO,CAAC;YAAE,EAAE,EAAE,IAAI,CAAA;SAAE,CAAC;MAGjF;IAGD,QAAQ,CAAC,QAAQ;QACf,iDAAiD;QACjD,MAAM,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,0BAAuB,OAAO;QAqB1F,KAAK,OAAO,MAAM,GAAG,YAAY;MAGjC;YAGY,OAAO;IAwCrB,OAAO,CAAC,UAAU;CAQnB"}
package/dist/index.js ADDED
@@ -0,0 +1,154 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ import { DEFAULT_API_BASE_URL } from "@dyrra/protocol";
3
+ export * from "./computerUse.js";
4
+ /** Ошибка API в типизированном виде. */
5
+ export class DyrraApiError extends Error {
6
+ code;
7
+ status;
8
+ requestId;
9
+ details;
10
+ constructor(code, message, status, requestId, details) {
11
+ super(message);
12
+ this.code = code;
13
+ this.status = status;
14
+ this.requestId = requestId;
15
+ this.details = details;
16
+ this.name = "DyrraApiError";
17
+ }
18
+ }
19
+ const RETRY_ON_OFFLINE_MS = [1000, 3000, 8000];
20
+ export class Dyrra {
21
+ #apiKey;
22
+ #baseUrl;
23
+ #fetch;
24
+ #maxRetries;
25
+ constructor(apiKey, options = {}) {
26
+ if (!apiKey)
27
+ throw new Error("Нужен ключ платформы (dk_live_… или dk_test_…)");
28
+ this.#apiKey = apiKey;
29
+ this.#baseUrl = (options.baseUrl ?? DEFAULT_API_BASE_URL).replace(/\/$/, "");
30
+ this.#fetch = options.fetch ?? globalThis.fetch;
31
+ this.#maxRetries = options.maxRetries ?? RETRY_ON_OFFLINE_MS.length;
32
+ }
33
+ /* ── Пользователи платформы ─────────────────────────────────────────── */
34
+ endUsers = {
35
+ create: (body) => this.request("POST", "/v1/end-users", body),
36
+ get: (id) => this.request("GET", `/v1/end-users/${id}`),
37
+ };
38
+ /* ── Сессии подключения ─────────────────────────────────────────────── */
39
+ linkSessions = {
40
+ create: (body) => this.request("POST", "/v1/link-sessions", body),
41
+ };
42
+ /* ── Подключения ────────────────────────────────────────────────────── */
43
+ connections = {
44
+ list: (params = {}) => {
45
+ const query = params.endUserId ? `?endUserId=${encodeURIComponent(params.endUserId)}` : "";
46
+ return this.request("GET", `/v1/connections${query}`);
47
+ },
48
+ get: (connectionId) => this.request("GET", `/v1/connections/${connectionId}`),
49
+ revoke: (connectionId) => this.request("DELETE", `/v1/connections/${connectionId}`),
50
+ };
51
+ /* ── Облачные Mac ───────────────────────────────────────────────────── */
52
+ cloudMacs = {
53
+ /**
54
+ * Облачные Mac сдаются только для разработки и тестирования ПО:
55
+ * это условие раздела 3 лицензии macOS (ТЗ 3.2).
56
+ */
57
+ create: (body) => this.request("POST", "/v1/cloud-macs", body),
58
+ list: () => this.request("GET", "/v1/cloud-macs"),
59
+ get: (id) => this.request("GET", `/v1/cloud-macs/${id}`),
60
+ extend: (id, term) => this.request("POST", `/v1/cloud-macs/${id}/extend`, { term }),
61
+ end: (id) => this.request("DELETE", `/v1/cloud-macs/${id}`),
62
+ };
63
+ commands = {
64
+ get: (commandId) => this.request("GET", `/v1/commands/${commandId}`),
65
+ cancel: (commandId) => this.request("DELETE", `/v1/commands/${commandId}`),
66
+ };
67
+ /**
68
+ * Управление конкретным Mac. `target` — connectionId (личный Mac)
69
+ * или cloudMacId (облачный): API одинаковый (ТЗ 8.4).
70
+ */
71
+ targets(target) {
72
+ const base = `/v1/targets/${encodeURIComponent(target)}`;
73
+ return {
74
+ screenshot: (body = {}) => this.request("POST", `${base}/screenshot`, body),
75
+ actions: (actions, options = {}) => this.request("POST", `${base}/actions`, { actions, ...options }),
76
+ uiTree: (body = {}) => this.request("POST", `${base}/ui-tree`, body),
77
+ cursor: () => this.request("GET", `${base}/cursor`),
78
+ shell: (body) => this.request("POST", `${base}/shell`, body),
79
+ /** Завершается, когда приложение стало активным; возвращает его bundle id. */
80
+ openApp: (body) => this.request("POST", `${base}/apps/open`, body),
81
+ activateApp: (bundleId) => this.request("POST", `${base}/apps/activate`, { bundleId }),
82
+ apps: () => this.request("GET", `${base}/apps`),
83
+ windows: () => this.request("GET", `${base}/windows`),
84
+ openUrl: (url) => this.request("POST", `${base}/urls/open`, { url }),
85
+ getClipboard: () => this.request("GET", `${base}/clipboard`),
86
+ setClipboard: (text) => this.request("PUT", `${base}/clipboard`, { text }),
87
+ readFile: (path) => this.request("GET", `${base}/files?path=${encodeURIComponent(path)}`),
88
+ writeFile: (path, data, sha256) => this.request("PUT", `${base}/files?path=${encodeURIComponent(path)}`, { data, sha256 }),
89
+ };
90
+ }
91
+ /* ── Webhooks ───────────────────────────────────────────────────────── */
92
+ webhooks = {
93
+ /** Проверка подписи Dyrra-Signature (ТЗ 8.6). */
94
+ verify(signatureHeader, body, secret, toleranceSec = 300) {
95
+ const parts = Object.fromEntries(signatureHeader.split(",").map((p) => {
96
+ const [k, v] = p.split("=");
97
+ return [k?.trim() ?? "", v?.trim() ?? ""];
98
+ }));
99
+ const timestamp = Number(parts["t"]);
100
+ const provided = parts["v1"];
101
+ if (!Number.isFinite(timestamp) || !provided)
102
+ return false;
103
+ if (Math.abs(Date.now() / 1000 - timestamp) > toleranceSec)
104
+ return false;
105
+ const expected = createHmac("sha256", secret)
106
+ .update(`${timestamp}.${body}`)
107
+ .digest("hex");
108
+ const a = Buffer.from(provided);
109
+ const b = Buffer.from(expected);
110
+ return a.length === b.length && timingSafeEqual(a, b);
111
+ },
112
+ parse(body) {
113
+ return JSON.parse(body);
114
+ },
115
+ };
116
+ /* ── Транспорт ──────────────────────────────────────────────────────── */
117
+ async request(method, path, body) {
118
+ let attempt = 0;
119
+ for (;;) {
120
+ const response = await this.#fetch(`${this.#baseUrl}${path}`, {
121
+ method,
122
+ headers: {
123
+ authorization: `Bearer ${this.#apiKey}`,
124
+ ...(body === undefined ? {} : { "content-type": "application/json" }),
125
+ ...(method === "POST" ? { "idempotency-key": crypto.randomUUID() } : {}),
126
+ },
127
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
128
+ });
129
+ if (response.ok)
130
+ return (await response.json());
131
+ const payload = (await response.json().catch(() => null));
132
+ const code = payload?.error?.code ?? "internal_error";
133
+ const requestId = response.headers.get("x-request-id") ?? undefined;
134
+ // Mac мог просто отключиться на секунду — пробуем ещё раз (ТЗ 9.2).
135
+ const retryDelay = this.retryDelay(code, response, attempt);
136
+ if (retryDelay !== null && attempt < this.#maxRetries) {
137
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
138
+ attempt += 1;
139
+ continue;
140
+ }
141
+ throw new DyrraApiError(code, payload?.error?.message ?? response.statusText, response.status, requestId, payload?.error?.details);
142
+ }
143
+ }
144
+ retryDelay(code, response, attempt) {
145
+ if (code === "machine_offline")
146
+ return RETRY_ON_OFFLINE_MS[attempt] ?? null;
147
+ if (code === "machine_busy" || code === "rate_limited") {
148
+ const retryAfter = Number(response.headers.get("retry-after") ?? "1");
149
+ return Number.isFinite(retryAfter) ? retryAfter * 1000 : 1000;
150
+ }
151
+ return null;
152
+ }
153
+ }
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@dyrra/sdk",
3
+ "version": "0.1.1",
4
+ "description": "Типизированный клиент Dyrra: единый API к Mac для ИИ-агентов",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "@dyrra/protocol": "0.1.1"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "24.10.1"
19
+ },
20
+ "license": "MIT",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/ceodaredevil/dyrra.git",
24
+ "directory": "packages/sdk"
25
+ },
26
+ "homepage": "https://github.com/ceodaredevil/dyrra",
27
+ "bugs": {
28
+ "url": "https://github.com/ceodaredevil/dyrra/issues"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "keywords": [
37
+ "mac",
38
+ "macos",
39
+ "ai-agent",
40
+ "computer-use",
41
+ "mcp",
42
+ "automation"
43
+ ],
44
+ "scripts": {
45
+ "build": "tsc -p tsconfig.build.json",
46
+ "typecheck": "tsc -p tsconfig.json --noEmit",
47
+ "lint": "oxlint src",
48
+ "test": "vitest run",
49
+ "build:types": "tsc -p tsconfig.build.json"
50
+ }
51
+ }