Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 84 additions & 3 deletions cmd/browsers.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@
Scroll(ctx context.Context, id string, body kernel.BrowserComputerScrollParams, opts ...option.RequestOption) (err error)
SetCursorVisibility(ctx context.Context, id string, body kernel.BrowserComputerSetCursorVisibilityParams, opts ...option.RequestOption) (res *kernel.BrowserComputerSetCursorVisibilityResponse, err error)
TypeText(ctx context.Context, id string, body kernel.BrowserComputerTypeTextParams, opts ...option.RequestOption) (err error)
ReadClipboard(ctx context.Context, id string, opts ...option.RequestOption) (res *kernel.BrowserComputerReadClipboardResponse, err error)

Check failure on line 105 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

undefined: kernel.BrowserComputerReadClipboardResponse
WriteClipboard(ctx context.Context, id string, body kernel.BrowserComputerWriteClipboardParams, opts ...option.RequestOption) (err error)

Check failure on line 106 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

undefined: kernel.BrowserComputerWriteClipboardParams
}

// BoolFlag captures whether a boolean flag was set explicitly and its value.
Expand Down Expand Up @@ -391,8 +393,7 @@
if in.Viewport != "" {
width, height, refreshRate, err := parseViewport(in.Viewport)
if err != nil {
pterm.Error.Printf("Invalid viewport format: %v\n", err)
return nil
return fmt.Errorf("invalid viewport format: %w", err)
}
params.Viewport = kernel.BrowserViewportParam{
Width: width,
Expand Down Expand Up @@ -757,6 +758,16 @@
ActionsJSON string
}

type BrowsersComputerReadClipboardInput struct {
Identifier string
Output string
}

type BrowsersComputerWriteClipboardInput struct {
Identifier string
Text string
}

func (b BrowsersCmd) ComputerClickMouse(ctx context.Context, in BrowsersComputerClickMouseInput) error {
if b.computer == nil {
pterm.Error.Println("computer service not available")
Expand Down Expand Up @@ -1016,6 +1027,53 @@
return nil
}

func (b BrowsersCmd) ComputerReadClipboard(ctx context.Context, in BrowsersComputerReadClipboardInput) error {
if in.Output != "" && in.Output != "json" {
return fmt.Errorf("unsupported --output value: use 'json'")
}
if b.computer == nil {
pterm.Error.Println("computer service not available")
return nil
}
br, err := b.browsers.Get(ctx, in.Identifier, kernel.BrowserGetParams{})
if err != nil {
return util.CleanedUpSdkError{Err: err}
}
res, err := b.computer.ReadClipboard(ctx, br.SessionID)
if err != nil {
return util.CleanedUpSdkError{Err: err}
}
if res == nil {
return fmt.Errorf("unexpected empty response from clipboard API")
}
if in.Output == "json" {
data, err := json.MarshalIndent(map[string]string{"text": res.Text}, "", " ")
if err != nil {
return err
}
fmt.Println(string(data))
return nil
}
fmt.Print(res.Text)
return nil
}

func (b BrowsersCmd) ComputerWriteClipboard(ctx context.Context, in BrowsersComputerWriteClipboardInput) error {
if b.computer == nil {
pterm.Error.Println("computer service not available")
return nil
}
br, err := b.browsers.Get(ctx, in.Identifier, kernel.BrowserGetParams{})
if err != nil {
return util.CleanedUpSdkError{Err: err}
}
if err := b.computer.WriteClipboard(ctx, br.SessionID, kernel.BrowserComputerWriteClipboardParams{Text: in.Text}); err != nil {

Check failure on line 1070 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

undefined: kernel.BrowserComputerWriteClipboardParams
return util.CleanedUpSdkError{Err: err}
}
pterm.Success.Println("Text written to clipboard")
return nil
}

// Replays
type BrowsersReplaysListInput struct {
Identifier string
Expand Down Expand Up @@ -2369,7 +2427,14 @@
computerBatch.Flags().String("actions", "", "JSON object with actions array (e.g., {\"actions\":[{\"type\":\"click_mouse\",...}]})")
_ = computerBatch.MarkFlagRequired("actions")

computerRoot.AddCommand(computerClick, computerMove, computerScreenshot, computerType, computerPressKey, computerScroll, computerDrag, computerSetCursor, computerGetMousePosition, computerBatch)
computerReadClipboard := &cobra.Command{Use: "read-clipboard <id>", Short: "Read text from the clipboard", Args: cobra.ExactArgs(1), RunE: runBrowsersComputerReadClipboard}
computerReadClipboard.Flags().StringP("output", "o", "", "Output format: json for raw API response")

computerWriteClipboard := &cobra.Command{Use: "write-clipboard <id>", Short: "Write text to the clipboard", Args: cobra.ExactArgs(1), RunE: runBrowsersComputerWriteClipboard}
computerWriteClipboard.Flags().String("text", "", "Text to write to the clipboard")
_ = computerWriteClipboard.MarkFlagRequired("text")

computerRoot.AddCommand(computerClick, computerMove, computerScreenshot, computerType, computerPressKey, computerScroll, computerDrag, computerSetCursor, computerGetMousePosition, computerBatch, computerReadClipboard, computerWriteClipboard)
browsersCmd.AddCommand(computerRoot)

// playwright
Expand Down Expand Up @@ -2944,7 +3009,7 @@
button, _ := cmd.Flags().GetString("button")
clickType, _ := cmd.Flags().GetString("click-type")
holdKeys, _ := cmd.Flags().GetStringSlice("hold-key")
b := BrowsersCmd{browsers: &svc, computer: &svc.Computer}

Check failure on line 3012 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

cannot use &svc.Computer (value of type *kernel.BrowserComputerService) as BrowserComputerService value in struct literal: *kernel.BrowserComputerService does not implement BrowserComputerService (missing method ReadClipboard)
return b.ComputerClickMouse(cmd.Context(), BrowsersComputerClickMouseInput{Identifier: args[0], X: x, Y: y, NumClicks: numClicks, Button: button, ClickType: clickType, HoldKeys: holdKeys})
}

Expand All @@ -2954,7 +3019,7 @@
x, _ := cmd.Flags().GetInt64("x")
y, _ := cmd.Flags().GetInt64("y")
holdKeys, _ := cmd.Flags().GetStringSlice("hold-key")
b := BrowsersCmd{browsers: &svc, computer: &svc.Computer}

Check failure on line 3022 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

cannot use &svc.Computer (value of type *kernel.BrowserComputerService) as BrowserComputerService value in struct literal: *kernel.BrowserComputerService does not implement BrowserComputerService (missing method ReadClipboard)
return b.ComputerMoveMouse(cmd.Context(), BrowsersComputerMoveMouseInput{Identifier: args[0], X: x, Y: y, HoldKeys: holdKeys})
}

Expand All @@ -2981,7 +3046,7 @@
return nil
}
}
b := BrowsersCmd{browsers: &svc, computer: &svc.Computer}

