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.
Files changed (94) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/client.d.mts +2 -2
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +2 -2
  5. package/client.d.ts.map +1 -1
  6. package/client.js.map +1 -1
  7. package/client.mjs.map +1 -1
  8. package/internal/detect-platform.js +1 -1
  9. package/internal/detect-platform.js.map +1 -1
  10. package/internal/detect-platform.mjs +1 -1
  11. package/internal/detect-platform.mjs.map +1 -1
  12. package/lib/bin/auth.d.mts +10 -0
  13. package/lib/bin/auth.d.mts.map +1 -0
  14. package/lib/bin/auth.d.ts +10 -0
  15. package/lib/bin/auth.d.ts.map +1 -0
  16. package/lib/bin/auth.js +52 -0
  17. package/lib/bin/auth.js.map +1 -0
  18. package/lib/bin/auth.mjs +47 -0
  19. package/lib/bin/auth.mjs.map +1 -0
  20. package/lib/bin/cli.d.mts +3 -0
  21. package/lib/bin/cli.d.mts.map +1 -0
  22. package/lib/bin/cli.d.ts +3 -0
  23. package/lib/bin/cli.d.ts.map +1 -0
  24. package/lib/bin/cli.js +12 -0
  25. package/lib/bin/cli.js.map +1 -0
  26. package/lib/bin/cli.mjs +10 -0
  27. package/lib/bin/cli.mjs.map +1 -0
  28. package/lib/bin/commands/listen.d.mts +3 -0
  29. package/lib/bin/commands/listen.d.mts.map +1 -0
  30. package/lib/bin/commands/listen.d.ts +3 -0
  31. package/lib/bin/commands/listen.d.ts.map +1 -0
  32. package/lib/bin/commands/listen.js +133 -0
  33. package/lib/bin/commands/listen.js.map +1 -0
  34. package/lib/bin/commands/listen.mjs +130 -0
  35. package/lib/bin/commands/listen.mjs.map +1 -0
  36. package/lib/stream.d.mts.map +1 -1
  37. package/lib/stream.d.ts.map +1 -1
  38. package/lib/stream.js +6 -3
  39. package/lib/stream.js.map +1 -1
  40. package/lib/stream.mjs +6 -3
  41. package/lib/stream.mjs.map +1 -1
  42. package/lib/webhooks.d.mts +73 -0
  43. package/lib/webhooks.d.mts.map +1 -0
  44. package/lib/webhooks.d.ts +73 -0
  45. package/lib/webhooks.d.ts.map +1 -0
  46. package/lib/webhooks.js +84 -0
  47. package/lib/webhooks.js.map +1 -0
  48. package/lib/webhooks.mjs +78 -0
  49. package/lib/webhooks.mjs.map +1 -0
  50. package/package.json +9 -2
  51. package/resources/index.d.mts +1 -1
  52. package/resources/index.d.mts.map +1 -1
  53. package/resources/index.d.ts +1 -1
  54. package/resources/index.d.ts.map +1 -1
  55. package/resources/index.js.map +1 -1
  56. package/resources/index.mjs.map +1 -1
  57. package/resources/sessions/index.d.mts +1 -1
  58. package/resources/sessions/index.d.mts.map +1 -1
  59. package/resources/sessions/index.d.ts +1 -1
  60. package/resources/sessions/index.d.ts.map +1 -1
  61. package/resources/sessions/index.js.map +1 -1
  62. package/resources/sessions/index.mjs.map +1 -1
  63. package/resources/sessions/sessions.d.mts +2 -8
  64. package/resources/sessions/sessions.d.mts.map +1 -1
  65. package/resources/sessions/sessions.d.ts +2 -8
  66. package/resources/sessions/sessions.d.ts.map +1 -1
  67. package/resources/sessions/sessions.js +2 -2
  68. package/resources/sessions/sessions.js.map +1 -1
  69. package/resources/sessions/sessions.mjs +2 -2
  70. package/resources/sessions/sessions.mjs.map +1 -1
  71. package/resources/tasks.d.mts +96 -65
  72. package/resources/tasks.d.mts.map +1 -1
  73. package/resources/tasks.d.ts +96 -65
  74. package/resources/tasks.d.ts.map +1 -1
  75. package/resources/tasks.js +5 -12
  76. package/resources/tasks.js.map +1 -1
  77. package/resources/tasks.mjs +5 -12
  78. package/resources/tasks.mjs.map +1 -1
  79. package/src/client.ts +2 -2
  80. package/src/internal/detect-platform.ts +1 -1
  81. package/src/lib/bin/auth.ts +63 -0
  82. package/src/lib/bin/cli.ts +11 -0
  83. package/src/lib/bin/commands/listen.ts +172 -0
  84. package/src/lib/stream.ts +6 -3
  85. package/src/lib/webhooks.ts +118 -0
  86. package/src/resources/index.ts +0 -1
  87. package/src/resources/sessions/index.ts +0 -1
  88. package/src/resources/sessions/sessions.ts +2 -16
  89. package/src/resources/tasks.ts +108 -73
  90. package/src/version.ts +1 -1
  91. package/version.d.mts +1 -1
  92. package/version.d.ts +1 -1
  93. package/version.js +1 -1
  94. 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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"}
