humanish 0.101.0 → 0.103.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 +4 -2
- package/dist/affordance.d.ts +2 -0
- package/dist/affordance.js +3 -0
- package/dist/affordance.js.map +1 -1
- package/dist/browser-control-client.d.ts +5 -1
- package/dist/browser-control-client.js +45 -5
- package/dist/browser-control-client.js.map +1 -1
- package/dist/browser-control-dispatcher.d.ts +6 -1
- package/dist/browser-control-dispatcher.js +41 -3
- package/dist/browser-control-dispatcher.js.map +1 -1
- package/dist/browser-control-protocol.d.ts +101 -0
- package/dist/browser-control-protocol.js +38 -8
- package/dist/browser-control-protocol.js.map +1 -1
- package/dist/browser-control-recording-transfer.d.ts +4 -0
- package/dist/browser-control-recording-transfer.js +42 -0
- package/dist/browser-control-recording-transfer.js.map +1 -0
- package/dist/browser-control-transport.d.ts +3 -0
- package/dist/browser-control-transport.js +23 -2
- package/dist/browser-control-transport.js.map +1 -1
- package/dist/computer-use.d.ts +9 -0
- package/dist/computer-use.js +36 -8
- package/dist/computer-use.js.map +1 -1
- package/dist/cua-actor-lab.d.ts +6 -2
- package/dist/cua-actor-lab.js +19 -7
- package/dist/cua-actor-lab.js.map +1 -1
- package/dist/cua-desktop-lane.d.ts +1 -1
- package/dist/cua-speech.d.ts +13 -0
- package/dist/cua-speech.js +2 -0
- package/dist/cua-speech.js.map +1 -0
- package/dist/desktop-recorder.d.ts +39 -0
- package/dist/desktop-recorder.js +220 -0
- package/dist/desktop-recorder.js.map +1 -0
- package/dist/desktop-recording-artifact.d.ts +5 -0
- package/dist/desktop-recording-artifact.js +54 -0
- package/dist/desktop-recording-artifact.js.map +1 -0
- package/dist/desktop-recording-types.d.ts +24 -0
- package/dist/desktop-recording-types.js +14 -0
- package/dist/desktop-recording-types.js.map +1 -0
- package/dist/desktop-session.js +1 -0
- package/dist/desktop-session.js.map +1 -1
- package/dist/doctor-lab.js +1 -1
- package/dist/doctor-lab.js.map +1 -1
- package/dist/e2b-cua-desktop.js +77 -44
- package/dist/e2b-cua-desktop.js.map +1 -1
- package/dist/e2b-cua-provisioning.d.ts +4 -1
- package/dist/e2b-cua-provisioning.js +8 -2
- package/dist/e2b-cua-provisioning.js.map +1 -1
- package/dist/e2b-desktop-executor.js +3 -0
- package/dist/e2b-desktop-executor.js.map +1 -1
- package/dist/e2b-desktop-launch.d.ts +19 -1
- package/dist/e2b-desktop-launch.js.map +1 -1
- package/dist/e2b-desktop-media.d.ts +14 -0
- package/dist/e2b-desktop-media.js +58 -0
- package/dist/e2b-desktop-media.js.map +1 -0
- package/dist/e2b-desktop-recording.d.ts +16 -0
- package/dist/e2b-desktop-recording.js +162 -0
- package/dist/e2b-desktop-recording.js.map +1 -0
- package/dist/export-bundle.js +2 -0
- package/dist/export-bundle.js.map +1 -1
- package/dist/export.js +19 -3
- package/dist/export.js.map +1 -1
- package/dist/guest-bootstrap.d.ts +6 -2
- package/dist/guest-bootstrap.js +22 -9
- package/dist/guest-bootstrap.js.map +1 -1
- package/dist/guest-desktop-executor.js +1 -0
- package/dist/guest-desktop-executor.js.map +1 -1
- package/dist/guest-desktop-media.d.ts +33 -0
- package/dist/guest-desktop-media.js +281 -0
- package/dist/guest-desktop-media.js.map +1 -0
- package/dist/guest-media-config.d.ts +15 -0
- package/dist/guest-media-config.js +8 -0
- package/dist/guest-media-config.js.map +1 -0
- package/dist/guest-media-worker.d.ts +1 -0
- package/dist/guest-media-worker.js +319 -0
- package/dist/guest-media-worker.js.map +1 -0
- package/dist/guest-runtime-desktop.d.ts +5 -1
- package/dist/guest-runtime-desktop.js +62 -3
- package/dist/guest-runtime-desktop.js.map +1 -1
- package/dist/guest-runtime-main.js +3 -2
- package/dist/guest-runtime-main.js.map +1 -1
- package/dist/guest-runtime.d.ts +8 -2
- package/dist/guest-runtime.js +3 -2
- package/dist/guest-runtime.js.map +1 -1
- package/dist/lab-config.d.ts +6 -2
- package/dist/lab-config.js +26 -4
- package/dist/lab-config.js.map +1 -1
- package/dist/lab-summary.js +1 -1
- package/dist/lab-summary.js.map +1 -1
- package/dist/local-firecracker-desktop.d.ts +10 -1
- package/dist/local-firecracker-desktop.js +16 -2
- package/dist/local-firecracker-desktop.js.map +1 -1
- package/dist/local-firecracker-study.js +29 -3
- package/dist/local-firecracker-study.js.map +1 -1
- package/dist/local-runtime-config.js +5 -2
- package/dist/local-runtime-config.js.map +1 -1
- package/dist/local-runtime-release.d.ts +2 -0
- package/dist/local-runtime-release.js +15 -0
- package/dist/local-runtime-release.js.map +1 -1
- package/dist/local-runtime.d.ts +1 -0
- package/dist/local-runtime.js +11 -9
- package/dist/local-runtime.js.map +1 -1
- package/dist/observer-app.html +9 -9
- package/dist/observer-serve.js +1 -1
- package/dist/observer-serve.js.map +1 -1
- package/dist/observer.d.ts +2 -2
- package/dist/observer.js +106 -27
- package/dist/observer.js.map +1 -1
- package/dist/program.js +3 -2
- package/dist/program.js.map +1 -1
- package/dist/restricted-codex-participant-policy.d.ts +2 -1
- package/dist/restricted-codex-participant-policy.js +9 -6
- package/dist/restricted-codex-participant-policy.js.map +1 -1
- package/dist/restricted-codex-participant-run.js +2 -1
- package/dist/restricted-codex-participant-run.js.map +1 -1
- package/dist/restricted-codex-participant.d.ts +2 -0
- package/dist/restricted-codex-participant.js +20 -7
- package/dist/restricted-codex-participant.js.map +1 -1
- package/dist/run.d.ts +12 -7
- package/dist/run.js +55 -15
- package/dist/run.js.map +1 -1
- package/dist/selected-output-paths.d.ts +3 -0
- package/dist/selected-output-paths.js +29 -17
- package/dist/selected-output-paths.js.map +1 -1
- package/dist/study-analysis-engine.d.ts +1 -1
- package/dist/study-analysis-engine.js +53 -10
- package/dist/study-analysis-engine.js.map +1 -1
- package/docs/architecture/desktop-recording.md +65 -0
- package/docs/architecture/local-browser-runtime.md +3 -2
- package/docs/architecture/participant-media.md +90 -0
- package/docs/contracts/run-bundle.md +27 -0
- package/docs/contracts/schemas.md +1 -1
- package/docs/contracts/study-analysis.md +14 -0
- package/docs/goals/current.md +13 -9
- package/docs/ramp/README.md +11 -1
- package/docs/release/0.102.0-participant-media.md +43 -0
- package/docs/release/0.103.0-desktop-recording.md +29 -0
- package/package.json +5 -4
- package/skills/humanish/SKILL.md +14 -5
package/README.md
CHANGED
|
@@ -52,8 +52,10 @@ your lab; installing Codex does not change an `openai-computer-use` lab.
|
|
|
52
52
|
For local browsers, install only `humanish` and follow the
|
|
53
53
|
[local study setup](docs/architecture/local-browser-runtime.md). The first live
|
|
54
54
|
run downloads a verified runtime image; `npx humanish runtime setup` prepares it
|
|
55
|
-
ahead of time. Supported Macs use Lima instead of Docker Desktop.
|
|
56
|
-
|
|
55
|
+
ahead of time. Supported Macs use Lima instead of Docker Desktop.
|
|
56
|
+
[Optional camera and spoken conversation](docs/architecture/participant-media.md)
|
|
57
|
+
use a separate media runtime. [Optional desktop video/audio](docs/architecture/desktop-recording.md)
|
|
58
|
+
adds continuous Observer playback; screenshots remain the default. Local inboxes remain a follow-up.
|
|
57
59
|
|
|
58
60
|
For a new local study, initialize with your app URL and task:
|
|
59
61
|
|
package/dist/affordance.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export type AffordanceClass =
|
|
|
10
10
|
"pointer"
|
|
11
11
|
/** Keyboard input into the page: typed text that is not a URL and not script. */
|
|
12
12
|
| "keyboard"
|
|
13
|
+
/** Spoken input sent through the participant's admitted microphone path. */
|
|
14
|
+
| "speech"
|
|
13
15
|
/** Direct navigation by URL (the `nav` subset). A human affordance; see the note above. */
|
|
14
16
|
| "url-navigation"
|
|
15
17
|
/** Script execution via the address bar (a `javascript:` URL). Not a human affordance. */
|
package/dist/affordance.js
CHANGED
|
@@ -28,6 +28,7 @@ export const AFFORDANCE_CLASS_SCHEMA = "humanish.affordance-use.v1";
|
|
|
28
28
|
export const NATURALISTIC_AFFORDANCE_CLASSES = [
|
|
29
29
|
"pointer",
|
|
30
30
|
"keyboard",
|
|
31
|
+
"speech",
|
|
31
32
|
"url-navigation",
|
|
32
33
|
"observation"
|
|
33
34
|
];
|
|
@@ -98,6 +99,8 @@ export function classifyCuaAction(action) {
|
|
|
98
99
|
}
|
|
99
100
|
return { affordance: "keyboard" };
|
|
100
101
|
}
|
|
102
|
+
case "speak":
|
|
103
|
+
return { affordance: "speech" };
|
|
101
104
|
default:
|
|
102
105
|
// The wire->CuaAction mapper drops unrecognized action types before they reach here, so
|
|
103
106
|
// this is unreachable today; classify defensively rather than throwing inside a run.
|
package/dist/affordance.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affordance.js","sourceRoot":"","sources":["../src/affordance.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,EAAE;AACF,gGAAgG;AAChG,8FAA8F;AAC9F,gGAAgG;AAChG,iGAAiG;AACjG,iGAAiG;AACjG,+FAA+F;AAC/F,8FAA8F;AAC9F,yFAAyF;AACzF,EAAE;AACF,oCAAoC;AACpC,EAAE;AACF,mGAAmG;AACnG,kGAAkG;AAClG,kGAAkG;AAClG,sDAAsD;AACtD,mGAAmG;AACnG,8FAA8F;AAC9F,4CAA4C;AAC5C,EAAE;AACF,4FAA4F;AAC5F,gGAAgG;AAChG,2FAA2F;AAC3F,gGAAgG;AAIhG,MAAM,CAAC,MAAM,uBAAuB,GAAG,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"affordance.js","sourceRoot":"","sources":["../src/affordance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import type { Duplex } from "node:stream";
|
|
1
|
+
import type { Duplex, Writable } from "node:stream";
|
|
2
2
|
import type { CuaExecutor } from "./computer-use.js";
|
|
3
3
|
import { type BrowserControlIdentity } from "./browser-control-protocol.js";
|
|
4
|
+
import type { DesktopRecordingMetadata } from "./desktop-recording-types.js";
|
|
4
5
|
export interface BrowserControlClientOptions {
|
|
5
6
|
transport: Duplex;
|
|
6
7
|
identity: BrowserControlIdentity;
|
|
7
8
|
requestTimeoutMs?: number;
|
|
9
|
+
/** Set only after the optional media runtime was admitted for this desktop. */
|
|
10
|
+
speechEnabled?: boolean;
|
|
8
11
|
}
|
|
9
12
|
export interface BrowserControlClient {
|
|
10
13
|
executor: CuaExecutor;
|
|
11
14
|
ready(): Promise<void>;
|
|
15
|
+
finishRecording(destination: Writable): Promise<DesktopRecordingMetadata>;
|
|
12
16
|
close(): void;
|
|
13
17
|
}
|
|
14
18
|
export declare function createBrowserControlClient(options: BrowserControlClientOptions): BrowserControlClient;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { CuaExecutorError } from "./cua-executor-error.js";
|
|
2
2
|
import { BROWSER_CONTROL_LIMITS, BROWSER_CONTROL_VERSION, decodeBrowserControlObservation, parseBrowserControlReply, sameBrowserControlIdentity, validateBrowserControlAction, validateBrowserControlIdentity } from "./browser-control-protocol.js";
|
|
3
3
|
import { BrowserControlTransport } from "./browser-control-transport.js";
|
|
4
|
+
import { receiveBrowserControlRecording } from "./browser-control-recording-transfer.js";
|
|
4
5
|
export function createBrowserControlClient(options) {
|
|
5
6
|
const identity = validateBrowserControlIdentity(options.identity);
|
|
6
7
|
const timeoutMs = options.requestTimeoutMs ?? BROWSER_CONTROL_LIMITS.requestTimeoutMs;
|
|
7
8
|
if (!Number.isFinite(timeoutMs) || timeoutMs < 1 || timeoutMs > BROWSER_CONTROL_LIMITS.maxRequestTimeoutMs)
|
|
8
9
|
throw new CuaExecutorError("invalid_request", "not_dispatched");
|
|
9
|
-
let seq = 0, busy = false, ready = false, closed = false;
|
|
10
|
+
let seq = 0, busy = false, ready = false, closed = false, rawStream;
|
|
10
11
|
let pending;
|
|
11
12
|
const finish = () => {
|
|
12
13
|
if (!pending?.reply || !pending.writeComplete)
|
|
@@ -14,7 +15,10 @@ export function createBrowserControlClient(options) {
|
|
|
14
15
|
const operation = pending;
|
|
15
16
|
pending = undefined;
|
|
16
17
|
operation.dispose();
|
|
17
|
-
if (operation.reply.ok)
|
|
18
|
+
if (operation.reply.ok && operation.raw) {
|
|
19
|
+
void operation.raw.then(() => operation.resolve(operation.reply), operation.reject);
|
|
20
|
+
}
|
|
21
|
+
else if (operation.reply.ok)
|
|
18
22
|
operation.resolve(operation.reply);
|
|
19
23
|
else {
|
|
20
24
|
const { code, disposition } = operation.reply.error;
|
|
@@ -42,6 +46,22 @@ export function createBrowserControlClient(options) {
|
|
|
42
46
|
transport.close("protocol_mismatch");
|
|
43
47
|
return;
|
|
44
48
|
}
|
|
49
|
+
if (request.operation === "FINISH_RECORDING" && reply.ok) {
|
|
50
|
+
if (!reply.recording || !pending.destination) {
|
|
51
|
+
transport.close("invalid_response");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
rawStream = transport.handoff();
|
|
56
|
+
closed = true;
|
|
57
|
+
pending.raw = receiveBrowserControlRecording(rawStream, pending.destination, reply.recording.bytes);
|
|
58
|
+
void pending.raw.catch(() => { });
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
transport.close("transport_failed");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
45
65
|
pending.reply = reply;
|
|
46
66
|
finish();
|
|
47
67
|
}, code => {
|
|
@@ -53,7 +73,7 @@ export function createBrowserControlClient(options) {
|
|
|
53
73
|
operation.reject(new CuaExecutorError(code, operation.written ? "outcome_uncertain" : "not_dispatched"));
|
|
54
74
|
}
|
|
55
75
|
});
|
|
56
|
-
const exchange = (operation, action, signal) => {
|
|
76
|
+
const exchange = (operation, action, signal, destination) => {
|
|
57
77
|
if (closed)
|
|
58
78
|
return Promise.reject(new CuaExecutorError("executor_closed", "not_dispatched"));
|
|
59
79
|
if (signal?.aborted)
|
|
@@ -69,7 +89,7 @@ export function createBrowserControlClient(options) {
|
|
|
69
89
|
return new Promise((resolve, reject) => {
|
|
70
90
|
const abort = () => transport.close("cancelled");
|
|
71
91
|
const timer = setTimeout(() => transport.close("deadline_exceeded"), timeoutMs);
|
|
72
|
-
const slot = { request, written: false, writeComplete: false, resolve, reject,
|
|
92
|
+
const slot = { request, written: false, writeComplete: false, resolve, reject, ...(destination ? { destination } : {}),
|
|
73
93
|
dispose: () => { clearTimeout(timer); signal?.removeEventListener("abort", abort); } };
|
|
74
94
|
pending = slot;
|
|
75
95
|
signal?.addEventListener("abort", abort, { once: true });
|
|
@@ -103,6 +123,7 @@ export function createBrowserControlClient(options) {
|
|
|
103
123
|
};
|
|
104
124
|
const executor = {
|
|
105
125
|
stallRecovery: "fail_closed",
|
|
126
|
+
...(options.speechEnabled === true ? { speechEnabled: true } : {}),
|
|
106
127
|
observe: () => withOperation(async () => {
|
|
107
128
|
await ensureReady();
|
|
108
129
|
const reply = await exchange("OBSERVE");
|
|
@@ -118,6 +139,9 @@ export function createBrowserControlClient(options) {
|
|
|
118
139
|
}),
|
|
119
140
|
execute: (action, signal) => withOperation(async () => {
|
|
120
141
|
const validAction = validateBrowserControlAction(action);
|
|
142
|
+
if (validAction.kind === "speak" && options.speechEnabled !== true) {
|
|
143
|
+
throw new CuaExecutorError("action_rejected", "not_dispatched");
|
|
144
|
+
}
|
|
121
145
|
if (signal?.aborted)
|
|
122
146
|
throw new CuaExecutorError("cancelled", "not_dispatched");
|
|
123
147
|
try {
|
|
@@ -131,6 +155,22 @@ export function createBrowserControlClient(options) {
|
|
|
131
155
|
await exchange("EXECUTE", validAction, signal);
|
|
132
156
|
})
|
|
133
157
|
};
|
|
134
|
-
return { executor, ready: () => withOperation(ensureReady),
|
|
158
|
+
return { executor, ready: () => withOperation(ensureReady),
|
|
159
|
+
finishRecording: destination => withOperation(async () => {
|
|
160
|
+
if (!destination || destination.destroyed)
|
|
161
|
+
throw new CuaExecutorError("invalid_request", "not_dispatched");
|
|
162
|
+
try {
|
|
163
|
+
await ensureReady();
|
|
164
|
+
const reply = await exchange("FINISH_RECORDING", undefined, undefined, destination);
|
|
165
|
+
if (!reply.ok || !reply.recording)
|
|
166
|
+
throw new CuaExecutorError("invalid_response", "outcome_uncertain");
|
|
167
|
+
return reply.recording;
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
destination.destroy();
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
}),
|
|
174
|
+
close: () => { rawStream?.destroy(); transport.close(); } };
|
|
135
175
|
}
|
|
136
176
|
//# sourceMappingURL=browser-control-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-control-client.js","sourceRoot":"","sources":["../src/browser-control-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACL,sBAAsB,EAAE,uBAAuB,EAAE,+BAA+B,EAChF,wBAAwB,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,8BAA8B,EAEnH,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-control-client.js","sourceRoot":"","sources":["../src/browser-control-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import type { Duplex } from "node:stream";
|
|
1
|
+
import type { Duplex, Readable } from "node:stream";
|
|
2
2
|
import type { CuaExecutor } from "./computer-use.js";
|
|
3
3
|
import { type BrowserControlIdentity } from "./browser-control-protocol.js";
|
|
4
|
+
import { type DesktopRecordingMetadata } from "./desktop-recording-types.js";
|
|
4
5
|
export interface BrowserControlDispatcherOptions {
|
|
5
6
|
transport: Duplex;
|
|
6
7
|
identity: BrowserControlIdentity;
|
|
7
8
|
executor: CuaExecutor;
|
|
8
9
|
isAuthorized: () => boolean;
|
|
9
10
|
authoritySignal: AbortSignal;
|
|
11
|
+
finishRecording?: () => Promise<{
|
|
12
|
+
metadata: DesktopRecordingMetadata;
|
|
13
|
+
stream: Readable;
|
|
14
|
+
}>;
|
|
10
15
|
}
|
|
11
16
|
/** Caller retains physical runtime ownership. Closing this channel does not claim the browser stopped. */
|
|
12
17
|
export declare function attachBrowserControlDispatcher(options: BrowserControlDispatcherOptions): {
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { CuaExecutorError } from "./cua-executor-error.js";
|
|
2
2
|
import { BROWSER_CONTROL_LIMITS, BROWSER_CONTROL_VERSION, encodeBrowserControlObservation, parseBrowserControlRequest, safeBrowserControlFailure, sameBrowserControlIdentity, validateBrowserControlIdentity } from "./browser-control-protocol.js";
|
|
3
3
|
import { BrowserControlTransport } from "./browser-control-transport.js";
|
|
4
|
+
import { sendBrowserControlRecording } from "./browser-control-recording-transfer.js";
|
|
5
|
+
import { desktopRecordingMetadataSchema } from "./desktop-recording-types.js";
|
|
4
6
|
/** Caller retains physical runtime ownership. Closing this channel does not claim the browser stopped. */
|
|
5
7
|
export function attachBrowserControlDispatcher(options) {
|
|
6
8
|
const identity = validateBrowserControlIdentity(options.identity);
|
|
7
|
-
let lastSeq = 0, busy = false, ready = false, closed = false;
|
|
9
|
+
let lastSeq = 0, busy = false, ready = false, closed = false, rawStream;
|
|
8
10
|
let active;
|
|
9
11
|
let timer;
|
|
10
12
|
const dispose = () => { clearTimeout(timer); timer = undefined; active?.abort(); active = undefined; };
|
|
@@ -69,7 +71,10 @@ export function attachBrowserControlDispatcher(options) {
|
|
|
69
71
|
}
|
|
70
72
|
reply = { ...common, ok: true, observation: encodeBrowserControlObservation(observation) };
|
|
71
73
|
}
|
|
72
|
-
else {
|
|
74
|
+
else if (request.operation === "EXECUTE") {
|
|
75
|
+
if (request.action.kind === "speak" && options.executor.speechEnabled !== true) {
|
|
76
|
+
throw new CuaExecutorError("action_rejected", "not_dispatched");
|
|
77
|
+
}
|
|
73
78
|
// No await between the owner gate above and invocation. The physical driver must
|
|
74
79
|
// check this signal again immediately before each actual input after preparation.
|
|
75
80
|
invoked = true;
|
|
@@ -80,6 +85,39 @@ export function attachBrowserControlDispatcher(options) {
|
|
|
80
85
|
}
|
|
81
86
|
reply = { ...common, ok: true };
|
|
82
87
|
}
|
|
88
|
+
else {
|
|
89
|
+
invoked = true;
|
|
90
|
+
if (!options.finishRecording)
|
|
91
|
+
throw new CuaExecutorError("action_rejected", "not_dispatched");
|
|
92
|
+
const recording = await options.finishRecording();
|
|
93
|
+
let metadata;
|
|
94
|
+
try {
|
|
95
|
+
metadata = desktopRecordingMetadataSchema.parse(recording.metadata);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
recording.stream.destroy();
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
if (closed || signal.aborted || !authorized()) {
|
|
102
|
+
recording.stream.destroy();
|
|
103
|
+
transport.close("session_revoked");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
reply = { ...common, ok: true, recording: metadata };
|
|
107
|
+
try {
|
|
108
|
+
await transport.send(reply);
|
|
109
|
+
rawStream = transport.handoff();
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
recording.stream.destroy();
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
closed = true;
|
|
116
|
+
dispose();
|
|
117
|
+
options.authoritySignal.removeEventListener("abort", revoke);
|
|
118
|
+
await sendBrowserControlRecording(recording.stream, rawStream, metadata.bytes).catch(() => { });
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
83
121
|
}
|
|
84
122
|
catch (error) {
|
|
85
123
|
reply = { ...common, ok: false, error: safeBrowserControlFailure(error, invoked) };
|
|
@@ -104,6 +142,6 @@ export function attachBrowserControlDispatcher(options) {
|
|
|
104
142
|
options.authoritySignal.addEventListener("abort", revoke, { once: true });
|
|
105
143
|
if (!authorized())
|
|
106
144
|
transport.close("session_revoked");
|
|
107
|
-
return { close: () => transport.close() };
|
|
145
|
+
return { close: () => { rawStream?.destroy(); transport.close(); } };
|
|
108
146
|
}
|
|
109
147
|
//# sourceMappingURL=browser-control-dispatcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-control-dispatcher.js","sourceRoot":"","sources":["../src/browser-control-dispatcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACL,sBAAsB,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,0BAA0B,EAC5G,yBAAyB,EAAE,0BAA0B,EAAE,8BAA8B,EAEtF,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-control-dispatcher.js","sourceRoot":"","sources":["../src/browser-control-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { CuaAction, CuaObservation } from "./computer-use.js";
|
|
3
|
+
import { type HeardSpeech } from "./cua-speech.js";
|
|
3
4
|
import { type CuaExecutorErrorCode } from "./cua-executor-error.js";
|
|
4
5
|
export declare const BROWSER_CONTROL_VERSION = 1;
|
|
5
6
|
export declare const BROWSER_CONTROL_LIMITS: Readonly<{
|
|
@@ -8,6 +9,10 @@ export declare const BROWSER_CONTROL_LIMITS: Readonly<{
|
|
|
8
9
|
dimension: 4096;
|
|
9
10
|
pixels: 16000000;
|
|
10
11
|
textBytes: number;
|
|
12
|
+
speechCharacters: 400;
|
|
13
|
+
speechBytes: 1600;
|
|
14
|
+
heardSpeech: 4;
|
|
15
|
+
speechDurationMs: 120000;
|
|
11
16
|
chordKeys: 16;
|
|
12
17
|
keyCharacters: 64;
|
|
13
18
|
dragPoints: 1024;
|
|
@@ -20,6 +25,47 @@ export interface BrowserControlIdentity {
|
|
|
20
25
|
challenge: string;
|
|
21
26
|
runtimeRevision: string;
|
|
22
27
|
}
|
|
28
|
+
export declare const browserOnlyControlActionSchema: z.ZodDiscriminatedUnion<readonly [z.ZodObject<{
|
|
29
|
+
button: z.ZodOptional<z.ZodEnum<{
|
|
30
|
+
left: "left";
|
|
31
|
+
right: "right";
|
|
32
|
+
middle: "middle";
|
|
33
|
+
}>>;
|
|
34
|
+
x: z.ZodNumber;
|
|
35
|
+
y: z.ZodNumber;
|
|
36
|
+
kind: z.ZodLiteral<"click">;
|
|
37
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
38
|
+
x: z.ZodNumber;
|
|
39
|
+
y: z.ZodNumber;
|
|
40
|
+
kind: z.ZodLiteral<"double_click">;
|
|
41
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
42
|
+
x: z.ZodNumber;
|
|
43
|
+
y: z.ZodNumber;
|
|
44
|
+
kind: z.ZodLiteral<"move">;
|
|
45
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
46
|
+
dx: z.ZodNumber;
|
|
47
|
+
dy: z.ZodNumber;
|
|
48
|
+
x: z.ZodNumber;
|
|
49
|
+
y: z.ZodNumber;
|
|
50
|
+
kind: z.ZodLiteral<"scroll">;
|
|
51
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
52
|
+
kind: z.ZodLiteral<"type">;
|
|
53
|
+
text: z.ZodString;
|
|
54
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
55
|
+
kind: z.ZodLiteral<"keypress">;
|
|
56
|
+
keys: z.ZodArray<z.ZodString>;
|
|
57
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
58
|
+
kind: z.ZodLiteral<"drag">;
|
|
59
|
+
path: z.ZodArray<z.ZodObject<{
|
|
60
|
+
x: z.ZodNumber;
|
|
61
|
+
y: z.ZodNumber;
|
|
62
|
+
}, z.core.$strict>>;
|
|
63
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
64
|
+
kind: z.ZodLiteral<"wait">;
|
|
65
|
+
ms: z.ZodOptional<z.ZodNumber>;
|
|
66
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
67
|
+
kind: z.ZodLiteral<"screenshot">;
|
|
68
|
+
}, z.core.$strict>], "kind">;
|
|
23
69
|
export declare const browserControlActionSchema: z.ZodPipe<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
24
70
|
button: z.ZodOptional<z.ZodEnum<{
|
|
25
71
|
left: "left";
|
|
@@ -60,6 +106,9 @@ export declare const browserControlActionSchema: z.ZodPipe<z.ZodDiscriminatedUni
|
|
|
60
106
|
ms: z.ZodOptional<z.ZodNumber>;
|
|
61
107
|
}, z.core.$strict>, z.ZodObject<{
|
|
62
108
|
kind: z.ZodLiteral<"screenshot">;
|
|
109
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
110
|
+
kind: z.ZodLiteral<"speak">;
|
|
111
|
+
text: z.ZodString;
|
|
63
112
|
}, z.core.$strict>], "kind">, z.ZodTransform<{
|
|
64
113
|
kind: "click";
|
|
65
114
|
x: number;
|
|
@@ -94,6 +143,9 @@ export declare const browserControlActionSchema: z.ZodPipe<z.ZodDiscriminatedUni
|
|
|
94
143
|
} | {
|
|
95
144
|
kind: "wait";
|
|
96
145
|
ms?: number;
|
|
146
|
+
} | {
|
|
147
|
+
kind: "speak";
|
|
148
|
+
text: string;
|
|
97
149
|
} | {
|
|
98
150
|
kind: "screenshot";
|
|
99
151
|
}, {
|
|
@@ -132,6 +184,9 @@ export declare const browserControlActionSchema: z.ZodPipe<z.ZodDiscriminatedUni
|
|
|
132
184
|
ms?: number | undefined;
|
|
133
185
|
} | {
|
|
134
186
|
kind: "screenshot";
|
|
187
|
+
} | {
|
|
188
|
+
kind: "speak";
|
|
189
|
+
text: string;
|
|
135
190
|
}>>;
|
|
136
191
|
declare const observationSchema: z.ZodObject<{
|
|
137
192
|
png: z.ZodString;
|
|
@@ -140,6 +195,12 @@ declare const observationSchema: z.ZodObject<{
|
|
|
140
195
|
title: z.ZodOptional<z.ZodString>;
|
|
141
196
|
text: z.ZodOptional<z.ZodString>;
|
|
142
197
|
scrollY: z.ZodOptional<z.ZodNumber>;
|
|
198
|
+
heardSpeech: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
199
|
+
id: z.ZodString;
|
|
200
|
+
source: z.ZodLiteral<"speaker_audio">;
|
|
201
|
+
text: z.ZodString;
|
|
202
|
+
durationMs: z.ZodNumber;
|
|
203
|
+
}, z.core.$strict>>>;
|
|
143
204
|
}, z.core.$strict>;
|
|
144
205
|
type WireObservation = z.infer<typeof observationSchema>;
|
|
145
206
|
declare const requestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
@@ -208,6 +269,9 @@ declare const requestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
208
269
|
ms: z.ZodOptional<z.ZodNumber>;
|
|
209
270
|
}, z.core.$strict>, z.ZodObject<{
|
|
210
271
|
kind: z.ZodLiteral<"screenshot">;
|
|
272
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
273
|
+
kind: z.ZodLiteral<"speak">;
|
|
274
|
+
text: z.ZodString;
|
|
211
275
|
}, z.core.$strict>], "kind">, z.ZodTransform<{
|
|
212
276
|
kind: "click";
|
|
213
277
|
x: number;
|
|
@@ -242,6 +306,9 @@ declare const requestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
242
306
|
} | {
|
|
243
307
|
kind: "wait";
|
|
244
308
|
ms?: number;
|
|
309
|
+
} | {
|
|
310
|
+
kind: "speak";
|
|
311
|
+
text: string;
|
|
245
312
|
} | {
|
|
246
313
|
kind: "screenshot";
|
|
247
314
|
}, {
|
|
@@ -280,6 +347,9 @@ declare const requestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
280
347
|
ms?: number | undefined;
|
|
281
348
|
} | {
|
|
282
349
|
kind: "screenshot";
|
|
350
|
+
} | {
|
|
351
|
+
kind: "speak";
|
|
352
|
+
text: string;
|
|
283
353
|
}>>;
|
|
284
354
|
version: z.ZodLiteral<1>;
|
|
285
355
|
identity: z.ZodObject<{
|
|
@@ -289,6 +359,17 @@ declare const requestSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
289
359
|
}, z.core.$strict>;
|
|
290
360
|
seq: z.ZodNumber;
|
|
291
361
|
requestId: z.ZodString;
|
|
362
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
363
|
+
type: z.ZodLiteral<"request">;
|
|
364
|
+
operation: z.ZodLiteral<"FINISH_RECORDING">;
|
|
365
|
+
version: z.ZodLiteral<1>;
|
|
366
|
+
identity: z.ZodObject<{
|
|
367
|
+
generation: z.ZodString;
|
|
368
|
+
challenge: z.ZodString;
|
|
369
|
+
runtimeRevision: z.ZodString;
|
|
370
|
+
}, z.core.$strict>;
|
|
371
|
+
seq: z.ZodNumber;
|
|
372
|
+
requestId: z.ZodString;
|
|
292
373
|
}, z.core.$strict>], "operation">;
|
|
293
374
|
declare const replySchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
294
375
|
ok: z.ZodLiteral<true>;
|
|
@@ -299,12 +380,30 @@ declare const replySchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
299
380
|
title: z.ZodOptional<z.ZodString>;
|
|
300
381
|
text: z.ZodOptional<z.ZodString>;
|
|
301
382
|
scrollY: z.ZodOptional<z.ZodNumber>;
|
|
383
|
+
heardSpeech: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
384
|
+
id: z.ZodString;
|
|
385
|
+
source: z.ZodLiteral<"speaker_audio">;
|
|
386
|
+
text: z.ZodString;
|
|
387
|
+
durationMs: z.ZodNumber;
|
|
388
|
+
}, z.core.$strict>>>;
|
|
389
|
+
}, z.core.$strict>>;
|
|
390
|
+
recording: z.ZodOptional<z.ZodObject<{
|
|
391
|
+
mimeType: z.ZodLiteral<"video/mp4">;
|
|
392
|
+
startedAt: z.ZodISODateTime;
|
|
393
|
+
durationMs: z.ZodNumber;
|
|
394
|
+
bytes: z.ZodNumber;
|
|
395
|
+
audioSources: z.ZodArray<z.ZodEnum<{
|
|
396
|
+
"microphone-input": "microphone-input";
|
|
397
|
+
"speaker-output": "speaker-output";
|
|
398
|
+
}>>;
|
|
399
|
+
complete: z.ZodBoolean;
|
|
302
400
|
}, z.core.$strict>>;
|
|
303
401
|
type: z.ZodLiteral<"reply">;
|
|
304
402
|
operation: z.ZodEnum<{
|
|
305
403
|
HELLO: "HELLO";
|
|
306
404
|
OBSERVE: "OBSERVE";
|
|
307
405
|
EXECUTE: "EXECUTE";
|
|
406
|
+
FINISH_RECORDING: "FINISH_RECORDING";
|
|
308
407
|
}>;
|
|
309
408
|
actionId: z.ZodOptional<z.ZodString>;
|
|
310
409
|
version: z.ZodLiteral<1>;
|
|
@@ -342,6 +441,7 @@ declare const replySchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
342
441
|
HELLO: "HELLO";
|
|
343
442
|
OBSERVE: "OBSERVE";
|
|
344
443
|
EXECUTE: "EXECUTE";
|
|
444
|
+
FINISH_RECORDING: "FINISH_RECORDING";
|
|
345
445
|
}>;
|
|
346
446
|
actionId: z.ZodOptional<z.ZodString>;
|
|
347
447
|
version: z.ZodLiteral<1>;
|
|
@@ -360,6 +460,7 @@ export declare function sameBrowserControlIdentity(a: BrowserControlIdentity, b:
|
|
|
360
460
|
export declare function parseBrowserControlRequest(value: unknown): BrowserControlRequest;
|
|
361
461
|
export declare function parseBrowserControlReply(value: unknown): BrowserControlReply;
|
|
362
462
|
export declare function validateBrowserControlAction(value: unknown): CuaAction;
|
|
463
|
+
export declare function validateHeardSpeech(value: unknown): HeardSpeech[];
|
|
363
464
|
/** Check dimensions before allocating decoder output; v1 accepts browser-style 8-bit, noninterlaced PNG. */
|
|
364
465
|
export declare function validateBrowserControlPng(bytes: Buffer): void;
|
|
365
466
|
export declare function encodeBrowserControlObservation(observation: CuaObservation): WireObservation;
|