Check failure on line 3049 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

cannot use &svc.Computer (value of type *kernel.BrowserComputerService) as BrowserComputerService value in struct literal: *kernel.BrowserComputerService does not implement BrowserComputerService (missing method ReadClipboard)
return b.ComputerScreenshot(cmd.Context(), BrowsersComputerScreenshotInput{Identifier: args[0], X: x, Y: y, Width: w, Height: h, To: to, HasRegion: useRegion})
}

Expand All @@ -2990,7 +3055,7 @@
svc := client.Browsers
text, _ := cmd.Flags().GetString("text")
delay, _ := cmd.Flags().GetInt64("delay")
b := BrowsersCmd{browsers: &svc, computer: &svc.Computer}

Check failure on line 3058 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

cannot use &svc.Computer (value of type *kernel.BrowserComputerService) as BrowserComputerService value in struct literal: *kernel.BrowserComputerService does not implement BrowserComputerService (missing method ReadClipboard)
return b.ComputerTypeText(cmd.Context(), BrowsersComputerTypeTextInput{Identifier: args[0], Text: text, Delay: delay})
}

Expand All @@ -3000,7 +3065,7 @@
keys, _ := cmd.Flags().GetStringSlice("key")
duration, _ := cmd.Flags().GetInt64("duration")
holdKeys, _ := cmd.Flags().GetStringSlice("hold-key")
b := BrowsersCmd{browsers: &svc, computer: &svc.Computer}