@@ -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,CA+DhG"}
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"}
@@ -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,CA+DhG"}
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.sessionLiveUrl ?? null;
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.sessionLiveUrl ?? state.liveUrl;
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
- sessionLiveUrl: newState.liveUrl,
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,0BA+DC;AAjFD,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,cAAc,IAAI,IAAI,CAAC;gBACrD,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,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC;YAC9D,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,cAAc,EAAE,QAAQ,CAAC,OAAO;oBAChC,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"}
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.sessionLiveUrl ?? null;
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.sessionLiveUrl ?? state.liveUrl;
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
- sessionLiveUrl: newState.liveUrl,
41
+ session: {
42
+ ...action.status.session,
43
+ liveUrl: newState.liveUrl,
44
+ },
42
45
  doneOutput: newState.doneOutput,
43
46
  };
44
47
  return [newState, update];
@@ -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,cAAc,IAAI,IAAI,CAAC;gBACrD,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,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC;YAC9D,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,cAAc,EAAE,QAAQ,CAAC,OAAO;oBAChC,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"}
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"}
@@ -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":";;;AAkEA,kEA+BC;AAKD,wDAeC;;AArHD,mCAAoC;AACpC,6BAAwB;AACxB,oGAAmD;AAEnD,8CAA8C;AAE9C,EAAE;AAEW,QAAA,iBAAiB,GAAG,OAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAE/E,OAAO;AAEM,QAAA,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,IAAI,CAAC;CACtB,CAAC,CAAC;AAIU,QAAA,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvB,SAAS,EAAE,OAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC3C,OAAO,EAAE,2BAAmB;CAC7B,CAAC,CAAC;AAEH,2BAA2B;AAEd,QAAA,4CAA4C,GAAG,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE5F,QAAA,0CAA0C,GAAG,OAAC,CAAC,OAAO,CAAC;IAClE,cAAc;IACd,SAAS;IACT,QAAQ;IACR,SAAS;IACT,UAAU;CACX,CAAC,CAAC;AAEU,QAAA,oCAAoC,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3D,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,kDAA0C;IAClD,QAAQ,EAAE,oDAA4C;CACvD,CAAC,CAAC;AAIU,QAAA,6BAA6B,GAAG,OAAC,CAAC,MAAM,CAAC;IACpD,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC;IAC3C,SAAS,EAAE,yBAAiB;IAC5B,OAAO,EAAE,4CAAoC;CAC9C,CAAC,CAAC;AAEH,EAAE;AAEW,QAAA,cAAc,GAAG,OAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IACzD,EAAE;IACF,oBAAY;IACZ,qCAA6B;CAC9B,CAAC,CAAC;AAIH,YAAY;AAEZ;;GAEG;AACI,KAAK,UAAU,2BAA2B,CAC/C,GAIC,EACD,GAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,sBAAc,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvE,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,SAAS,GAAG,sBAAsB,CAAC;YACvC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO;YAC3B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC,CAAC;QAEH,kDAAkD;QAClD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,SAAS,EACT,MAAM,GAKP;IACC,MAAM,IAAI,GAAG,IAAA,oCAAS,EAAC,OAAO,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;IAEvC,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}