@browserbasehq/convex-stagehand 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +477 -0
  3. package/dist/client/index.d.ts +258 -0
  4. package/dist/client/index.d.ts.map +1 -0
  5. package/dist/client/index.js +216 -0
  6. package/dist/client/index.js.map +1 -0
  7. package/dist/component/_generated/api.d.ts +36 -0
  8. package/dist/component/_generated/api.d.ts.map +1 -0
  9. package/dist/component/_generated/api.js +31 -0
  10. package/dist/component/_generated/api.js.map +1 -0
  11. package/dist/component/_generated/component.d.ts +24 -0
  12. package/dist/component/_generated/component.d.ts.map +1 -0
  13. package/dist/component/_generated/component.js +11 -0
  14. package/dist/component/_generated/component.js.map +1 -0
  15. package/dist/component/_generated/dataModel.d.ts +15 -0
  16. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  17. package/dist/component/_generated/dataModel.js +11 -0
  18. package/dist/component/_generated/dataModel.js.map +1 -0
  19. package/dist/component/_generated/server.d.ts +121 -0
  20. package/dist/component/_generated/server.d.ts.map +1 -0
  21. package/dist/component/_generated/server.js +78 -0
  22. package/dist/component/_generated/server.js.map +1 -0
  23. package/dist/component/api.d.ts +90 -0
  24. package/dist/component/api.d.ts.map +1 -0
  25. package/dist/component/api.js +112 -0
  26. package/dist/component/api.js.map +1 -0
  27. package/dist/component/convex.config.d.ts +3 -0
  28. package/dist/component/convex.config.d.ts.map +1 -0
  29. package/dist/component/convex.config.js +3 -0
  30. package/dist/component/convex.config.js.map +1 -0
  31. package/dist/component/lib.d.ts +62 -0
  32. package/dist/component/lib.d.ts.map +1 -0
  33. package/dist/component/lib.js +356 -0
  34. package/dist/component/lib.js.map +1 -0
  35. package/dist/component/schema.d.ts +23 -0
  36. package/dist/component/schema.d.ts.map +1 -0
  37. package/dist/component/schema.js +14 -0
  38. package/dist/component/schema.js.map +1 -0
  39. package/dist/test.d.ts +48 -0
  40. package/dist/test.d.ts.map +1 -0
  41. package/dist/test.js +25 -0
  42. package/dist/test.js.map +1 -0
  43. package/package.json +87 -0
  44. package/src/client/index.ts +348 -0
  45. package/src/component/README.md +90 -0
  46. package/src/component/_generated/api.ts +52 -0
  47. package/src/component/_generated/component.ts +26 -0
  48. package/src/component/_generated/dataModel.ts +17 -0
  49. package/src/component/_generated/server.ts +156 -0
  50. package/src/component/api.ts +243 -0
  51. package/src/component/convex.config.ts +3 -0
  52. package/src/component/lib.ts +416 -0
  53. package/src/component/schema.ts +23 -0
  54. package/src/component/tsconfig.json +25 -0
  55. package/src/test.ts +33 -0
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Stagehand Component Library
3
+ *
4
+ * AI-powered browser automation actions using the Stagehand REST API.
5
+ * Supports both automatic session management and manual session control.
6
+ */
7
+ import { action } from "./_generated/server.js";
8
+ import { v } from "convex/values";
9
+ import * as api from "./api.js";
10
+ const observedActionValidator = v.object({
11
+ description: v.string(),
12
+ selector: v.string(),
13
+ method: v.string(),
14
+ arguments: v.optional(v.array(v.string())),
15
+ });
16
+ const waitUntilValidator = v.union(v.literal("load"), v.literal("domcontentloaded"), v.literal("networkidle"));
17
+ const agentActionValidator = v.object({
18
+ type: v.string(),
19
+ action: v.optional(v.string()),
20
+ reasoning: v.optional(v.string()),
21
+ timeMs: v.optional(v.number()),
22
+ });
23
+ /**
24
+ * Start a new browser session.
25
+ * Returns session info including cdpUrl for direct Playwright/Puppeteer connection.
26
+ */
27
+ export const startSession = action({
28
+ args: {
29
+ browserbaseApiKey: v.string(),
30
+ browserbaseProjectId: v.string(),
31
+ modelApiKey: v.string(),
32
+ modelName: v.optional(v.string()),
33
+ url: v.string(),
34
+ browserbaseSessionId: v.optional(v.string()),
35
+ options: v.optional(v.object({
36
+ timeout: v.optional(v.number()),
37
+ waitUntil: v.optional(waitUntilValidator),
38
+ domSettleTimeoutMs: v.optional(v.number()),
39
+ selfHeal: v.optional(v.boolean()),
40
+ systemPrompt: v.optional(v.string()),
41
+ })),
42
+ },
43
+ returns: v.object({
44
+ sessionId: v.string(),
45
+ browserbaseSessionId: v.optional(v.string()),
46
+ cdpUrl: v.optional(v.string()),
47
+ }),
48
+ handler: async (_ctx, args) => {
49
+ const config = {
50
+ browserbaseApiKey: args.browserbaseApiKey,
51
+ browserbaseProjectId: args.browserbaseProjectId,
52
+ modelApiKey: args.modelApiKey,
53
+ modelName: args.modelName,
54
+ };
55
+ const session = await api.startSession(config, {
56
+ browserbaseSessionId: args.browserbaseSessionId,
57
+ domSettleTimeoutMs: args.options?.domSettleTimeoutMs,
58
+ selfHeal: args.options?.selfHeal,
59
+ systemPrompt: args.options?.systemPrompt,
60
+ });
61
+ try {
62
+ await api.navigate(session.sessionId, args.url, config, {
63
+ waitUntil: args.options?.waitUntil,
64
+ timeout: args.options?.timeout,
65
+ });
66
+ return {
67
+ sessionId: session.sessionId,
68
+ browserbaseSessionId: session.browserbaseSessionId,
69
+ cdpUrl: session.cdpUrl,
70
+ };
71
+ }
72
+ catch (error) {
73
+ await api.endSession(session.sessionId, config);
74
+ throw error;
75
+ }
76
+ },
77
+ });
78
+ /**
79
+ * End a browser session.
80
+ */
81
+ export const endSession = action({
82
+ args: {
83
+ browserbaseApiKey: v.string(),
84
+ browserbaseProjectId: v.string(),
85
+ modelApiKey: v.string(),
86
+ sessionId: v.string(),
87
+ },
88
+ returns: v.object({ success: v.boolean() }),
89
+ handler: async (_ctx, args) => {
90
+ const config = {
91
+ browserbaseApiKey: args.browserbaseApiKey,
92
+ browserbaseProjectId: args.browserbaseProjectId,
93
+ modelApiKey: args.modelApiKey,
94
+ };
95
+ await api.endSession(args.sessionId, config);
96
+ return { success: true };
97
+ },
98
+ });
99
+ /**
100
+ * Extract structured data from a web page using AI.
101
+ * If sessionId is provided, uses existing session (doesn't end it).
102
+ * Otherwise, handles full session lifecycle: start -> navigate -> extract -> end
103
+ */
104
+ export const extract = action({
105
+ args: {
106
+ browserbaseApiKey: v.string(),
107
+ browserbaseProjectId: v.string(),
108
+ modelApiKey: v.string(),
109
+ modelName: v.optional(v.string()),
110
+ sessionId: v.optional(v.string()),
111
+ url: v.optional(v.string()),
112
+ instruction: v.string(),
113
+ schema: v.any(),
114
+ options: v.optional(v.object({
115
+ timeout: v.optional(v.number()),
116
+ waitUntil: v.optional(waitUntilValidator),
117
+ })),
118
+ },
119
+ returns: v.any(),
120
+ handler: async (_ctx, args) => {
121
+ if (!args.sessionId && !args.url) {
122
+ throw new Error("Either sessionId or url must be provided");
123
+ }
124
+ const config = {
125
+ browserbaseApiKey: args.browserbaseApiKey,
126
+ browserbaseProjectId: args.browserbaseProjectId,
127
+ modelApiKey: args.modelApiKey,
128
+ modelName: args.modelName,
129
+ };
130
+ const ownSession = !args.sessionId;
131
+ let sessionId = args.sessionId;
132
+ if (ownSession) {
133
+ const session = await api.startSession(config);
134
+ sessionId = session.sessionId;
135
+ }
136
+ try {
137
+ if (ownSession && args.url) {
138
+ await api.navigate(sessionId, args.url, config, {
139
+ waitUntil: args.options?.waitUntil,
140
+ timeout: args.options?.timeout,
141
+ });
142
+ }
143
+ const result = await api.extract(sessionId, args.instruction, args.schema, config);
144
+ if (ownSession) {
145
+ await api.endSession(sessionId, config);
146
+ }
147
+ return result.result;
148
+ }
149
+ catch (error) {
150
+ if (ownSession) {
151
+ await api.endSession(sessionId, config);
152
+ }
153
+ throw error;
154
+ }
155
+ },
156
+ });
157
+ /**
158
+ * Execute browser actions using natural language instructions.
159
+ * If sessionId is provided, uses existing session (doesn't end it).
160
+ * Otherwise, handles full session lifecycle: start -> navigate -> act -> end
161
+ */
162
+ export const act = action({
163
+ args: {
164
+ browserbaseApiKey: v.string(),
165
+ browserbaseProjectId: v.string(),
166
+ modelApiKey: v.string(),
167
+ modelName: v.optional(v.string()),
168
+ sessionId: v.optional(v.string()),
169
+ url: v.optional(v.string()),
170
+ action: v.string(),
171
+ options: v.optional(v.object({
172
+ timeout: v.optional(v.number()),
173
+ waitUntil: v.optional(waitUntilValidator),
174
+ })),
175
+ },
176
+ returns: v.object({
177
+ success: v.boolean(),
178
+ message: v.string(),
179
+ actionDescription: v.string(),
180
+ }),
181
+ handler: async (_ctx, args) => {
182
+ if (!args.sessionId && !args.url) {
183
+ throw new Error("Either sessionId or url must be provided");
184
+ }
185
+ const config = {
186
+ browserbaseApiKey: args.browserbaseApiKey,
187
+ browserbaseProjectId: args.browserbaseProjectId,
188
+ modelApiKey: args.modelApiKey,
189
+ modelName: args.modelName,
190
+ };
191
+ const ownSession = !args.sessionId;
192
+ let sessionId = args.sessionId;
193
+ if (ownSession) {
194
+ const session = await api.startSession(config);
195
+ sessionId = session.sessionId;
196
+ }
197
+ try {
198
+ if (ownSession && args.url) {
199
+ await api.navigate(sessionId, args.url, config, {
200
+ waitUntil: args.options?.waitUntil,
201
+ timeout: args.options?.timeout,
202
+ });
203
+ }
204
+ const result = await api.act(sessionId, args.action, config);
205
+ if (ownSession) {
206
+ await api.endSession(sessionId, config);
207
+ }
208
+ return {
209
+ success: result.result.success,
210
+ message: result.result.message,
211
+ actionDescription: result.result.actionDescription,
212
+ };
213
+ }
214
+ catch (error) {
215
+ if (ownSession) {
216
+ await api.endSession(sessionId, config);
217
+ }
218
+ throw error;
219
+ }
220
+ },
221
+ });
222
+ /**
223
+ * Find available actions on a web page matching an instruction.
224
+ * If sessionId is provided, uses existing session (doesn't end it).
225
+ * Otherwise, handles full session lifecycle: start -> navigate -> observe -> end
226
+ */
227
+ export const observe = action({
228
+ args: {
229
+ browserbaseApiKey: v.string(),
230
+ browserbaseProjectId: v.string(),
231
+ modelApiKey: v.string(),
232
+ modelName: v.optional(v.string()),
233
+ sessionId: v.optional(v.string()),
234
+ url: v.optional(v.string()),
235
+ instruction: v.string(),
236
+ options: v.optional(v.object({
237
+ timeout: v.optional(v.number()),
238
+ waitUntil: v.optional(waitUntilValidator),
239
+ })),
240
+ },
241
+ returns: v.array(observedActionValidator),
242
+ handler: async (_ctx, args) => {
243
+ if (!args.sessionId && !args.url) {
244
+ throw new Error("Either sessionId or url must be provided");
245
+ }
246
+ const config = {
247
+ browserbaseApiKey: args.browserbaseApiKey,
248
+ browserbaseProjectId: args.browserbaseProjectId,
249
+ modelApiKey: args.modelApiKey,
250
+ modelName: args.modelName,
251
+ };
252
+ const ownSession = !args.sessionId;
253
+ let sessionId = args.sessionId;
254
+ if (ownSession) {
255
+ const session = await api.startSession(config);
256
+ sessionId = session.sessionId;
257
+ }
258
+ try {
259
+ if (ownSession && args.url) {
260
+ await api.navigate(sessionId, args.url, config, {
261
+ waitUntil: args.options?.waitUntil,
262
+ timeout: args.options?.timeout,
263
+ });
264
+ }
265
+ const result = await api.observe(sessionId, args.instruction, config);
266
+ if (ownSession) {
267
+ await api.endSession(sessionId, config);
268
+ }
269
+ return result.result.map((action) => ({
270
+ description: action.description,
271
+ selector: action.selector,
272
+ method: action.method,
273
+ arguments: action.arguments,
274
+ }));
275
+ }
276
+ catch (error) {
277
+ if (ownSession) {
278
+ await api.endSession(sessionId, config);
279
+ }
280
+ throw error;
281
+ }
282
+ },
283
+ });
284
+ /**
285
+ * Execute autonomous multi-step browser automation using an AI agent.
286
+ * The agent interprets the instruction and decides what actions to take.
287
+ * If sessionId is provided, uses existing session (doesn't end it).
288
+ * Otherwise, handles full session lifecycle.
289
+ */
290
+ export const agent = action({
291
+ args: {
292
+ browserbaseApiKey: v.string(),
293
+ browserbaseProjectId: v.string(),
294
+ modelApiKey: v.string(),
295
+ modelName: v.optional(v.string()),
296
+ sessionId: v.optional(v.string()),
297
+ url: v.optional(v.string()),
298
+ instruction: v.string(),
299
+ options: v.optional(v.object({
300
+ cua: v.optional(v.boolean()),
301
+ maxSteps: v.optional(v.number()),
302
+ systemPrompt: v.optional(v.string()),
303
+ timeout: v.optional(v.number()),
304
+ waitUntil: v.optional(waitUntilValidator),
305
+ })),
306
+ },
307
+ returns: v.object({
308
+ actions: v.array(agentActionValidator),
309
+ completed: v.boolean(),
310
+ message: v.string(),
311
+ success: v.boolean(),
312
+ }),
313
+ handler: async (_ctx, args) => {
314
+ if (!args.sessionId && !args.url) {
315
+ throw new Error("Either sessionId or url must be provided");
316
+ }
317
+ const config = {
318
+ browserbaseApiKey: args.browserbaseApiKey,
319
+ browserbaseProjectId: args.browserbaseProjectId,
320
+ modelApiKey: args.modelApiKey,
321
+ modelName: args.modelName,
322
+ };
323
+ const ownSession = !args.sessionId;
324
+ let sessionId = args.sessionId;
325
+ if (ownSession) {
326
+ const session = await api.startSession(config);
327
+ sessionId = session.sessionId;
328
+ }
329
+ try {
330
+ if (ownSession && args.url) {
331
+ await api.navigate(sessionId, args.url, config, {
332
+ waitUntil: args.options?.waitUntil,
333
+ timeout: args.options?.timeout,
334
+ });
335
+ }
336
+ const result = await api.agentExecute(sessionId, {
337
+ cua: args.options?.cua,
338
+ systemPrompt: args.options?.systemPrompt,
339
+ }, {
340
+ instruction: args.instruction,
341
+ maxSteps: args.options?.maxSteps,
342
+ }, config);
343
+ if (ownSession) {
344
+ await api.endSession(sessionId, config);
345
+ }
346
+ return result.result;
347
+ }
348
+ catch (error) {
349
+ if (ownSession) {
350
+ await api.endSession(sessionId, config);
351
+ }
352
+ throw error;
353
+ }
354
+ },
355
+ });
356
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ declare const _default: import("convex/server").SchemaDefinition<{
2
+ sessions: import("convex/server").TableDefinition<import("convex/values").VObject<{
3
+ endedAt?: number | undefined;
4
+ error?: string | undefined;
5
+ sessionId: string;
6
+ startedAt: number;
7
+ status: "active" | "completed" | "error";
8
+ operation: "extract" | "act" | "observe" | "workflow";
9
+ url: string;
10
+ }, {
11
+ sessionId: import("convex/values").VString<string, "required">;
12
+ startedAt: import("convex/values").VFloat64<number, "required">;
13
+ endedAt: import("convex/values").VFloat64<number | undefined, "optional">;
14
+ status: import("convex/values").VUnion<"active" | "completed" | "error", [import("convex/values").VLiteral<"active", "required">, import("convex/values").VLiteral<"completed", "required">, import("convex/values").VLiteral<"error", "required">], "required", never>;
15
+ operation: import("convex/values").VUnion<"extract" | "act" | "observe" | "workflow", [import("convex/values").VLiteral<"extract", "required">, import("convex/values").VLiteral<"act", "required">, import("convex/values").VLiteral<"observe", "required">, import("convex/values").VLiteral<"workflow", "required">], "required", never>;
16
+ url: import("convex/values").VString<string, "required">;
17
+ error: import("convex/values").VString<string | undefined, "optional">;
18
+ }, "required", "sessionId" | "startedAt" | "endedAt" | "status" | "error" | "operation" | "url">, {
19
+ by_sessionId: ["sessionId", "_creationTime"];
20
+ }, {}, {}>;
21
+ }, true>;
22
+ export default _default;
23
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAGA,wBAmBG"}
@@ -0,0 +1,14 @@
1
+ import { defineSchema, defineTable } from "convex/server";
2
+ import { v } from "convex/values";
3
+ export default defineSchema({
4
+ sessions: defineTable({
5
+ sessionId: v.string(),
6
+ startedAt: v.number(),
7
+ endedAt: v.optional(v.number()),
8
+ status: v.union(v.literal("active"), v.literal("completed"), v.literal("error")),
9
+ operation: v.union(v.literal("extract"), v.literal("act"), v.literal("observe"), v.literal("workflow")),
10
+ url: v.string(),
11
+ error: v.optional(v.string()),
12
+ }).index("by_sessionId", ["sessionId"]),
13
+ });
14
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,eAAe,YAAY,CAAC;IAC1B,QAAQ,EAAE,WAAW,CAAC;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EACtB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CACnB;QACD,SAAS,EAAE,CAAC,CAAC,KAAK,CAChB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAChB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CACtB;QACD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC9B,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,CAAC;CACxC,CAAC,CAAC"}
package/dist/test.d.ts ADDED
@@ -0,0 +1,48 @@
1
+ import type { TestConvex } from "convex-test";
2
+ import type { GenericSchema, SchemaDefinition } from "convex/server";
3
+ /**
4
+ * Register the Stagehand component with a test Convex instance.
5
+ *
6
+ * @param t - The test Convex instance from convexTest()
7
+ * @param name - The name of the component as registered in convex.config.ts (default: "stagehand")
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { convexTest } from "convex-test";
12
+ * import stagehandTest from "convex-stagehand/test";
13
+ *
14
+ * test("my test", async () => {
15
+ * const t = convexTest(schema, modules);
16
+ * stagehandTest.register(t, "stagehand");
17
+ * // ... run tests
18
+ * });
19
+ * ```
20
+ */
21
+ export declare function register(t: TestConvex<SchemaDefinition<GenericSchema, boolean>>, name?: string): void;
22
+ declare const _default: {
23
+ register: typeof register;
24
+ schema: SchemaDefinition<{
25
+ sessions: import("convex/server").TableDefinition<import("convex/values").VObject<{
26
+ endedAt?: number | undefined;
27
+ error?: string | undefined;
28
+ sessionId: string;
29
+ startedAt: number;
30
+ status: "active" | "completed" | "error";
31
+ operation: "extract" | "act" | "observe" | "workflow";
32
+ url: string;
33
+ }, {
34
+ sessionId: import("convex/values").VString<string, "required">;
35
+ startedAt: import("convex/values").VFloat64<number, "required">;
36
+ endedAt: import("convex/values").VFloat64<number | undefined, "optional">;
37
+ status: import("convex/values").VUnion<"active" | "completed" | "error", [import("convex/values").VLiteral<"active", "required">, import("convex/values").VLiteral<"completed", "required">, import("convex/values").VLiteral<"error", "required">], "required", never>;
38
+ operation: import("convex/values").VUnion<"extract" | "act" | "observe" | "workflow", [import("convex/values").VLiteral<"extract", "required">, import("convex/values").VLiteral<"act", "required">, import("convex/values").VLiteral<"observe", "required">, import("convex/values").VLiteral<"workflow", "required">], "required", never>;
39
+ url: import("convex/values").VString<string, "required">;
40
+ error: import("convex/values").VString<string | undefined, "optional">;
41
+ }, "required", "sessionId" | "startedAt" | "endedAt" | "status" | "error" | "operation" | "url">, {
42
+ by_sessionId: ["sessionId", "_creationTime"];
43
+ }, {}, {}>;
44
+ }, true>;
45
+ modules: Record<string, () => Promise<unknown>>;
46
+ };
47
+ export default _default;
48
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAKrE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CACtB,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,EACvD,IAAI,GAAE,MAAoB,QAG3B;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,wBAA6C"}
package/dist/test.js ADDED
@@ -0,0 +1,25 @@
1
+ import schema from "./component/schema.js";
2
+ const modules = import.meta.glob("./component/**/*.ts");
3
+ /**
4
+ * Register the Stagehand component with a test Convex instance.
5
+ *
6
+ * @param t - The test Convex instance from convexTest()
7
+ * @param name - The name of the component as registered in convex.config.ts (default: "stagehand")
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { convexTest } from "convex-test";
12
+ * import stagehandTest from "convex-stagehand/test";
13
+ *
14
+ * test("my test", async () => {
15
+ * const t = convexTest(schema, modules);
16
+ * stagehandTest.register(t, "stagehand");
17
+ * // ... run tests
18
+ * });
19
+ * ```
20
+ */
21
+ export function register(t, name = "stagehand") {
22
+ t.registerComponent(name, schema, modules);
23
+ }
24
+ export default { register, schema, modules };
25
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAE3C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAExD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,QAAQ,CACtB,CAAuD,EACvD,OAAe,WAAW;IAE1B,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@browserbasehq/convex-stagehand",
3
+ "version": "0.0.1",
4
+ "description": "Convex component for AI-powered browser automation with Stagehand",
5
+ "type": "module",
6
+ "main": "./dist/client/index.js",
7
+ "types": "./dist/client/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/client/index.d.ts",
11
+ "default": "./dist/client/index.js"
12
+ },
13
+ "./convex.config": {
14
+ "types": "./dist/component/convex.config.d.ts",
15
+ "default": "./dist/component/convex.config.js"
16
+ },
17
+ "./_generated/component": {
18
+ "types": "./dist/component/_generated/component.d.ts",
19
+ "default": "./dist/component/_generated/component.js"
20
+ },
21
+ "./test": {
22
+ "types": "./dist/test.d.ts",
23
+ "default": "./dist/test.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "src"
29
+ ],
30
+ "scripts": {
31
+ "build": "npm run build:esm",
32
+ "build:esm": "tsc --project ./tsconfig.build.json",
33
+ "build:codegen": "npx convex codegen --component-dir ./src/component && npm run build:esm",
34
+ "build:clean": "rm -rf dist && npm run build:codegen",
35
+ "dev": "npm-run-all --parallel 'dev:*'",
36
+ "dev:backend": "npx convex dev --typecheck-components",
37
+ "dev:build": "chokidar 'src/**/*.ts' --initial -c 'npm run build:codegen'",
38
+ "typecheck": "tsc --noEmit && cd example && tsc --noEmit",
39
+ "lint": "eslint .",
40
+ "test": "vitest run --typecheck",
41
+ "test:watch": "vitest --typecheck",
42
+ "changeset": "changeset",
43
+ "version": "changeset version",
44
+ "release": "npm run build && changeset publish"
45
+ },
46
+ "keywords": [
47
+ "convex",
48
+ "component",
49
+ "stagehand",
50
+ "browserbase",
51
+ "browser-automation",
52
+ "ai",
53
+ "web-scraping"
54
+ ],
55
+ "author": "Browserbase",
56
+ "license": "MIT",
57
+ "repository": {
58
+ "type": "git",
59
+ "url": "https://github.com/browserbase/convex-stagehand"
60
+ },
61
+ "publishConfig": {
62
+ "access": "public"
63
+ },
64
+ "dependencies": {
65
+ "zod-to-json-schema": "^3.23.0"
66
+ },
67
+ "peerDependencies": {
68
+ "convex": "^1.29.3",
69
+ "zod": "^3.23.0"
70
+ },
71
+ "devDependencies": {
72
+ "@changesets/changelog-github": "^0.5.0",
73
+ "@changesets/cli": "^2.27.9",
74
+ "@eslint/js": "^9.0.0",
75
+ "@types/node": "^20.10.0",
76
+ "chokidar-cli": "^3.0.0",
77
+ "convex": "^1.31.0",
78
+ "convex-test": "^0.0.40",
79
+ "eslint": "^9.0.0",
80
+ "npm-run-all": "^4.1.5",
81
+ "prettier": "^3.0.0",
82
+ "typescript": "^5.9.0",
83
+ "typescript-eslint": "^8.0.0",
84
+ "vitest": "^3.0.0",
85
+ "zod": "^3.23.0"
86
+ }
87
+ }