Check failure on line 3068 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

cannot use &svc.Computer (value of type *kernel.BrowserComputerService) as BrowserComputerService value in struct literal: *kernel.BrowserComputerService does not implement BrowserComputerService (missing method ReadClipboard)
return b.ComputerPressKey(cmd.Context(), BrowsersComputerPressKeyInput{Identifier: args[0], Keys: keys, Duration: duration, HoldKeys: holdKeys})
}

Expand All @@ -3014,7 +3079,7 @@
dxSet := cmd.Flags().Changed("delta-x")
dySet := cmd.Flags().Changed("delta-y")
holdKeys, _ := cmd.Flags().GetStringSlice("hold-key")
b := BrowsersCmd{browsers: &svc, computer: &svc.Computer}

Check failure on line 3082 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

cannot use &svc.Computer (value of type *kernel.BrowserComputerService) as BrowserComputerService value in struct literal: *kernel.BrowserComputerService does not implement BrowserComputerService (missing method ReadClipboard)
return b.ComputerScroll(cmd.Context(), BrowsersComputerScrollInput{Identifier: args[0], X: x, Y: y, DeltaX: dx, DeltaXSet: dxSet, DeltaY: dy, DeltaYSet: dySet, HoldKeys: holdKeys})
}

Expand Down Expand Up @@ -3049,7 +3114,7 @@
path = append(path, []int64{x, y})
}

b := BrowsersCmd{browsers: &svc, computer: &svc.Computer}

Check failure on line 3117 in cmd/browsers.go

View workflow job for this annotation

GitHub Actions / test

cannot use &svc.Computer (value of type *kernel.BrowserComputerService) as BrowserComputerService value in struct literal: *kernel.BrowserComputerService does not implement BrowserComputerService (missing method ReadClipboard)
return b.ComputerDragMouse(cmd.Context(), BrowsersComputerDragMouseInput{Identifier: args[0], Path: path, Delay: delay, StepDelayMs: stepDelayMs, StepsPerSegment: stepsPerSegment, Button: button, HoldKeys: holdKeys})
}

Expand Down Expand Up @@ -3091,6 +3156,22 @@
return b.ComputerBatch(cmd.Context(), BrowsersComputerBatchInput{Identifier: args[0], ActionsJSON: actionsJSON})
}

func runBrowsersComputerReadClipboard(cmd *cobra.Command, args []string) error {
client := getKernelClient(cmd)
svc := client.Browsers
output, _ := cmd.Flags().GetString("output")
b := BrowsersCmd{browsers: &svc, computer: &svc.Computer}
return b.ComputerReadClipboard(cmd.Context(), BrowsersComputerReadClipboardInput{Identifier: args[0], Output: output})
}

func runBrowsersComputerWriteClipboard(cmd *cobra.Command, args []string) error {
client := getKernelClient(cmd)
svc := client.Browsers
text, _ := cmd.Flags().GetString("text")
b := BrowsersCmd{browsers: &svc, computer: &svc.Computer}
return b.ComputerWriteClipboard(cmd.Context(), BrowsersComputerWriteClipboardInput{Identifier: args[0], Text: text})
}

func truncateURL(url string, maxLen int) string {
if len(url) <= maxLen {
return url
Expand Down