daytona 0.200.1 → 0.201.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.
- checksums.yaml +4 -4
- data/lib/daytona/code_interpreter.rb +6 -6
- data/lib/daytona/common/response.rb +2 -0
- data/lib/daytona/computer_use.rb +62 -62
- data/lib/daytona/daytona.rb +9 -0
- data/lib/daytona/file_system.rb +36 -28
- data/lib/daytona/git.rb +21 -31
- data/lib/daytona/lsp_server.rb +20 -2
- data/lib/daytona/object_storage.rb +2 -5
- data/lib/daytona/process.rb +44 -4
- data/lib/daytona/sandbox.rb +93 -9
- data/lib/daytona/sdk/deprecated.rb +18 -0
- data/lib/daytona/sdk/errors.rb +279 -0
- data/lib/daytona/sdk/file_download_patch.rb +131 -0
- data/lib/daytona/sdk/version.rb +1 -1
- data/lib/daytona/sdk.rb +7 -9
- data/lib/daytona/snapshot_service.rb +2 -1
- data/lib/daytona/utils/file_url_signing.rb +56 -0
- metadata +19 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 684e4304ffae6f21d39f795fbcd75754e0148adf43a86963e3c8303b6b9eb87e
|
|
4
|
+
data.tar.gz: 3d4dc419e7b759cce74db9df2cec0bb36900493c39d08b5640b04dd5c4863b11
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 59a7fea3c20c801d9e3d09bad69f6a4318f5b2ae64d397e2848ee893e8f5e1117c973f626ba825fce6bb4604f2875e1f4d393391b0c7dc8b850459a7d7073bd1
|
|
7
|
+
data.tar.gz: ade5a786482e476b4e3baf42eea6828e0d422ec83e1dc1363130165a8ae09b9a5e0d99be687848d5c50f6e4c0ce09342244ddfa1553d9effbff882ad3bd58267
|
|
@@ -232,8 +232,8 @@ module Daytona
|
|
|
232
232
|
def create_context(cwd: nil)
|
|
233
233
|
request = DaytonaToolboxApiClient::CreateContextRequest.new(cwd:)
|
|
234
234
|
@toolbox_api.create_interpreter_context(request)
|
|
235
|
-
rescue
|
|
236
|
-
raise Sdk
|
|
235
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
236
|
+
raise Sdk.wrap_error(e, 'Failed to create interpreter context')
|
|
237
237
|
end
|
|
238
238
|
|
|
239
239
|
# List all user-created interpreter contexts.
|
|
@@ -252,8 +252,8 @@ module Daytona
|
|
|
252
252
|
def list_contexts
|
|
253
253
|
response = @toolbox_api.list_interpreter_contexts
|
|
254
254
|
response.contexts || []
|
|
255
|
-
rescue
|
|
256
|
-
raise Sdk
|
|
255
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
256
|
+
raise Sdk.wrap_error(e, 'Failed to list interpreter contexts')
|
|
257
257
|
end
|
|
258
258
|
|
|
259
259
|
# Delete an interpreter context and shut down all associated processes.
|
|
@@ -272,8 +272,8 @@ module Daytona
|
|
|
272
272
|
def delete_context(context)
|
|
273
273
|
@toolbox_api.delete_interpreter_context(context.id)
|
|
274
274
|
nil
|
|
275
|
-
rescue
|
|
276
|
-
raise Sdk
|
|
275
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
276
|
+
raise Sdk.wrap_error(e, 'Failed to delete interpreter context')
|
|
277
277
|
end
|
|
278
278
|
|
|
279
279
|
instrument :run_code, :create_context, :list_contexts, :delete_context,
|
data/lib/daytona/computer_use.rb
CHANGED
|
@@ -33,8 +33,8 @@ module Daytona
|
|
|
33
33
|
# puts "Mouse is at: #{position.x}, #{position.y}"
|
|
34
34
|
def position
|
|
35
35
|
toolbox_api.get_mouse_position
|
|
36
|
-
rescue
|
|
37
|
-
raise Sdk
|
|
36
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
37
|
+
raise Sdk.wrap_error(e, 'Failed to get mouse position')
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
# Moves the mouse cursor to the specified coordinates.
|
|
@@ -50,8 +50,8 @@ module Daytona
|
|
|
50
50
|
def move(x:, y:)
|
|
51
51
|
request = DaytonaToolboxApiClient::MouseMoveRequest.new(x:, y:)
|
|
52
52
|
toolbox_api.move_mouse(request)
|
|
53
|
-
rescue
|
|
54
|
-
raise Sdk
|
|
53
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
54
|
+
raise Sdk.wrap_error(e, 'Failed to move mouse')
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
# Clicks the mouse at the specified coordinates.
|
|
@@ -75,8 +75,8 @@ module Daytona
|
|
|
75
75
|
def click(x:, y:, button: 'left', double: false)
|
|
76
76
|
request = DaytonaToolboxApiClient::MouseClickRequest.new(x:, y:, button:, double:)
|
|
77
77
|
toolbox_api.click(request)
|
|
78
|
-
rescue
|
|
79
|
-
raise Sdk
|
|
78
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
79
|
+
raise Sdk.wrap_error(e, 'Failed to click mouse')
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
# Drags the mouse from start coordinates to end coordinates.
|
|
@@ -95,8 +95,8 @@ module Daytona
|
|
|
95
95
|
def drag(start_x:, start_y:, end_x:, end_y:, button: 'left')
|
|
96
96
|
request = DaytonaToolboxApiClient::MouseDragRequest.new(start_x:, start_y:, end_x:, end_y:, button:)
|
|
97
97
|
toolbox_api.drag(request)
|
|
98
|
-
rescue
|
|
99
|
-
raise Sdk
|
|
98
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
99
|
+
raise Sdk.wrap_error(e, 'Failed to drag mouse')
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
# Scrolls the mouse wheel at the specified coordinates.
|
|
@@ -118,8 +118,8 @@ module Daytona
|
|
|
118
118
|
request = DaytonaToolboxApiClient::MouseScrollRequest.new(x:, y:, direction:, amount:)
|
|
119
119
|
toolbox_api.scroll(request)
|
|
120
120
|
true
|
|
121
|
-
rescue
|
|
122
|
-
raise Sdk
|
|
121
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
122
|
+
raise Sdk.wrap_error(e, 'Failed to scroll mouse')
|
|
123
123
|
end
|
|
124
124
|
|
|
125
125
|
instrument :position, :move, :click, :drag, :scroll, component: 'Mouse'
|
|
@@ -164,8 +164,8 @@ module Daytona
|
|
|
164
164
|
def type(text:, delay: nil)
|
|
165
165
|
request = DaytonaToolboxApiClient::KeyboardTypeRequest.new(text:, delay:)
|
|
166
166
|
toolbox_api.type_text(request)
|
|
167
|
-
rescue
|
|
168
|
-
raise Sdk
|
|
167
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
168
|
+
raise Sdk.wrap_error(e, 'Failed to type text')
|
|
169
169
|
end
|
|
170
170
|
|
|
171
171
|
# Presses a key with optional modifiers.
|
|
@@ -187,8 +187,8 @@ module Daytona
|
|
|
187
187
|
def press(key:, modifiers: nil)
|
|
188
188
|
request = DaytonaToolboxApiClient::KeyboardPressRequest.new(key:, modifiers: modifiers || [])
|
|
189
189
|
toolbox_api.press_key(request)
|
|
190
|
-
rescue
|
|
191
|
-
raise Sdk
|
|
190
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
191
|
+
raise Sdk.wrap_error(e, 'Failed to press key')
|
|
192
192
|
end
|
|
193
193
|
|
|
194
194
|
# Presses a hotkey combination.
|
|
@@ -209,8 +209,8 @@ module Daytona
|
|
|
209
209
|
def hotkey(keys:)
|
|
210
210
|
request = DaytonaToolboxApiClient::KeyboardHotkeyRequest.new(keys:)
|
|
211
211
|
toolbox_api.press_hotkey(request)
|
|
212
|
-
rescue
|
|
213
|
-
raise Sdk
|
|
212
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
213
|
+
raise Sdk.wrap_error(e, 'Failed to press hotkey')
|
|
214
214
|
end
|
|
215
215
|
|
|
216
216
|
instrument :type, :press, :hotkey, component: 'Keyboard'
|
|
@@ -254,8 +254,8 @@ module Daytona
|
|
|
254
254
|
# with_cursor = sandbox.computer_use.screenshot.take_full_screen(show_cursor: true)
|
|
255
255
|
def take_full_screen(show_cursor: false)
|
|
256
256
|
toolbox_api.take_screenshot(show_cursor:)
|
|
257
|
-
rescue
|
|
258
|
-
raise Sdk
|
|
257
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
258
|
+
raise Sdk.wrap_error(e, 'Failed to take screenshot')
|
|
259
259
|
end
|
|
260
260
|
|
|
261
261
|
# Takes a screenshot of a specific region.
|
|
@@ -271,8 +271,8 @@ module Daytona
|
|
|
271
271
|
# puts "Captured region: #{screenshot.region.width}x#{screenshot.region.height}"
|
|
272
272
|
def take_region(region:, show_cursor: false)
|
|
273
273
|
toolbox_api.take_region_screenshot(region.height, region.width, region.y, region.x, show_cursor:)
|
|
274
|
-
rescue
|
|
275
|
-
raise Sdk
|
|
274
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
275
|
+
raise Sdk.wrap_error(e, 'Failed to take region screenshot')
|
|
276
276
|
end
|
|
277
277
|
|
|
278
278
|
# Takes a compressed screenshot of the entire screen.
|
|
@@ -303,8 +303,8 @@ module Daytona
|
|
|
303
303
|
format: options.fmt,
|
|
304
304
|
show_cursor: options.show_cursor
|
|
305
305
|
)
|
|
306
|
-
rescue
|
|
307
|
-
raise Sdk
|
|
306
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
307
|
+
raise Sdk.wrap_error(e, 'Failed to take compressed screenshot')
|
|
308
308
|
end
|
|
309
309
|
|
|
310
310
|
# Takes a compressed screenshot of a specific region.
|
|
@@ -334,8 +334,8 @@ module Daytona
|
|
|
334
334
|
format: options.fmt,
|
|
335
335
|
show_cursor: options.show_cursor
|
|
336
336
|
)
|
|
337
|
-
rescue
|
|
338
|
-
raise Sdk
|
|
337
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
338
|
+
raise Sdk.wrap_error(e, 'Failed to take compressed region screenshot')
|
|
339
339
|
end
|
|
340
340
|
|
|
341
341
|
instrument :take_full_screen, :take_region, :take_compressed, :take_compressed_region,
|
|
@@ -380,8 +380,8 @@ module Daytona
|
|
|
380
380
|
# end
|
|
381
381
|
def info
|
|
382
382
|
toolbox_api.get_display_info
|
|
383
|
-
rescue
|
|
384
|
-
raise Sdk
|
|
383
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
384
|
+
raise Sdk.wrap_error(e, 'Failed to get display info')
|
|
385
385
|
end
|
|
386
386
|
|
|
387
387
|
# Gets the list of open windows.
|
|
@@ -397,8 +397,8 @@ module Daytona
|
|
|
397
397
|
# end
|
|
398
398
|
def windows
|
|
399
399
|
toolbox_api.get_windows
|
|
400
|
-
rescue
|
|
401
|
-
raise Sdk
|
|
400
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
401
|
+
raise Sdk.wrap_error(e, 'Failed to get windows')
|
|
402
402
|
end
|
|
403
403
|
|
|
404
404
|
instrument :info, :windows, component: 'Display'
|
|
@@ -446,8 +446,8 @@ module Daytona
|
|
|
446
446
|
opts[:max_depth] = max_depth unless max_depth.nil?
|
|
447
447
|
|
|
448
448
|
toolbox_api.get_accessibility_tree(opts)
|
|
449
|
-
rescue
|
|
450
|
-
raise Sdk
|
|
449
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
450
|
+
raise Sdk.wrap_error(e, 'Failed to get accessibility tree')
|
|
451
451
|
end
|
|
452
452
|
|
|
453
453
|
# Finds AT-SPI accessibility nodes matching the provided filters.
|
|
@@ -482,8 +482,8 @@ module Daytona
|
|
|
482
482
|
|
|
483
483
|
request = DaytonaToolboxApiClient::FindAccessibilityNodesRequest.new(attrs)
|
|
484
484
|
toolbox_api.find_accessibility_nodes(request)
|
|
485
|
-
rescue
|
|
486
|
-
raise Sdk
|
|
485
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
486
|
+
raise Sdk.wrap_error(e, 'Failed to find accessibility nodes')
|
|
487
487
|
end
|
|
488
488
|
|
|
489
489
|
# Focuses an AT-SPI accessibility node.
|
|
@@ -496,8 +496,8 @@ module Daytona
|
|
|
496
496
|
def focus_node(id:)
|
|
497
497
|
request = DaytonaToolboxApiClient::AccessibilityNodeRequest.new(id:)
|
|
498
498
|
toolbox_api.focus_accessibility_node(request)
|
|
499
|
-
rescue
|
|
500
|
-
raise Sdk
|
|
499
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
500
|
+
raise Sdk.wrap_error(e, 'Failed to focus accessibility node')
|
|
501
501
|
end
|
|
502
502
|
|
|
503
503
|
# Invokes an AT-SPI accessibility node action.
|
|
@@ -514,8 +514,8 @@ module Daytona
|
|
|
514
514
|
|
|
515
515
|
request = DaytonaToolboxApiClient::AccessibilityInvokeRequest.new(attrs)
|
|
516
516
|
toolbox_api.invoke_accessibility_node(request)
|
|
517
|
-
rescue
|
|
518
|
-
raise Sdk
|
|
517
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
518
|
+
raise Sdk.wrap_error(e, 'Failed to invoke accessibility node')
|
|
519
519
|
end
|
|
520
520
|
|
|
521
521
|
# Sets an AT-SPI accessibility node value.
|
|
@@ -529,8 +529,8 @@ module Daytona
|
|
|
529
529
|
def set_node_value(id:, value:)
|
|
530
530
|
request = DaytonaToolboxApiClient::AccessibilitySetValueRequest.new(id:, value:)
|
|
531
531
|
toolbox_api.set_accessibility_node_value(request)
|
|
532
|
-
rescue
|
|
533
|
-
raise Sdk
|
|
532
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
533
|
+
raise Sdk.wrap_error(e, 'Failed to set accessibility node value')
|
|
534
534
|
end
|
|
535
535
|
|
|
536
536
|
instrument :get_tree, :find_nodes, :focus_node, :invoke_node, :set_node_value,
|
|
@@ -627,8 +627,8 @@ module Daytona
|
|
|
627
627
|
def start(label: nil)
|
|
628
628
|
request = DaytonaToolboxApiClient::StartRecordingRequest.new(label:)
|
|
629
629
|
toolbox_api.start_recording(request: request)
|
|
630
|
-
rescue
|
|
631
|
-
raise Sdk
|
|
630
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
631
|
+
raise Sdk.wrap_error(e, 'Failed to start recording')
|
|
632
632
|
end
|
|
633
633
|
|
|
634
634
|
# Stops an active screen recording session.
|
|
@@ -644,8 +644,8 @@ module Daytona
|
|
|
644
644
|
def stop(id:)
|
|
645
645
|
request = DaytonaToolboxApiClient::StopRecordingRequest.new(id: id)
|
|
646
646
|
toolbox_api.stop_recording(request)
|
|
647
|
-
rescue
|
|
648
|
-
raise Sdk
|
|
647
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
648
|
+
raise Sdk.wrap_error(e, 'Failed to stop recording')
|
|
649
649
|
end
|
|
650
650
|
|
|
651
651
|
# Lists all recordings (active and completed).
|
|
@@ -661,8 +661,8 @@ module Daytona
|
|
|
661
661
|
# end
|
|
662
662
|
def list
|
|
663
663
|
toolbox_api.list_recordings
|
|
664
|
-
rescue
|
|
665
|
-
raise Sdk
|
|
664
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
665
|
+
raise Sdk.wrap_error(e, 'Failed to list recordings')
|
|
666
666
|
end
|
|
667
667
|
|
|
668
668
|
# Gets details of a specific recording by ID.
|
|
@@ -678,8 +678,8 @@ module Daytona
|
|
|
678
678
|
# puts "Duration: #{recording.duration_seconds} seconds"
|
|
679
679
|
def get(id:)
|
|
680
680
|
toolbox_api.get_recording(id)
|
|
681
|
-
rescue
|
|
682
|
-
raise Sdk
|
|
681
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
682
|
+
raise Sdk.wrap_error(e, 'Failed to get recording')
|
|
683
683
|
end
|
|
684
684
|
|
|
685
685
|
# Deletes a recording by ID.
|
|
@@ -693,8 +693,8 @@ module Daytona
|
|
|
693
693
|
# puts "Recording deleted"
|
|
694
694
|
def delete(id:)
|
|
695
695
|
toolbox_api.delete_recording(id)
|
|
696
|
-
rescue
|
|
697
|
-
raise Sdk
|
|
696
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
697
|
+
raise Sdk.wrap_error(e, 'Failed to delete recording')
|
|
698
698
|
end
|
|
699
699
|
|
|
700
700
|
# Downloads a recording file and saves it to a local path.
|
|
@@ -815,8 +815,8 @@ module Daytona
|
|
|
815
815
|
# puts "Computer use processes started: #{result.message}"
|
|
816
816
|
def start
|
|
817
817
|
toolbox_api.start_computer_use
|
|
818
|
-
rescue
|
|
819
|
-
raise Sdk
|
|
818
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
819
|
+
raise Sdk.wrap_error(e, 'Failed to start computer use')
|
|
820
820
|
end
|
|
821
821
|
|
|
822
822
|
# Stops all computer use processes.
|
|
@@ -829,8 +829,8 @@ module Daytona
|
|
|
829
829
|
# puts "Computer use processes stopped: #{result.message}"
|
|
830
830
|
def stop
|
|
831
831
|
toolbox_api.stop_computer_use
|
|
832
|
-
rescue
|
|
833
|
-
raise Sdk
|
|
832
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
833
|
+
raise Sdk.wrap_error(e, 'Failed to stop computer use')
|
|
834
834
|
end
|
|
835
835
|
|
|
836
836
|
# Gets the status of all computer use processes.
|
|
@@ -843,8 +843,8 @@ module Daytona
|
|
|
843
843
|
# puts "Computer use status: #{response.status}"
|
|
844
844
|
def status
|
|
845
845
|
toolbox_api.get_computer_use_status
|
|
846
|
-
rescue
|
|
847
|
-
raise Sdk
|
|
846
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
847
|
+
raise Sdk.wrap_error(e, 'Failed to get computer use status')
|
|
848
848
|
end
|
|
849
849
|
|
|
850
850
|
# Gets the status of a specific VNC process.
|
|
@@ -858,8 +858,8 @@ module Daytona
|
|
|
858
858
|
# no_vnc_status = sandbox.computer_use.get_process_status("novnc")
|
|
859
859
|
def get_process_status(process_name:)
|
|
860
860
|
toolbox_api.get_process_status(process_name, sandbox_id)
|
|
861
|
-
rescue
|
|
862
|
-
raise Sdk
|
|
861
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
862
|
+
raise Sdk.wrap_error(e, 'Failed to get process status')
|
|
863
863
|
end
|
|
864
864
|
|
|
865
865
|
# Restarts a specific VNC process.
|
|
@@ -873,8 +873,8 @@ module Daytona
|
|
|
873
873
|
# puts "XFCE4 process restarted: #{result.message}"
|
|
874
874
|
def restart_process(process_name:)
|
|
875
875
|
toolbox_api.restart_process(process_name, sandbox_id)
|
|
876
|
-
rescue
|
|
877
|
-
raise Sdk
|
|
876
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
877
|
+
raise Sdk.wrap_error(e, 'Failed to restart process')
|
|
878
878
|
end
|
|
879
879
|
|
|
880
880
|
# Gets logs for a specific VNC process.
|
|
@@ -888,8 +888,8 @@ module Daytona
|
|
|
888
888
|
# puts "NoVNC logs: #{logs}"
|
|
889
889
|
def get_process_logs(process_name:)
|
|
890
890
|
toolbox_api.get_process_logs(process_name, sandbox_id)
|
|
891
|
-
rescue
|
|
892
|
-
raise Sdk
|
|
891
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
892
|
+
raise Sdk.wrap_error(e, 'Failed to get process logs')
|
|
893
893
|
end
|
|
894
894
|
|
|
895
895
|
# Gets error logs for a specific VNC process.
|
|
@@ -903,8 +903,8 @@ module Daytona
|
|
|
903
903
|
# puts "X11VNC errors: #{errors}"
|
|
904
904
|
def get_process_errors(process_name:)
|
|
905
905
|
toolbox_api.get_process_errors(process_name, sandbox_id)
|
|
906
|
-
rescue
|
|
907
|
-
raise Sdk
|
|
906
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
907
|
+
raise Sdk.wrap_error(e, 'Failed to get process errors')
|
|
908
908
|
end
|
|
909
909
|
|
|
910
910
|
instrument :start, :stop, :status, :get_process_status, :restart_process,
|
data/lib/daytona/daytona.rb
CHANGED
|
@@ -127,9 +127,12 @@ module Daytona
|
|
|
127
127
|
#
|
|
128
128
|
# @param id [String]
|
|
129
129
|
# @return [Daytona::Sandbox]
|
|
130
|
+
# @raise [Daytona::Sdk::Error]
|
|
130
131
|
def get(id)
|
|
131
132
|
sandbox_dto = sandbox_api.get_sandbox(id)
|
|
132
133
|
to_sandbox(sandbox_dto:)
|
|
134
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
135
|
+
raise Sdk.wrap_error(e, "Failed to get sandbox #{id}")
|
|
133
136
|
end
|
|
134
137
|
|
|
135
138
|
# Iterates over Sandboxes matching the given query.
|
|
@@ -222,11 +225,15 @@ module Daytona
|
|
|
222
225
|
created_at_before: q.created_at_before,
|
|
223
226
|
last_event_after: q.last_activity_after,
|
|
224
227
|
last_event_before: q.last_activity_before,
|
|
228
|
+
auto_destroy_at_after: q.auto_destroy_at_after,
|
|
229
|
+
auto_destroy_at_before: q.auto_destroy_at_before,
|
|
225
230
|
sort: q.sort,
|
|
226
231
|
order: q.order
|
|
227
232
|
}.compact
|
|
228
233
|
|
|
229
234
|
sandbox_api.list_sandboxes(opts)
|
|
235
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
236
|
+
raise Sdk.wrap_error(e, 'Failed to list sandboxes')
|
|
230
237
|
end
|
|
231
238
|
|
|
232
239
|
instrument :fetch_sandbox_page, component: 'Daytona.list'
|
|
@@ -334,6 +341,8 @@ module Daytona
|
|
|
334
341
|
end
|
|
335
342
|
|
|
336
343
|
sandbox
|
|
344
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
345
|
+
raise Sdk.wrap_error(e, 'Failed to create sandbox')
|
|
337
346
|
end
|
|
338
347
|
|
|
339
348
|
# @return [void]
|
data/lib/daytona/file_system.rb
CHANGED
|
@@ -46,8 +46,8 @@ module Daytona
|
|
|
46
46
|
def create_folder(path, mode)
|
|
47
47
|
Sdk.logger.debug("Creating folder #{path} with mode #{mode}")
|
|
48
48
|
toolbox_api.create_folder(path, mode)
|
|
49
|
-
rescue
|
|
50
|
-
raise Sdk
|
|
49
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
50
|
+
raise Sdk.wrap_error(e, 'Failed to create folder')
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
# Deletes a file from the Sandbox.
|
|
@@ -65,8 +65,8 @@ module Daytona
|
|
|
65
65
|
# sandbox.fs.delete_file("workspace/old_dir", recursive: true)
|
|
66
66
|
def delete_file(path, recursive: false)
|
|
67
67
|
toolbox_api.delete_file(path, { recursive: })
|
|
68
|
-
rescue
|
|
69
|
-
raise Sdk
|
|
68
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
69
|
+
raise Sdk.wrap_error(e, 'Failed to delete file')
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
# Gets detailed information about a file or directory, including its
|
|
@@ -89,8 +89,8 @@ module Daytona
|
|
|
89
89
|
# puts "Path is a directory" if info.is_dir
|
|
90
90
|
def get_file_info(path)
|
|
91
91
|
toolbox_api.get_file_info(path)
|
|
92
|
-
rescue
|
|
93
|
-
raise Sdk
|
|
92
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
93
|
+
raise Sdk.wrap_error(e, 'Failed to get file info')
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
# Lists files and directories in a given path and returns their information, similar to the ls -l command.
|
|
@@ -123,8 +123,8 @@ module Daytona
|
|
|
123
123
|
toolbox_api.list_files({ path:, depth: }.compact)
|
|
124
124
|
rescue Sdk::Error
|
|
125
125
|
raise
|
|
126
|
-
rescue
|
|
127
|
-
raise Sdk
|
|
126
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
127
|
+
raise Sdk.wrap_error(e, 'Failed to list files')
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
# Downloads a file from the Sandbox. Returns the file contents as a string.
|
|
@@ -159,7 +159,9 @@ module Daytona
|
|
|
159
159
|
else
|
|
160
160
|
file
|
|
161
161
|
end
|
|
162
|
-
rescue
|
|
162
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
163
|
+
raise Sdk.wrap_error(e, 'Failed to download file')
|
|
164
|
+
rescue IOError, SystemCallError => e
|
|
163
165
|
raise Sdk::Error, "Failed to download file: #{e.message}"
|
|
164
166
|
end
|
|
165
167
|
|
|
@@ -198,7 +200,9 @@ module Daytona
|
|
|
198
200
|
timeout: timeout, on_progress: on_progress,
|
|
199
201
|
cancel_event: cancel_event, &)
|
|
200
202
|
nil
|
|
201
|
-
rescue
|
|
203
|
+
rescue *Sdk::API_ERROR_CLASSES, Sdk::Error => e
|
|
204
|
+
raise Sdk.wrap_error(e, 'Failed to download file')
|
|
205
|
+
rescue IOError, SystemCallError => e
|
|
202
206
|
raise Sdk::Error, "Failed to download file: #{e.message}"
|
|
203
207
|
end
|
|
204
208
|
|
|
@@ -222,13 +226,13 @@ module Daytona
|
|
|
222
226
|
# # Upload binary data
|
|
223
227
|
# data = { key: "value" }.to_json
|
|
224
228
|
# sandbox.fs.upload_file(data, "tmp/config.json")
|
|
225
|
-
def upload_file(source, remote_path)
|
|
229
|
+
def upload_file(source, remote_path) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
226
230
|
if source.is_a?(String) && File.exist?(source)
|
|
227
231
|
# Source is a file path
|
|
228
|
-
File.open(source, 'rb') { |file| toolbox_api.upload_file(remote_path, file) }
|
|
232
|
+
File.open(source, 'rb') { |file| toolbox_api.upload_file(remote_path, file: file) }
|
|
229
233
|
elsif source.respond_to?(:read)
|
|
230
234
|
# Source is an IO object
|
|
231
|
-
toolbox_api.upload_file(remote_path, source)
|
|
235
|
+
toolbox_api.upload_file(remote_path, file: source)
|
|
232
236
|
else
|
|
233
237
|
# Tempfile.create yields a ::File (works with Typhoeus) but deletes
|
|
234
238
|
# on block exit — too early if curl reads asynchronously. Write via
|
|
@@ -238,12 +242,14 @@ module Daytona
|
|
|
238
242
|
tmp.binmode
|
|
239
243
|
tmp.write(source.to_s.b)
|
|
240
244
|
tmp.close
|
|
241
|
-
File.open(tmp.path, 'rb') { |file| toolbox_api.upload_file(remote_path, file) }
|
|
245
|
+
File.open(tmp.path, 'rb') { |file| toolbox_api.upload_file(remote_path, file: file) }
|
|
242
246
|
ensure
|
|
243
247
|
tmp.unlink
|
|
244
248
|
end
|
|
245
249
|
end
|
|
246
|
-
rescue
|
|
250
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
251
|
+
raise Sdk.wrap_error(e, 'Failed to upload file')
|
|
252
|
+
rescue IOError, SystemCallError => e
|
|
247
253
|
raise Sdk::Error, "Failed to upload file: #{e.message}"
|
|
248
254
|
end
|
|
249
255
|
|
|
@@ -273,7 +279,9 @@ module Daytona
|
|
|
273
279
|
FileTransfer.stream_upload(api_client: toolbox_api.api_client, remote_path: remote_path,
|
|
274
280
|
source: source, timeout: timeout, on_progress: on_progress,
|
|
275
281
|
cancel_event: cancel_event)
|
|
276
|
-
rescue
|
|
282
|
+
rescue *Sdk::API_ERROR_CLASSES, Sdk::Error => e
|
|
283
|
+
raise Sdk.wrap_error(e, 'Failed to upload file')
|
|
284
|
+
rescue IOError, SystemCallError => e
|
|
277
285
|
raise Sdk::Error, "Failed to upload file: #{e.message}"
|
|
278
286
|
end
|
|
279
287
|
|
|
@@ -294,8 +302,8 @@ module Daytona
|
|
|
294
302
|
# sandbox.fs.upload_files(files)
|
|
295
303
|
def upload_files(files)
|
|
296
304
|
files.each { |file_upload| upload_file(file_upload.source, file_upload.destination) }
|
|
297
|
-
rescue
|
|
298
|
-
raise Sdk
|
|
305
|
+
rescue *Sdk::API_ERROR_CLASSES, Sdk::Error => e
|
|
306
|
+
raise Sdk.wrap_error(e, 'Failed to upload files')
|
|
299
307
|
end
|
|
300
308
|
|
|
301
309
|
# Searches for files containing a pattern, similar to the grep command.
|
|
@@ -315,8 +323,8 @@ module Daytona
|
|
|
315
323
|
# end
|
|
316
324
|
def find_files(path, pattern)
|
|
317
325
|
toolbox_api.find_in_files(path, pattern)
|
|
318
|
-
rescue
|
|
319
|
-
raise Sdk
|
|
326
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
327
|
+
raise Sdk.wrap_error(e, 'Failed to find files')
|
|
320
328
|
end
|
|
321
329
|
|
|
322
330
|
# Searches for files and directories whose names match the specified pattern.
|
|
@@ -339,8 +347,8 @@ module Daytona
|
|
|
339
347
|
# puts "Found #{result.files.length} test files"
|
|
340
348
|
def search_files(path, pattern)
|
|
341
349
|
toolbox_api.search_files(path, pattern)
|
|
342
|
-
rescue
|
|
343
|
-
raise Sdk
|
|
350
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
351
|
+
raise Sdk.wrap_error(e, 'Failed to search files')
|
|
344
352
|
end
|
|
345
353
|
|
|
346
354
|
# Moves or renames a file or directory. The parent directory of the destination must exist.
|
|
@@ -372,8 +380,8 @@ module Daytona
|
|
|
372
380
|
# )
|
|
373
381
|
def move_files(source, destination)
|
|
374
382
|
toolbox_api.move_file(source, destination)
|
|
375
|
-
rescue
|
|
376
|
-
raise Sdk
|
|
383
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
384
|
+
raise Sdk.wrap_error(e, 'Failed to move files')
|
|
377
385
|
end
|
|
378
386
|
|
|
379
387
|
# Performs search and replace operations across multiple files.
|
|
@@ -408,8 +416,8 @@ module Daytona
|
|
|
408
416
|
new_value: new_value
|
|
409
417
|
)
|
|
410
418
|
toolbox_api.replace_in_files(replace_request)
|
|
411
|
-
rescue
|
|
412
|
-
raise Sdk
|
|
419
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
420
|
+
raise Sdk.wrap_error(e, 'Failed to replace in files')
|
|
413
421
|
end
|
|
414
422
|
|
|
415
423
|
# Sets permissions and ownership for a file or directory. Any of the parameters can be nil
|
|
@@ -443,8 +451,8 @@ module Daytona
|
|
|
443
451
|
opts[:group] = group if group
|
|
444
452
|
|
|
445
453
|
toolbox_api.set_file_permissions(path, opts)
|
|
446
|
-
rescue
|
|
447
|
-
raise Sdk
|
|
454
|
+
rescue *Sdk::API_ERROR_CLASSES => e
|
|
455
|
+
raise Sdk.wrap_error(e, 'Failed to set file permissions')
|
|
448
456
|
end
|
|
449
457
|
|
|
450
458
|
instrument :create_folder, :delete_file, :get_file_info, :list_files, :download_file,
|