browser-use-sdk 0.3.0 → 0.5.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/CHANGELOG.md +23 -0
- package/client.d.mts +2 -2
- package/client.d.mts.map +1 -1
- package/client.d.ts +2 -2
- package/client.d.ts.map +1 -1
- package/client.js.map +1 -1
- package/client.mjs.map +1 -1
- package/internal/detect-platform.js +1 -1
- package/internal/detect-platform.js.map +1 -1
- package/internal/detect-platform.mjs +1 -1
- package/internal/detect-platform.mjs.map +1 -1
- package/lib/bin/auth.d.mts +10 -0
- package/lib/bin/auth.d.mts.map +1 -0
- package/lib/bin/auth.d.ts +10 -0
- package/lib/bin/auth.d.ts.map +1 -0
- package/lib/bin/auth.js +52 -0
- package/lib/bin/auth.js.map +1 -0
- package/lib/bin/auth.mjs +47 -0
- package/lib/bin/auth.mjs.map +1 -0
- package/lib/bin/cli.d.mts +3 -0
- package/lib/bin/cli.d.mts.map +1 -0
- package/lib/bin/cli.d.ts +3 -0
- package/lib/bin/cli.d.ts.map +1 -0
- package/lib/bin/cli.js +12 -0
- package/lib/bin/cli.js.map +1 -0
- package/lib/bin/cli.mjs +10 -0
- package/lib/bin/cli.mjs.map +1 -0
- package/lib/bin/commands/listen.d.mts +3 -0
- package/lib/bin/commands/listen.d.mts.map +1 -0
- package/lib/bin/commands/listen.d.ts +3 -0
- package/lib/bin/commands/listen.d.ts.map +1 -0
- package/lib/bin/commands/listen.js +133 -0
- package/lib/bin/commands/listen.js.map +1 -0
- package/lib/bin/commands/listen.mjs +130 -0
- package/lib/bin/commands/listen.mjs.map +1 -0
- package/lib/stream.d.mts.map +1 -1
- package/lib/stream.d.ts.map +1 -1
- package/lib/stream.js +6 -3
- package/lib/stream.js.map +1 -1
- package/lib/stream.mjs +6 -3
- package/lib/stream.mjs.map +1 -1
- package/lib/webhooks.d.mts +73 -0
- package/lib/webhooks.d.mts.map +1 -0
- package/lib/webhooks.d.ts +73 -0
- package/lib/webhooks.d.ts.map +1 -0
- package/lib/webhooks.js +84 -0
- package/lib/webhooks.js.map +1 -0
- package/lib/webhooks.mjs +78 -0
- package/lib/webhooks.mjs.map +1 -0
- package/package.json +9 -2
- package/resources/index.d.mts +1 -1
- package/resources/index.d.mts.map +1 -1
- package/resources/index.d.ts +1 -1
- package/resources/index.d.ts.map +1 -1
- package/resources/index.js.map +1 -1
- package/resources/index.mjs.map +1 -1
- package/resources/sessions/index.d.mts +1 -1
- package/resources/sessions/index.d.mts.map +1 -1
- package/resources/sessions/index.d.ts +1 -1
- package/resources/sessions/index.d.ts.map +1 -1
- package/resources/sessions/index.js.map +1 -1
- package/resources/sessions/index.mjs.map +1 -1
- package/resources/sessions/sessions.d.mts +2 -8
- package/resources/sessions/sessions.d.mts.map +1 -1
- package/resources/sessions/sessions.d.ts +2 -8
- package/resources/sessions/sessions.d.ts.map +1 -1
- package/resources/sessions/sessions.js +2 -2
- package/resources/sessions/sessions.js.map +1 -1
- package/resources/sessions/sessions.mjs +2 -2
- package/resources/sessions/sessions.mjs.map +1 -1
- package/resources/tasks.d.mts +96 -65
- package/resources/tasks.d.mts.map +1 -1
- package/resources/tasks.d.ts +96 -65
- package/resources/tasks.d.ts.map +1 -1
- package/resources/tasks.js +5 -12
- package/resources/tasks.js.map +1 -1
- package/resources/tasks.mjs +5 -12
- package/resources/tasks.mjs.map +1 -1
- package/src/client.ts +2 -2
- package/src/internal/detect-platform.ts +1 -1
- package/src/lib/bin/auth.ts +63 -0
- package/src/lib/bin/cli.ts +11 -0
- package/src/lib/bin/commands/listen.ts +172 -0
- package/src/lib/stream.ts +6 -3
- package/src/lib/webhooks.ts +118 -0
- package/src/resources/index.ts +0 -1
- package/src/resources/sessions/index.ts +0 -1
- package/src/resources/sessions/sessions.ts +2 -16
- package/src/resources/tasks.ts +108 -73
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listen = void 0;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const __1 = require("../../..//index.js");
|
|
6
|
+
const webhooks_1 = require("../../webhooks.js");
|
|
7
|
+
const auth_1 = require("../auth.js");
|
|
8
|
+
// NOTE: We perform task list refresh to get all running tasks and then
|
|
9
|
+
const tickRef = { timeout: null, abort: null };
|
|
10
|
+
exports.listen = new commander_1.Command('listen')
|
|
11
|
+
.description(`Open a local webhook to receive Cloud API updates from the CLI on your local machine.`)
|
|
12
|
+
.option('-d, --dev <endpoint>', 'The endpoint to forward updates to.')
|
|
13
|
+
.action(async (options) => {
|
|
14
|
+
// Auth
|
|
15
|
+
const client = (0, auth_1.createBrowserUseClient)();
|
|
16
|
+
const secret = (0, auth_1.getBrowserUseWebhookSecret)();
|
|
17
|
+
// Proxy
|
|
18
|
+
const { dev: localTargetEndpoint } = options;
|
|
19
|
+
if (typeof localTargetEndpoint !== 'string') {
|
|
20
|
+
// NOTE: This should never happen because the command is validated by commander.
|
|
21
|
+
throw new Error('Something unexpected happened. Please report this issue. https://github.com/browser-use/browser-use-node/issues');
|
|
22
|
+
}
|
|
23
|
+
const localTargetURL = new URL(localTargetEndpoint);
|
|
24
|
+
//
|
|
25
|
+
const startTimeDate = new Date();
|
|
26
|
+
const queue = { current: [] };
|
|
27
|
+
const runs = new Map();
|
|
28
|
+
tickRef.timeout = setInterval(async () => {
|
|
29
|
+
// NOTE: On next tick, we abort the current abort controller.
|
|
30
|
+
if (tickRef.abort != null) {
|
|
31
|
+
tickRef.abort.abort();
|
|
32
|
+
}
|
|
33
|
+
const controller = new AbortController();
|
|
34
|
+
tickRef.abort = controller;
|
|
35
|
+
console.log(`[polling] ${new Date().toISOString()} `.padEnd(100, '='));
|
|
36
|
+
const tasks = await client.tasks
|
|
37
|
+
.list({
|
|
38
|
+
pageSize: 10,
|
|
39
|
+
// NOTE: There's a bug in the API where the datetime needs to be provided in naive format.cur
|
|
40
|
+
after: startTimeDate.toISOString().replace('Z', ''),
|
|
41
|
+
}, {
|
|
42
|
+
signal: tickRef.abort.signal,
|
|
43
|
+
})
|
|
44
|
+
.then((res) => res.items)
|
|
45
|
+
.catch((err) => {
|
|
46
|
+
if (err instanceof __1.APIUserAbortError) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
console.log(`[polling] ${new Date().toISOString()} failed`);
|
|
50
|
+
console.error(err);
|
|
51
|
+
return [];
|
|
52
|
+
});
|
|
53
|
+
for (const task of tasks) {
|
|
54
|
+
const currentTaskStatus = runs.get(task.id);
|
|
55
|
+
const timestamp = task.finishedAt ? task.finishedAt : task.startedAt;
|
|
56
|
+
if (currentTaskStatus == null) {
|
|
57
|
+
// NOTE: The task is new and the CLI hasn't yet captured it in the current run.
|
|
58
|
+
queue.current.push({
|
|
59
|
+
type: 'agent.task.status_update',
|
|
60
|
+
timestamp,
|
|
61
|
+
payload: {
|
|
62
|
+
session_id: task.sessionId,
|
|
63
|
+
task_id: task.id,
|
|
64
|
+
status: task.status,
|
|
65
|
+
metadata: task.metadata,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
runs.set(task.id, task.status);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// NOTE: CLI has registered the task in the registry and we need to compare.
|
|
73
|
+
if (task.status !== currentTaskStatus) {
|
|
74
|
+
queue.current.push({
|
|
75
|
+
type: 'agent.task.status_update',
|
|
76
|
+
timestamp,
|
|
77
|
+
payload: {
|
|
78
|
+
session_id: task.sessionId,
|
|
79
|
+
task_id: task.id,
|
|
80
|
+
status: task.status,
|
|
81
|
+
metadata: task.metadata,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
runs.set(task.id, task.status);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (queue.current.length === 0) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const promises = queue.current.map(async (update) => {
|
|
93
|
+
const body = JSON.stringify(update);
|
|
94
|
+
const signature = (0, webhooks_1.createWebhookSignature)({
|
|
95
|
+
payload: update.payload,
|
|
96
|
+
timestamp: update.timestamp,
|
|
97
|
+
secret,
|
|
98
|
+
});
|
|
99
|
+
try {
|
|
100
|
+
const res = await fetch(localTargetURL, {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
body,
|
|
103
|
+
headers: {
|
|
104
|
+
'Content-Type': 'application/json',
|
|
105
|
+
// https://docs.browser-use.com/cloud/webhooks#implementing-webhook-verification
|
|
106
|
+
'X-Browser-Use-Timestamp': update.timestamp,
|
|
107
|
+
'X-Browser-Use-Signature': signature,
|
|
108
|
+
},
|
|
109
|
+
signal: controller.signal,
|
|
110
|
+
});
|
|
111
|
+
console.log(`[update] ${update.timestamp} ${update.type} ${res.status}`);
|
|
112
|
+
return { delivery: 'fulfilled', update, status: res.status };
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.log(`[update] ${update.timestamp} ${update.type} failed`);
|
|
116
|
+
return { delivery: 'rejected', update, error: err };
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
const delivery = await Promise.all(promises);
|
|
120
|
+
// NOTE: We preserve the rejected updates so we can retry them.
|
|
121
|
+
queue.current = delivery.filter((d) => d.delivery === 'rejected').map((d) => d.update);
|
|
122
|
+
}, 1000);
|
|
123
|
+
console.log(`Listening in dev mode at: ${localTargetEndpoint}`);
|
|
124
|
+
});
|
|
125
|
+
process.on('SIGINT', () => {
|
|
126
|
+
if (tickRef.abort != null) {
|
|
127
|
+
tickRef.abort.abort();
|
|
128
|
+
}
|
|
129
|
+
if (tickRef.timeout) {
|
|
130
|
+
clearInterval(tickRef.timeout);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=listen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.js","sourceRoot":"","sources":["../../../src/lib/bin/commands/listen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { APIUserAbortError } from "../../..//index.mjs";
|
|
3
|
+
import { createWebhookSignature } from "../../webhooks.mjs";
|
|
4
|
+
import { createBrowserUseClient, getBrowserUseWebhookSecret } from "../auth.mjs";
|
|
5
|
+
// NOTE: We perform task list refresh to get all running tasks and then
|
|
6
|
+
const tickRef = { timeout: null, abort: null };
|
|
7
|
+
export const listen = new Command('listen')
|
|
8
|
+
.description(`Open a local webhook to receive Cloud API updates from the CLI on your local machine.`)
|
|
9
|
+
.option('-d, --dev <endpoint>', 'The endpoint to forward updates to.')
|
|
10
|
+
.action(async (options) => {
|
|
11
|
+
// Auth
|
|
12
|
+
const client = createBrowserUseClient();
|
|
13
|
+
const secret = getBrowserUseWebhookSecret();
|
|
14
|
+
// Proxy
|
|
15
|
+
const { dev: localTargetEndpoint } = options;
|
|
16
|
+
if (typeof localTargetEndpoint !== 'string') {
|
|
17
|
+
// NOTE: This should never happen because the command is validated by commander.
|
|
18
|
+
throw new Error('Something unexpected happened. Please report this issue. https://github.com/browser-use/browser-use-node/issues');
|
|
19
|
+
}
|
|
20
|
+
const localTargetURL = new URL(localTargetEndpoint);
|
|
21
|
+
//
|
|
22
|
+
const startTimeDate = new Date();
|
|
23
|
+
const queue = { current: [] };
|
|
24
|
+
const runs = new Map();
|
|
25
|
+
tickRef.timeout = setInterval(async () => {
|
|
26
|
+
// NOTE: On next tick, we abort the current abort controller.
|
|
27
|
+
if (tickRef.abort != null) {
|
|
28
|
+
tickRef.abort.abort();
|
|
29
|
+
}
|
|
30
|
+
const controller = new AbortController();
|
|
31
|
+
tickRef.abort = controller;
|
|
32
|
+
console.log(`[polling] ${new Date().toISOString()} `.padEnd(100, '='));
|
|
33
|
+
const tasks = await client.tasks
|
|
34
|
+
.list({
|
|
35
|
+
pageSize: 10,
|
|
36
|
+
// NOTE: There's a bug in the API where the datetime needs to be provided in naive format.cur
|
|
37
|
+
after: startTimeDate.toISOString().replace('Z', ''),
|
|
38
|
+
}, {
|
|
39
|
+
signal: tickRef.abort.signal,
|
|
40
|
+
})
|
|
41
|
+
.then((res) => res.items)
|
|
42
|
+
.catch((err) => {
|
|
43
|
+
if (err instanceof APIUserAbortError) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
console.log(`[polling] ${new Date().toISOString()} failed`);
|
|
47
|
+
console.error(err);
|
|
48
|
+
return [];
|
|
49
|
+
});
|
|
50
|
+
for (const task of tasks) {
|
|
51
|
+
const currentTaskStatus = runs.get(task.id);
|
|
52
|
+
const timestamp = task.finishedAt ? task.finishedAt : task.startedAt;
|
|
53
|
+
if (currentTaskStatus == null) {
|
|
54
|
+
// NOTE: The task is new and the CLI hasn't yet captured it in the current run.
|
|
55
|
+
queue.current.push({
|
|
56
|
+
type: 'agent.task.status_update',
|
|
57
|
+
timestamp,
|
|
58
|
+
payload: {
|
|
59
|
+
session_id: task.sessionId,
|
|
60
|
+
task_id: task.id,
|
|
61
|
+
status: task.status,
|
|
62
|
+
metadata: task.metadata,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
runs.set(task.id, task.status);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// NOTE: CLI has registered the task in the registry and we need to compare.
|
|
70
|
+
if (task.status !== currentTaskStatus) {
|
|
71
|
+
queue.current.push({
|
|
72
|
+
type: 'agent.task.status_update',
|
|
73
|
+
timestamp,
|
|
74
|
+
payload: {
|
|
75
|
+
session_id: task.sessionId,
|
|
76
|
+
task_id: task.id,
|
|
77
|
+
status: task.status,
|
|
78
|
+
metadata: task.metadata,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
runs.set(task.id, task.status);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (queue.current.length === 0) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const promises = queue.current.map(async (update) => {
|
|
90
|
+
const body = JSON.stringify(update);
|
|
91
|
+
const signature = createWebhookSignature({
|
|
92
|
+
payload: update.payload,
|
|
93
|
+
timestamp: update.timestamp,
|
|
94
|
+
secret,
|
|
95
|
+
});
|
|
96
|
+
try {
|
|
97
|
+
const res = await fetch(localTargetURL, {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
body,
|
|
100
|
+
headers: {
|
|
101
|
+
'Content-Type': 'application/json',
|
|
102
|
+
// https://docs.browser-use.com/cloud/webhooks#implementing-webhook-verification
|
|
103
|
+
'X-Browser-Use-Timestamp': update.timestamp,
|
|
104
|
+
'X-Browser-Use-Signature': signature,
|
|
105
|
+
},
|
|
106
|
+
signal: controller.signal,
|
|
107
|
+
});
|
|
108
|
+
console.log(`[update] ${update.timestamp} ${update.type} ${res.status}`);
|
|
109
|
+
return { delivery: 'fulfilled', update, status: res.status };
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
console.log(`[update] ${update.timestamp} ${update.type} failed`);
|
|
113
|
+
return { delivery: 'rejected', update, error: err };
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
const delivery = await Promise.all(promises);
|
|
117
|
+
// NOTE: We preserve the rejected updates so we can retry them.
|
|
118
|
+
queue.current = delivery.filter((d) => d.delivery === 'rejected').map((d) => d.update);
|
|
119
|
+
}, 1000);
|
|
120
|
+
console.log(`Listening in dev mode at: ${localTargetEndpoint}`);
|
|
121
|
+
});
|
|
122
|
+
process.on('SIGINT', () => {
|
|
123
|
+
if (tickRef.abort != null) {
|
|
124
|
+
tickRef.abort.abort();
|
|
125
|
+
}
|
|
126
|
+
if (tickRef.timeout) {
|
|
127
|
+
clearInterval(tickRef.timeout);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=listen.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.mjs","sourceRoot":"","sources":["../../../src/lib/bin/commands/listen.ts"],"names":[],"mappings":"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"}
|
package/lib/stream.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.mts","sourceRoot":"","sources":["../src/lib/stream.ts"],"names":[],"mappings":"OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE;AAGtC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC,GAAG,IAAI,CAAC;AAEV,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"stream.d.mts","sourceRoot":"","sources":["../src/lib/stream.ts"],"names":[],"mappings":"OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE;AAGtC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC,GAAG,IAAI,CAAC;AAEV,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAkEhG"}
|
package/lib/stream.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/lib/stream.ts"],"names":[],"mappings":"OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE;AAGtC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC,GAAG,IAAI,CAAC;AAEV,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/lib/stream.ts"],"names":[],"mappings":"OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE;AAGtC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC,GAAG,IAAI,CAAC;AAEV,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAkEhG"}
|
package/lib/stream.js
CHANGED
|
@@ -7,7 +7,7 @@ function reducer(state, action) {
|
|
|
7
7
|
case 'status': {
|
|
8
8
|
// INIT
|
|
9
9
|
if (state == null) {
|
|
10
|
-
const liveUrl = action.status.
|
|
10
|
+
const liveUrl = action.status.session.liveUrl ?? null;
|
|
11
11
|
const doneOutput = action.status.doneOutput ?? null;
|
|
12
12
|
const state = {
|
|
13
13
|
taskId: action.status.id,
|
|
@@ -19,7 +19,7 @@ function reducer(state, action) {
|
|
|
19
19
|
return [state, action.status];
|
|
20
20
|
}
|
|
21
21
|
// UPDATE
|
|
22
|
-
const liveUrl = action.status.
|
|
22
|
+
const liveUrl = action.status.session.liveUrl ?? state.liveUrl;
|
|
23
23
|
const doneOutput = action.status.doneOutput ?? state.doneOutput;
|
|
24
24
|
const steps = [...state.steps];
|
|
25
25
|
if (action.status.steps != null) {
|
|
@@ -41,7 +41,10 @@ function reducer(state, action) {
|
|
|
41
41
|
const update = {
|
|
42
42
|
...action.status,
|
|
43
43
|
steps: newState.steps,
|
|
44
|
-
|
|
44
|
+
session: {
|
|
45
|
+
...action.status.session,
|
|
46
|
+
liveUrl: newState.liveUrl,
|
|
47
|
+
},
|
|
45
48
|
doneOutput: newState.doneOutput,
|
|
46
49
|
};
|
|
47
50
|
return [newState, update];
|
package/lib/stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/lib/stream.ts"],"names":[],"mappings":";;AAmBA,
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/lib/stream.ts"],"names":[],"mappings":";;AAmBA,0BAkEC;AApFD,sCAAkE;AAkBlE,SAAgB,OAAO,CAAC,KAAmB,EAAE,MAAqB;IAChE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO;YAEP,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;gBACtD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;gBAEpD,MAAM,KAAK,GAAiB;oBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;oBACxB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;oBAClC,OAAO,EAAE,OAAO;oBAChB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;oBAC1B,UAAU,EAAE,UAAU;iBACvB,CAAC;gBAEF,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;YAED,SAAS;YAET,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;YAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;YAEhE,MAAM,KAAK,GAAmB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAE/D,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAA8B;gBAC1C,GAAG,KAAK;gBACR,OAAO;gBACP,KAAK;gBACL,UAAU;aACX,CAAC;YAEF,UAAU;YAEV,IACE,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC;gBAC1C,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBACnC,KAAK,CAAC,UAAU,IAAI,UAAU,EAC9B,CAAC;gBACD,MAAM,MAAM,GAAiB;oBAC3B,GAAG,MAAM,CAAC,MAAM;oBAChB,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,OAAO,EAAE;wBACP,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO;wBACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;qBAC1B;oBACD,UAAU,EAAE,QAAQ,CAAC,UAAU;iBAChC,CAAC;gBAEF,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC;YAED,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD;YACE,MAAM,IAAI,6BAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
package/lib/stream.mjs
CHANGED
|
@@ -4,7 +4,7 @@ export function reducer(state, action) {
|
|
|
4
4
|
case 'status': {
|
|
5
5
|
// INIT
|
|
6
6
|
if (state == null) {
|
|
7
|
-
const liveUrl = action.status.
|
|
7
|
+
const liveUrl = action.status.session.liveUrl ?? null;
|
|
8
8
|
const doneOutput = action.status.doneOutput ?? null;
|
|
9
9
|
const state = {
|
|
10
10
|
taskId: action.status.id,
|
|
@@ -16,7 +16,7 @@ export function reducer(state, action) {
|
|
|
16
16
|
return [state, action.status];
|
|
17
17
|
}
|
|
18
18
|
// UPDATE
|
|
19
|
-
const liveUrl = action.status.
|
|
19
|
+
const liveUrl = action.status.session.liveUrl ?? state.liveUrl;
|
|
20
20
|
const doneOutput = action.status.doneOutput ?? state.doneOutput;
|
|
21
21
|
const steps = [...state.steps];
|
|
22
22
|
if (action.status.steps != null) {
|
|
@@ -38,7 +38,10 @@ export function reducer(state, action) {
|
|
|
38
38
|
const update = {
|
|
39
39
|
...action.status,
|
|
40
40
|
steps: newState.steps,
|
|
41
|
-
|
|
41
|
+
session: {
|
|
42
|
+
...action.status.session,
|
|
43
|
+
liveUrl: newState.liveUrl,
|
|
44
|
+
},
|
|
42
45
|
doneOutput: newState.doneOutput,
|
|
43
46
|
};
|
|
44
47
|
return [newState, update];
|
package/lib/stream.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.mjs","sourceRoot":"","sources":["../src/lib/stream.ts"],"names":[],"mappings":"OACO,EAAoB,qBAAqB,EAAE;AAkBlD,MAAM,UAAU,OAAO,CAAC,KAAmB,EAAE,MAAqB;IAChE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO;YAEP,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"stream.mjs","sourceRoot":"","sources":["../src/lib/stream.ts"],"names":[],"mappings":"OACO,EAAoB,qBAAqB,EAAE;AAkBlD,MAAM,UAAU,OAAO,CAAC,KAAmB,EAAE,MAAqB;IAChE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO;YAEP,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;gBACtD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;gBAEpD,MAAM,KAAK,GAAiB;oBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;oBACxB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;oBAClC,OAAO,EAAE,OAAO;oBAChB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;oBAC1B,UAAU,EAAE,UAAU;iBACvB,CAAC;gBAEF,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;YAED,SAAS;YAET,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;YAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;YAEhE,MAAM,KAAK,GAAmB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAE/D,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAA8B;gBAC1C,GAAG,KAAK;gBACR,OAAO;gBACP,KAAK;gBACL,UAAU;aACX,CAAC;YAEF,UAAU;YAEV,IACE,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC;gBAC1C,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBACnC,KAAK,CAAC,UAAU,IAAI,UAAU,EAC9B,CAAC;gBACD,MAAM,MAAM,GAAiB;oBAC3B,GAAG,MAAM,CAAC,MAAM;oBAChB,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,OAAO,EAAE;wBACP,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO;wBACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;qBAC1B;oBACD,UAAU,EAAE,QAAQ,CAAC,UAAU;iBAChC,CAAC;gBAEF,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC;YAED,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD;YACE,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const zWebhookTimestamp: z.ZodISODateTime;
|
|
3
|
+
export declare const zWebhookTestPayload: z.ZodObject<{
|
|
4
|
+
test: z.ZodLiteral<"ok">;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
export type WebhookTestPayload = z.infer<typeof zWebhookTestPayload>;
|
|
7
|
+
export declare const zWebhookTest: z.ZodObject<{
|
|
8
|
+
type: z.ZodLiteral<"test">;
|
|
9
|
+
timestamp: z.ZodISODateTime;
|
|
10
|
+
payload: z.ZodObject<{
|
|
11
|
+
test: z.ZodLiteral<"ok">;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
export declare const zWebhookAgentTaskStatusUpdatePayloadMetadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
15
|
+
export declare const zWebhookAgentTaskStatusUpdatePayloadStatus: z.ZodLiteral<"started" | "paused" | "finished" | "stopped" | "initializing">;
|
|
16
|
+
export declare const zWebhookAgentTaskStatusUpdatePayload: z.ZodObject<{
|
|
17
|
+
session_id: z.ZodString;
|
|
18
|
+
task_id: z.ZodString;
|
|
19
|
+
status: z.ZodLiteral<"started" | "paused" | "finished" | "stopped" | "initializing">;
|
|
20
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export type WebhookAgentTaskStatusUpdatePayload = z.infer<typeof zWebhookAgentTaskStatusUpdatePayload>;
|
|
23
|
+
export declare const zWebhookAgentTaskStatusUpdate: z.ZodObject<{
|
|
24
|
+
type: z.ZodLiteral<"agent.task.status_update">;
|
|
25
|
+
timestamp: z.ZodISODateTime;
|
|
26
|
+
payload: z.ZodObject<{
|
|
27
|
+
session_id: z.ZodString;
|
|
28
|
+
task_id: z.ZodString;
|
|
29
|
+
status: z.ZodLiteral<"started" | "paused" | "finished" | "stopped" | "initializing">;
|
|
30
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export declare const zWebhookSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
34
|
+
type: z.ZodLiteral<"test">;
|
|
35
|
+
timestamp: z.ZodISODateTime;
|
|
36
|
+
payload: z.ZodObject<{
|
|
37
|
+
test: z.ZodLiteral<"ok">;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
40
|
+
type: z.ZodLiteral<"agent.task.status_update">;
|
|
41
|
+
timestamp: z.ZodISODateTime;
|
|
42
|
+
payload: z.ZodObject<{
|
|
43
|
+
session_id: z.ZodString;
|
|
44
|
+
task_id: z.ZodString;
|
|
45
|
+
status: z.ZodLiteral<"started" | "paused" | "finished" | "stopped" | "initializing">;
|
|
46
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
47
|
+
}, z.core.$strip>;
|
|
48
|
+
}, z.core.$strip>], "type">;
|
|
49
|
+
export type Webhook = z.infer<typeof zWebhookSchema>;
|
|
50
|
+
/**
|
|
51
|
+
* Utility function that validates the received Webhook event/
|
|
52
|
+
*/
|
|
53
|
+
export declare function verifyWebhookEventSignature(evt: {
|
|
54
|
+
evt: string;
|
|
55
|
+
signature: string;
|
|
56
|
+
timestamp: string;
|
|
57
|
+
}, cfg: {
|
|
58
|
+
secret: string;
|
|
59
|
+
}): Promise<{
|
|
60
|
+
ok: true;
|
|
61
|
+
event: Webhook;
|
|
62
|
+
} | {
|
|
63
|
+
ok: false;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* Creates a webhook signature for the given payload, timestamp, and secret.
|
|
67
|
+
*/
|
|
68
|
+
export declare function createWebhookSignature({ payload, timestamp, secret, }: {
|
|
69
|
+
payload: unknown;
|
|
70
|
+
timestamp: string;
|
|
71
|
+
secret: string;
|
|
72
|
+
}): string;
|
|
73
|
+
//# sourceMappingURL=webhooks.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.mts","sourceRoot":"","sources":["../src/lib/webhooks.ts"],"names":[],"mappings":"OACO,EAAE,CAAC,EAAE,MAAM,KAAK;AAOvB,eAAO,MAAM,iBAAiB,kBAAgD,CAAC;AAI/E,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE,eAAO,MAAM,YAAY;;;;;;iBAIvB,CAAC;AAIH,eAAO,MAAM,4CAA4C,uDAA+C,CAAC;AAEzG,eAAO,MAAM,0CAA0C,8EAMrD,CAAC;AAEH,eAAO,MAAM,oCAAoC;;;;;iBAK/C,CAAC;AAEH,MAAM,MAAM,mCAAmC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAEvG,eAAO,MAAM,6BAA6B;;;;;;;;;iBAIxC,CAAC;AAIH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;2BAIzB,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAIrD;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GACtB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC,CAwBvD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,SAAS,EACT,MAAM,GACP,EAAE;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAOT"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const zWebhookTimestamp: z.ZodISODateTime;
|
|
3
|
+
export declare const zWebhookTestPayload: z.ZodObject<{
|
|
4
|
+
test: z.ZodLiteral<"ok">;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
export type WebhookTestPayload = z.infer<typeof zWebhookTestPayload>;
|
|
7
|
+
export declare const zWebhookTest: z.ZodObject<{
|
|
8
|
+
type: z.ZodLiteral<"test">;
|
|
9
|
+
timestamp: z.ZodISODateTime;
|
|
10
|
+
payload: z.ZodObject<{
|
|
11
|
+
test: z.ZodLiteral<"ok">;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
export declare const zWebhookAgentTaskStatusUpdatePayloadMetadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
15
|
+
export declare const zWebhookAgentTaskStatusUpdatePayloadStatus: z.ZodLiteral<"started" | "paused" | "finished" | "stopped" | "initializing">;
|
|
16
|
+
export declare const zWebhookAgentTaskStatusUpdatePayload: z.ZodObject<{
|
|
17
|
+
session_id: z.ZodString;
|
|
18
|
+
task_id: z.ZodString;
|
|
19
|
+
status: z.ZodLiteral<"started" | "paused" | "finished" | "stopped" | "initializing">;
|
|
20
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export type WebhookAgentTaskStatusUpdatePayload = z.infer<typeof zWebhookAgentTaskStatusUpdatePayload>;
|
|
23
|
+
export declare const zWebhookAgentTaskStatusUpdate: z.ZodObject<{
|
|
24
|
+
type: z.ZodLiteral<"agent.task.status_update">;
|
|
25
|
+
timestamp: z.ZodISODateTime;
|
|
26
|
+
payload: z.ZodObject<{
|
|
27
|
+
session_id: z.ZodString;
|
|
28
|
+
task_id: z.ZodString;
|
|
29
|
+
status: z.ZodLiteral<"started" | "paused" | "finished" | "stopped" | "initializing">;
|
|
30
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export declare const zWebhookSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
34
|
+
type: z.ZodLiteral<"test">;
|
|
35
|
+
timestamp: z.ZodISODateTime;
|
|
36
|
+
payload: z.ZodObject<{
|
|
37
|
+
test: z.ZodLiteral<"ok">;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
40
|
+
type: z.ZodLiteral<"agent.task.status_update">;
|
|
41
|
+
timestamp: z.ZodISODateTime;
|
|
42
|
+
payload: z.ZodObject<{
|
|
43
|
+
session_id: z.ZodString;
|
|
44
|
+
task_id: z.ZodString;
|
|
45
|
+
status: z.ZodLiteral<"started" | "paused" | "finished" | "stopped" | "initializing">;
|
|
46
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
47
|
+
}, z.core.$strip>;
|
|
48
|
+
}, z.core.$strip>], "type">;
|
|
49
|
+
export type Webhook = z.infer<typeof zWebhookSchema>;
|
|
50
|
+
/**
|
|
51
|
+
* Utility function that validates the received Webhook event/
|
|
52
|
+
*/
|
|
53
|
+
export declare function verifyWebhookEventSignature(evt: {
|
|
54
|
+
evt: string;
|
|
55
|
+
signature: string;
|
|
56
|
+
timestamp: string;
|
|
57
|
+
}, cfg: {
|
|
58
|
+
secret: string;
|
|
59
|
+
}): Promise<{
|
|
60
|
+
ok: true;
|
|
61
|
+
event: Webhook;
|
|
62
|
+
} | {
|
|
63
|
+
ok: false;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* Creates a webhook signature for the given payload, timestamp, and secret.
|
|
67
|
+
*/
|
|
68
|
+
export declare function createWebhookSignature({ payload, timestamp, secret, }: {
|
|
69
|
+
payload: unknown;
|
|
70
|
+
timestamp: string;
|
|
71
|
+
secret: string;
|
|
72
|
+
}): string;
|
|
73
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/lib/webhooks.ts"],"names":[],"mappings":"OACO,EAAE,CAAC,EAAE,MAAM,KAAK;AAOvB,eAAO,MAAM,iBAAiB,kBAAgD,CAAC;AAI/E,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE,eAAO,MAAM,YAAY;;;;;;iBAIvB,CAAC;AAIH,eAAO,MAAM,4CAA4C,uDAA+C,CAAC;AAEzG,eAAO,MAAM,0CAA0C,8EAMrD,CAAC;AAEH,eAAO,MAAM,oCAAoC;;;;;iBAK/C,CAAC;AAEH,MAAM,MAAM,mCAAmC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAEvG,eAAO,MAAM,6BAA6B;;;;;;;;;iBAIxC,CAAC;AAIH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;2BAIzB,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAIrD;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GACtB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC,CAwBvD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,SAAS,EACT,MAAM,GACP,EAAE;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAOT"}
|
package/lib/webhooks.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.zWebhookSchema = exports.zWebhookAgentTaskStatusUpdate = exports.zWebhookAgentTaskStatusUpdatePayload = exports.zWebhookAgentTaskStatusUpdatePayloadStatus = exports.zWebhookAgentTaskStatusUpdatePayloadMetadata = exports.zWebhookTest = exports.zWebhookTestPayload = exports.zWebhookTimestamp = void 0;
|
|
4
|
+
exports.verifyWebhookEventSignature = verifyWebhookEventSignature;
|
|
5
|
+
exports.createWebhookSignature = createWebhookSignature;
|
|
6
|
+
const tslib_1 = require("../internal/tslib.js");
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const fast_json_stable_stringify_1 = tslib_1.__importDefault(require("fast-json-stable-stringify"));
|
|
10
|
+
// https://docs.browser-use.com/cloud/webhooks
|
|
11
|
+
//
|
|
12
|
+
exports.zWebhookTimestamp = zod_1.z.iso.datetime({ offset: true, local: true });
|
|
13
|
+
// test
|
|
14
|
+
exports.zWebhookTestPayload = zod_1.z.object({
|
|
15
|
+
test: zod_1.z.literal('ok'),
|
|
16
|
+
});
|
|
17
|
+
exports.zWebhookTest = zod_1.z.object({
|
|
18
|
+
type: zod_1.z.literal('test'),
|
|
19
|
+
timestamp: zod_1.z.iso.datetime({ offset: true }),
|
|
20
|
+
payload: exports.zWebhookTestPayload,
|
|
21
|
+
});
|
|
22
|
+
// agent.task.status_update
|
|
23
|
+
exports.zWebhookAgentTaskStatusUpdatePayloadMetadata = zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional();
|
|
24
|
+
exports.zWebhookAgentTaskStatusUpdatePayloadStatus = zod_1.z.literal([
|
|
25
|
+
'initializing',
|
|
26
|
+
'started',
|
|
27
|
+
'paused',
|
|
28
|
+
'stopped',
|
|
29
|
+
'finished',
|
|
30
|
+
]);
|
|
31
|
+
exports.zWebhookAgentTaskStatusUpdatePayload = zod_1.z.object({
|
|
32
|
+
session_id: zod_1.z.string(),
|
|
33
|
+
task_id: zod_1.z.string(),
|
|
34
|
+
status: exports.zWebhookAgentTaskStatusUpdatePayloadStatus,
|
|
35
|
+
metadata: exports.zWebhookAgentTaskStatusUpdatePayloadMetadata,
|
|
36
|
+
});
|
|
37
|
+
exports.zWebhookAgentTaskStatusUpdate = zod_1.z.object({
|
|
38
|
+
type: zod_1.z.literal('agent.task.status_update'),
|
|
39
|
+
timestamp: exports.zWebhookTimestamp,
|
|
40
|
+
payload: exports.zWebhookAgentTaskStatusUpdatePayload,
|
|
41
|
+
});
|
|
42
|
+
//
|
|
43
|
+
exports.zWebhookSchema = zod_1.z.discriminatedUnion('type', [
|
|
44
|
+
//
|
|
45
|
+
exports.zWebhookTest,
|
|
46
|
+
exports.zWebhookAgentTaskStatusUpdate,
|
|
47
|
+
]);
|
|
48
|
+
// Signature
|
|
49
|
+
/**
|
|
50
|
+
* Utility function that validates the received Webhook event/
|
|
51
|
+
*/
|
|
52
|
+
async function verifyWebhookEventSignature(evt, cfg) {
|
|
53
|
+
try {
|
|
54
|
+
const event = await exports.zWebhookSchema.safeParseAsync(JSON.parse(evt.evt));
|
|
55
|
+
if (event.success === false) {
|
|
56
|
+
return { ok: false };
|
|
57
|
+
}
|
|
58
|
+
const signature = createWebhookSignature({
|
|
59
|
+
payload: event.data.payload,
|
|
60
|
+
timestamp: evt.timestamp,
|
|
61
|
+
secret: cfg.secret,
|
|
62
|
+
});
|
|
63
|
+
// Compare signatures using timing-safe comparison
|
|
64
|
+
if (evt.signature !== signature) {
|
|
65
|
+
return { ok: false };
|
|
66
|
+
}
|
|
67
|
+
return { ok: true, event: event.data };
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
console.error(err);
|
|
71
|
+
return { ok: false };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a webhook signature for the given payload, timestamp, and secret.
|
|
76
|
+
*/
|
|
77
|
+
function createWebhookSignature({ payload, timestamp, secret, }) {
|
|
78
|
+
const dump = (0, fast_json_stable_stringify_1.default)(payload);
|
|
79
|
+
const message = `${timestamp}.${dump}`;
|
|
80
|
+
const hmac = (0, crypto_1.createHmac)('sha256', secret);
|
|
81
|
+
hmac.update(message);
|
|
82
|
+
return hmac.digest('hex');
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/lib/webhooks.ts"],"names":[],"mappings":"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"}
|