@cloudflare/sandbox 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.ts CHANGED
@@ -76,4 +76,54 @@ export class Sandbox<Env = unknown> extends Container<Env> {
76
76
  }
77
77
  return this.client.mkdir(path, options.recursive);
78
78
  }
79
+
80
+ async writeFile(
81
+ path: string,
82
+ content: string,
83
+ options: { encoding?: string; stream?: boolean }
84
+ ) {
85
+ if (options?.stream) {
86
+ return this.client.writeFileStream(path, content, options.encoding);
87
+ }
88
+ return this.client.writeFile(path, content, options.encoding);
89
+ }
90
+
91
+ async deleteFile(path: string, options: { stream?: boolean }) {
92
+ if (options?.stream) {
93
+ return this.client.deleteFileStream(path);
94
+ }
95
+ return this.client.deleteFile(path);
96
+ }
97
+
98
+ async renameFile(
99
+ oldPath: string,
100
+ newPath: string,
101
+ options: { stream?: boolean }
102
+ ) {
103
+ if (options?.stream) {
104
+ return this.client.renameFileStream(oldPath, newPath);
105
+ }
106
+ return this.client.renameFile(oldPath, newPath);
107
+ }
108
+
109
+ async moveFile(
110
+ sourcePath: string,
111
+ destinationPath: string,
112
+ options: { stream?: boolean }
113
+ ) {
114
+ if (options?.stream) {
115
+ return this.client.moveFileStream(sourcePath, destinationPath);
116
+ }
117
+ return this.client.moveFile(sourcePath, destinationPath);
118
+ }
119
+
120
+ async readFile(
121
+ path: string,
122
+ options: { encoding?: string; stream?: boolean }
123
+ ) {
124
+ if (options?.stream) {
125
+ return this.client.readFileStream(path, options.encoding);
126
+ }
127
+ return this.client.readFile(path, options.encoding);
128
+ }
79
129
  }
package/tests/test2.ts CHANGED
@@ -7,6 +7,8 @@ import {
7
7
  quickExecuteStream,
8
8
  quickMoveFile,
9
9
  quickMoveFileStream,
10
+ quickReadFile,
11
+ quickReadFileStream,
10
12
  quickRenameFile,
11
13
  quickRenameFileStream,
12
14
  quickWriteFile,
@@ -683,6 +685,223 @@ async function testHttpClient() {
683
685
  );
684
686
  }
685
687
 
688
+ // Test 25: File reading
689
+ console.log("Test 25: File reading");
690
+ try {
691
+ // First create a file to read
692
+ const readContent = "This is a test file for reading\nLine 2\nLine 3";
693
+ await quickWriteFile("file-to-read.txt", readContent);
694
+ console.log("✅ Test file created for reading");
695
+
696
+ // Read the file
697
+ const result = await quickReadFile("file-to-read.txt");
698
+ console.log("✅ File read successfully:", result.success);
699
+ console.log(" Path:", result.path);
700
+ console.log(" Content length:", result.content.length, "characters");
701
+ console.log(" Exit code:", result.exitCode);
702
+
703
+ // Verify the content
704
+ console.log("✅ File content verified:", result.content === readContent);
705
+ console.log(" Content:", result.content);
706
+ console.log("✅ File reading test completed\n");
707
+ } catch (error) {
708
+ console.error("❌ Test 25 failed:", error);
709
+ }
710
+
711
+ // Test 26: File reading with custom encoding
712
+ console.log("Test 26: File reading with custom encoding");
713
+ try {
714
+ // Create a file with special characters
715
+ const specialContent = "Hello 世界! 🌍 Test with emojis and unicode";
716
+ await quickWriteFile("special-chars.txt", specialContent, "utf-8");
717
+ console.log("✅ Special characters file created");
718
+
719
+ // Read with explicit UTF-8 encoding
720
+ const result = await quickReadFile("special-chars.txt", "utf-8");
721
+ console.log(
722
+ "✅ Special characters file read successfully:",
723
+ result.success
724
+ );
725
+ console.log(
726
+ "✅ Special characters verified:",
727
+ result.content === specialContent
728
+ );
729
+ console.log(" Content:", result.content);
730
+ console.log("✅ Custom encoding test completed\n");
731
+ } catch (error) {
732
+ console.error("❌ Test 26 failed:", error);
733
+ }
734
+
735
+ // Test 27: File reading in nested directories
736
+ console.log("Test 27: File reading in nested directories");
737
+ try {
738
+ // Create a file in a nested directory
739
+ const nestedContent = "This file is in a nested directory for reading";
740
+ await quickWriteFile("nested/read/test-nested-read.txt", nestedContent);
741
+ console.log("✅ Nested file created for reading");
742
+
743
+ // Read the nested file
744
+ const result = await quickReadFile("nested/read/test-nested-read.txt");
745
+ console.log("✅ Nested file read successfully:", result.success);
746
+ console.log(
747
+ "✅ Nested file content verified:",
748
+ result.content === nestedContent
749
+ );
750
+ console.log(" Content:", result.content);
751
+ console.log("✅ Nested directory reading test completed\n");
752
+ } catch (error) {
753
+ console.error("❌ Test 27 failed:", error);
754
+ }
755
+
756
+ // Test 28: Streaming file reading
757
+ console.log("Test 28: Streaming file reading");
758
+ try {
759
+ const client = createClient();
760
+ await client.createSession();
761
+
762
+ // Create a file to read via streaming
763
+ const streamReadContent =
764
+ "This file will be read via streaming\nLine 2\nLine 3";
765
+ await client.writeFile("stream-read-file.txt", streamReadContent);
766
+ console.log("✅ Test file created for streaming reading");
767
+
768
+ let readContent = "";
769
+ let readCompleted = false;
770
+
771
+ // Set up event handlers for streaming
772
+ client.setOnStreamEvent((event) => {
773
+ if (event.type === "command_complete" && event.content) {
774
+ readContent = event.content;
775
+ readCompleted = true;
776
+ }
777
+ });
778
+
779
+ console.log(" Starting streaming file reading...");
780
+ await client.readFileStream("stream-read-file.txt");
781
+ console.log("✅ Streaming file reading completed");
782
+
783
+ // Verify the content was read correctly
784
+ console.log(
785
+ "✅ Streaming read content verified:",
786
+ readContent === streamReadContent
787
+ );
788
+ console.log(" Content length:", readContent.length, "characters");
789
+
790
+ client.clearSession();
791
+ console.log("✅ Streaming file reading test completed\n");
792
+ } catch (error) {
793
+ console.error("❌ Test 28 failed:", error);
794
+ }
795
+
796
+ // Test 29: Quick streaming file reading
797
+ console.log("Test 29: Quick streaming file reading");
798
+ try {
799
+ // Create a file for quick streaming read
800
+ const quickReadContent = "Quick streaming read test content";
801
+ await quickWriteFile("quick-read-stream.txt", quickReadContent);
802
+ console.log("✅ Test file created for quick streaming reading");
803
+
804
+ let quickReadContentReceived = "";
805
+ let quickReadCompleted = false;
806
+
807
+ console.log(" Starting quick streaming file reading...");
808
+ await quickReadFileStream("quick-read-stream.txt", "utf-8", {
809
+ onStreamEvent: (event) => {
810
+ if (event.type === "command_complete" && event.content) {
811
+ quickReadContentReceived = event.content;
812
+ quickReadCompleted = true;
813
+ }
814
+ },
815
+ });
816
+ console.log("✅ Quick streaming file reading completed");
817
+
818
+ // Verify the content
819
+ console.log(
820
+ "✅ Quick streaming read verified:",
821
+ quickReadContentReceived === quickReadContent
822
+ );
823
+ console.log(" Content:", quickReadContentReceived);
824
+ console.log("✅ Quick streaming file reading test completed\n");
825
+ } catch (error) {
826
+ console.error("❌ Test 29 failed:", error);
827
+ }
828
+
829
+ // Test 30: File reading with session management
830
+ console.log("Test 30: File reading with session management");
831
+ try {
832
+ const client = createClient();
833
+ const sessionId = await client.createSession();
834
+
835
+ // Create a file in session
836
+ const sessionReadContent =
837
+ "This file was created and read with session management";
838
+ await client.writeFile(
839
+ "session-read-file.txt",
840
+ sessionReadContent,
841
+ "utf-8",
842
+ sessionId
843
+ );
844
+ console.log("✅ Session file created for reading");
845
+
846
+ // Read the file in the same session
847
+ const result = await client.readFile(
848
+ "session-read-file.txt",
849
+ "utf-8",
850
+ sessionId
851
+ );
852
+ console.log("✅ Session file read successfully:", result.success);
853
+ console.log(
854
+ "✅ Session file content verified:",
855
+ result.content === sessionReadContent
856
+ );
857
+ console.log(" Session ID:", sessionId);
858
+ console.log(" Content:", result.content);
859
+
860
+ client.clearSession();
861
+ console.log("✅ Session file reading test completed\n");
862
+ } catch (error) {
863
+ console.error("❌ Test 30 failed:", error);
864
+ }
865
+
866
+ // Test 31: Error handling for file reading
867
+ console.log("Test 31: Error handling for file reading");
868
+ try {
869
+ // Try to read a non-existent file
870
+ await quickReadFile("non-existent-read-file.txt");
871
+ console.log("❌ Should have failed for non-existent file");
872
+ } catch (error) {
873
+ console.log("✅ Error handling works for non-existent files");
874
+ console.log(
875
+ " Error:",
876
+ error instanceof Error ? error.message : "Unknown error"
877
+ );
878
+ }
879
+
880
+ try {
881
+ // Try to read from a dangerous path
882
+ await quickReadFile("/etc/passwd");
883
+ console.log("❌ Should have failed for dangerous path");
884
+ } catch (error) {
885
+ console.log("✅ Error handling works for dangerous paths");
886
+ console.log(
887
+ " Error:",
888
+ error instanceof Error ? error.message : "Unknown error"
889
+ );
890
+ }
891
+
892
+ try {
893
+ // Try to read with empty path
894
+ await quickReadFile("");
895
+ console.log("❌ Should have failed for empty path");
896
+ } catch (error) {
897
+ console.log("✅ Error handling works for empty paths");
898
+ console.log(
899
+ " Error:",
900
+ error instanceof Error ? error.message : "Unknown error",
901
+ "\n"
902
+ );
903
+ }
904
+
686
905
  console.log("🎉 All tests completed!");
687
906
  }
688
907
 
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { DurableObject } from \"cloudflare:workers\";\nimport type { Sandbox } from \"./index\";\n\ninterface ExecuteRequest {\n command: string;\n args?: string[];\n}\n\nexport interface ExecuteResponse {\n success: boolean;\n stdout: string;\n stderr: string;\n exitCode: number;\n command: string;\n args: string[];\n timestamp: string;\n}\n\ninterface SessionResponse {\n sessionId: string;\n message: string;\n timestamp: string;\n}\n\ninterface SessionListResponse {\n sessions: Array<{\n sessionId: string;\n hasActiveProcess: boolean;\n createdAt: string;\n }>;\n count: number;\n timestamp: string;\n}\n\ninterface CommandsResponse {\n availableCommands: string[];\n timestamp: string;\n}\n\ninterface GitCheckoutRequest {\n repoUrl: string;\n branch?: string;\n targetDir?: string;\n sessionId?: string;\n}\n\nexport interface GitCheckoutResponse {\n success: boolean;\n stdout: string;\n stderr: string;\n exitCode: number;\n repoUrl: string;\n branch: string;\n targetDir: string;\n timestamp: string;\n}\n\ninterface MkdirRequest {\n path: string;\n recursive?: boolean;\n sessionId?: string;\n}\n\nexport interface MkdirResponse {\n success: boolean;\n stdout: string;\n stderr: string;\n exitCode: number;\n path: string;\n recursive: boolean;\n timestamp: string;\n}\n\ninterface WriteFileRequest {\n path: string;\n content: string;\n encoding?: string;\n sessionId?: string;\n}\n\nexport interface WriteFileResponse {\n success: boolean;\n exitCode: number;\n path: string;\n timestamp: string;\n}\n\ninterface DeleteFileRequest {\n path: string;\n sessionId?: string;\n}\n\nexport interface DeleteFileResponse {\n success: boolean;\n exitCode: number;\n path: string;\n timestamp: string;\n}\n\ninterface RenameFileRequest {\n oldPath: string;\n newPath: string;\n sessionId?: string;\n}\n\nexport interface RenameFileResponse {\n success: boolean;\n exitCode: number;\n oldPath: string;\n newPath: string;\n timestamp: string;\n}\n\ninterface MoveFileRequest {\n sourcePath: string;\n destinationPath: string;\n sessionId?: string;\n}\n\nexport interface MoveFileResponse {\n success: boolean;\n exitCode: number;\n sourcePath: string;\n destinationPath: string;\n timestamp: string;\n}\n\ninterface PingResponse {\n message: string;\n timestamp: string;\n}\n\ninterface StreamEvent {\n type: \"command_start\" | \"output\" | \"command_complete\" | \"error\";\n command?: string;\n args?: string[];\n stream?: \"stdout\" | \"stderr\";\n data?: string;\n message?: string;\n path?: string;\n oldPath?: string;\n newPath?: string;\n sourcePath?: string;\n destinationPath?: string;\n success?: boolean;\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n error?: string;\n timestamp?: string;\n}\n\ninterface HttpClientOptions {\n stub?: Sandbox;\n baseUrl?: string;\n port?: number;\n onCommandStart?: (command: string, args: string[]) => void;\n onOutput?: (\n stream: \"stdout\" | \"stderr\",\n data: string,\n command: string\n ) => void;\n onCommandComplete?: (\n success: boolean,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n args: string[]\n ) => void;\n onError?: (error: string, command?: string, args?: string[]) => void;\n onStreamEvent?: (event: StreamEvent) => void;\n}\n\nexport class HttpClient {\n private baseUrl: string;\n private options: HttpClientOptions;\n private sessionId: string | null = null;\n\n constructor(options: HttpClientOptions = {}) {\n this.options = {\n ...options,\n };\n this.baseUrl = this.options.baseUrl!;\n }\n\n private async doFetch(\n path: string,\n options?: RequestInit\n ): Promise<Response> {\n if (this.options.stub) {\n return this.options.stub.containerFetch(path, options, this.options.port);\n }\n return fetch(this.baseUrl + path, options);\n }\n // Public methods to set event handlers\n setOnOutput(\n handler: (\n stream: \"stdout\" | \"stderr\",\n data: string,\n command: string\n ) => void\n ): void {\n this.options.onOutput = handler;\n }\n\n setOnCommandComplete(\n handler: (\n success: boolean,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n args: string[]\n ) => void\n ): void {\n this.options.onCommandComplete = handler;\n }\n\n setOnStreamEvent(handler: (event: StreamEvent) => void): void {\n this.options.onStreamEvent = handler;\n }\n\n // Public getter methods\n getOnOutput():\n | ((stream: \"stdout\" | \"stderr\", data: string, command: string) => void)\n | undefined {\n return this.options.onOutput;\n }\n\n getOnCommandComplete():\n | ((\n success: boolean,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n args: string[]\n ) => void)\n | undefined {\n return this.options.onCommandComplete;\n }\n\n getOnStreamEvent(): ((event: StreamEvent) => void) | undefined {\n return this.options.onStreamEvent;\n }\n\n async createSession(): Promise<string> {\n try {\n const response = await this.doFetch(`/api/session/create`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data: SessionResponse = await response.json();\n this.sessionId = data.sessionId;\n console.log(`[HTTP Client] Created session: ${this.sessionId}`);\n return this.sessionId;\n } catch (error) {\n console.error(\"[HTTP Client] Error creating session:\", error);\n throw error;\n }\n }\n\n async listSessions(): Promise<SessionListResponse> {\n try {\n const response = await this.doFetch(`/api/session/list`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data: SessionListResponse = await response.json();\n console.log(`[HTTP Client] Listed ${data.count} sessions`);\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error listing sessions:\", error);\n throw error;\n }\n }\n\n async execute(\n command: string,\n args: string[] = [],\n sessionId?: string\n ): Promise<ExecuteResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/execute`, {\n body: JSON.stringify({\n args,\n command,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: ExecuteResponse = await response.json();\n console.log(\n `[HTTP Client] Command executed: ${command}, Success: ${data.success}`\n );\n\n // Call the callback if provided\n this.options.onCommandComplete?.(\n data.success,\n data.exitCode,\n data.stdout,\n data.stderr,\n data.command,\n data.args\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error executing command:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n command,\n args\n );\n throw error;\n }\n }\n\n async executeStream(\n command: string,\n args: string[] = [],\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/execute/stream`, {\n body: JSON.stringify({\n args,\n command,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(`[HTTP Client] Stream event: ${event.type}`);\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Command started: ${\n event.command\n } ${event.args?.join(\" \")}`\n );\n this.options.onCommandStart?.(\n event.command!,\n event.args || []\n );\n break;\n\n case \"output\":\n console.log(`[${event.stream}] ${event.data}`);\n this.options.onOutput?.(\n event.stream!,\n event.data!,\n event.command!\n );\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Command completed: ${event.command}, Success: ${event.success}, Exit code: ${event.exitCode}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n event.exitCode!,\n event.stdout!,\n event.stderr!,\n event.command!,\n event.args || []\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Command error: ${event.error}`\n );\n this.options.onError?.(\n event.error!,\n event.command,\n event.args\n );\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming execution:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n command,\n args\n );\n throw error;\n }\n }\n\n async gitCheckout(\n repoUrl: string,\n branch: string = \"main\",\n targetDir?: string,\n sessionId?: string\n ): Promise<GitCheckoutResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/git/checkout`, {\n body: JSON.stringify({\n branch,\n repoUrl,\n sessionId: targetSessionId,\n targetDir,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: GitCheckoutResponse = await response.json();\n console.log(\n `[HTTP Client] Git checkout completed: ${repoUrl}, Success: ${data.success}, Target: ${data.targetDir}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error in git checkout:\", error);\n throw error;\n }\n }\n\n async gitCheckoutStream(\n repoUrl: string,\n branch: string = \"main\",\n targetDir?: string,\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/git/checkout/stream`, {\n body: JSON.stringify({\n branch,\n repoUrl,\n sessionId: targetSessionId,\n targetDir,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Git checkout stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Git checkout started: ${\n event.command\n } ${event.args?.join(\" \")}`\n );\n this.options.onCommandStart?.(\n event.command!,\n event.args || []\n );\n break;\n\n case \"output\":\n console.log(`[${event.stream}] ${event.data}`);\n this.options.onOutput?.(\n event.stream!,\n event.data!,\n event.command!\n );\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Git checkout completed: ${event.command}, Success: ${event.success}, Exit code: ${event.exitCode}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n event.exitCode!,\n event.stdout!,\n event.stderr!,\n event.command!,\n event.args || []\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Git checkout error: ${event.error}`\n );\n this.options.onError?.(\n event.error!,\n event.command,\n event.args\n );\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse git checkout stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming git checkout:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"git clone\",\n [branch, repoUrl, targetDir || \"\"]\n );\n throw error;\n }\n }\n\n async mkdir(\n path: string,\n recursive: boolean = false,\n sessionId?: string\n ): Promise<MkdirResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/mkdir`, {\n body: JSON.stringify({\n path,\n recursive,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: MkdirResponse = await response.json();\n console.log(\n `[HTTP Client] Directory created: ${path}, Success: ${data.success}, Recursive: ${data.recursive}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error creating directory:\", error);\n throw error;\n }\n }\n\n async mkdirStream(\n path: string,\n recursive: boolean = false,\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/mkdir/stream`, {\n body: JSON.stringify({\n path,\n recursive,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(`[HTTP Client] Mkdir stream event: ${event.type}`);\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Mkdir started: ${\n event.command\n } ${event.args?.join(\" \")}`\n );\n this.options.onCommandStart?.(\n event.command!,\n event.args || []\n );\n break;\n\n case \"output\":\n console.log(`[${event.stream}] ${event.data}`);\n this.options.onOutput?.(\n event.stream!,\n event.data!,\n event.command!\n );\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Mkdir completed: ${event.command}, Success: ${event.success}, Exit code: ${event.exitCode}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n event.exitCode!,\n event.stdout!,\n event.stderr!,\n event.command!,\n event.args || []\n );\n break;\n\n case \"error\":\n console.error(`[HTTP Client] Mkdir error: ${event.error}`);\n this.options.onError?.(\n event.error!,\n event.command,\n event.args\n );\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse mkdir stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming mkdir:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"mkdir\",\n recursive ? [\"-p\", path] : [path]\n );\n throw error;\n }\n }\n\n async writeFile(\n path: string,\n content: string,\n encoding: string = \"utf-8\",\n sessionId?: string\n ): Promise<WriteFileResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/write`, {\n body: JSON.stringify({\n content,\n encoding,\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: WriteFileResponse = await response.json();\n console.log(\n `[HTTP Client] File written: ${path}, Success: ${data.success}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error writing file:\", error);\n throw error;\n }\n }\n\n async writeFileStream(\n path: string,\n content: string,\n encoding: string = \"utf-8\",\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/write/stream`, {\n body: JSON.stringify({\n content,\n encoding,\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Write file stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Write file started: ${event.path}`\n );\n this.options.onCommandStart?.(\"write\", [\n path,\n content,\n encoding,\n ]);\n break;\n\n case \"output\":\n console.log(`[output] ${event.message}`);\n this.options.onOutput?.(\"stdout\", event.message!, \"write\");\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Write file completed: ${event.path}, Success: ${event.success}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n 0,\n \"\",\n \"\",\n \"write\",\n [path, content, encoding]\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Write file error: ${event.error}`\n );\n this.options.onError?.(event.error!, \"write\", [\n path,\n content,\n encoding,\n ]);\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse write file stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming write file:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"write\",\n [path, content, encoding]\n );\n throw error;\n }\n }\n\n async deleteFile(\n path: string,\n sessionId?: string\n ): Promise<DeleteFileResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/delete`, {\n body: JSON.stringify({\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: DeleteFileResponse = await response.json();\n console.log(\n `[HTTP Client] File deleted: ${path}, Success: ${data.success}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error deleting file:\", error);\n throw error;\n }\n }\n\n async deleteFileStream(path: string, sessionId?: string): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/delete/stream`, {\n body: JSON.stringify({\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Delete file stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Delete file started: ${event.path}`\n );\n this.options.onCommandStart?.(\"delete\", [path]);\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Delete file completed: ${event.path}, Success: ${event.success}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n 0,\n \"\",\n \"\",\n \"delete\",\n [path]\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Delete file error: ${event.error}`\n );\n this.options.onError?.(event.error!, \"delete\", [path]);\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse delete file stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming delete file:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"delete\",\n [path]\n );\n throw error;\n }\n }\n\n async renameFile(\n oldPath: string,\n newPath: string,\n sessionId?: string\n ): Promise<RenameFileResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/rename`, {\n body: JSON.stringify({\n newPath,\n oldPath,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: RenameFileResponse = await response.json();\n console.log(\n `[HTTP Client] File renamed: ${oldPath} -> ${newPath}, Success: ${data.success}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error renaming file:\", error);\n throw error;\n }\n }\n\n async renameFileStream(\n oldPath: string,\n newPath: string,\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/rename/stream`, {\n body: JSON.stringify({\n newPath,\n oldPath,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Rename file stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Rename file started: ${event.oldPath} -> ${event.newPath}`\n );\n this.options.onCommandStart?.(\"rename\", [oldPath, newPath]);\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Rename file completed: ${event.oldPath} -> ${event.newPath}, Success: ${event.success}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n 0,\n \"\",\n \"\",\n \"rename\",\n [oldPath, newPath]\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Rename file error: ${event.error}`\n );\n this.options.onError?.(event.error!, \"rename\", [\n oldPath,\n newPath,\n ]);\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse rename file stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming rename file:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"rename\",\n [oldPath, newPath]\n );\n throw error;\n }\n }\n\n async moveFile(\n sourcePath: string,\n destinationPath: string,\n sessionId?: string\n ): Promise<MoveFileResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/move`, {\n body: JSON.stringify({\n destinationPath,\n sessionId: targetSessionId,\n sourcePath,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: MoveFileResponse = await response.json();\n console.log(\n `[HTTP Client] File moved: ${sourcePath} -> ${destinationPath}, Success: ${data.success}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error moving file:\", error);\n throw error;\n }\n }\n\n async moveFileStream(\n sourcePath: string,\n destinationPath: string,\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/move/stream`, {\n body: JSON.stringify({\n destinationPath,\n sessionId: targetSessionId,\n sourcePath,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Move file stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Move file started: ${event.sourcePath} -> ${event.destinationPath}`\n );\n this.options.onCommandStart?.(\"move\", [\n sourcePath,\n destinationPath,\n ]);\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Move file completed: ${event.sourcePath} -> ${event.destinationPath}, Success: ${event.success}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n 0,\n \"\",\n \"\",\n \"move\",\n [sourcePath, destinationPath]\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Move file error: ${event.error}`\n );\n this.options.onError?.(event.error!, \"move\", [\n sourcePath,\n destinationPath,\n ]);\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse move file stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming move file:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"move\",\n [sourcePath, destinationPath]\n );\n throw error;\n }\n }\n\n async ping(): Promise<string> {\n try {\n const response = await this.doFetch(`/api/ping`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data: PingResponse = await response.json();\n console.log(`[HTTP Client] Ping response: ${data.message}`);\n return data.timestamp;\n } catch (error) {\n console.error(\"[HTTP Client] Error pinging server:\", error);\n throw error;\n }\n }\n\n async getCommands(): Promise<string[]> {\n try {\n const response = await fetch(`${this.baseUrl}/api/commands`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data: CommandsResponse = await response.json();\n console.log(\n `[HTTP Client] Available commands: ${data.availableCommands.length}`\n );\n return data.availableCommands;\n } catch (error) {\n console.error(\"[HTTP Client] Error getting commands:\", error);\n throw error;\n }\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n clearSession(): void {\n this.sessionId = null;\n }\n}\n\n// Example usage and utility functions\nexport function createClient(options?: HttpClientOptions): HttpClient {\n return new HttpClient(options);\n}\n\n// Convenience function for quick command execution\nexport async function quickExecute(\n command: string,\n args: string[] = [],\n options?: HttpClientOptions\n): Promise<ExecuteResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.execute(command, args);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming command execution\nexport async function quickExecuteStream(\n command: string,\n args: string[] = [],\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.executeStream(command, args);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick git checkout\nexport async function quickGitCheckout(\n repoUrl: string,\n branch: string = \"main\",\n targetDir?: string,\n options?: HttpClientOptions\n): Promise<GitCheckoutResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.gitCheckout(repoUrl, branch, targetDir);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick directory creation\nexport async function quickMkdir(\n path: string,\n recursive: boolean = false,\n options?: HttpClientOptions\n): Promise<MkdirResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.mkdir(path, recursive);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming git checkout\nexport async function quickGitCheckoutStream(\n repoUrl: string,\n branch: string = \"main\",\n targetDir?: string,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.gitCheckoutStream(repoUrl, branch, targetDir);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming directory creation\nexport async function quickMkdirStream(\n path: string,\n recursive: boolean = false,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.mkdirStream(path, recursive);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick file writing\nexport async function quickWriteFile(\n path: string,\n content: string,\n encoding: string = \"utf-8\",\n options?: HttpClientOptions\n): Promise<WriteFileResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.writeFile(path, content, encoding);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming file writing\nexport async function quickWriteFileStream(\n path: string,\n content: string,\n encoding: string = \"utf-8\",\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.writeFileStream(path, content, encoding);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick file deletion\nexport async function quickDeleteFile(\n path: string,\n options?: HttpClientOptions\n): Promise<DeleteFileResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.deleteFile(path);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming file deletion\nexport async function quickDeleteFileStream(\n path: string,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.deleteFileStream(path);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick file renaming\nexport async function quickRenameFile(\n oldPath: string,\n newPath: string,\n options?: HttpClientOptions\n): Promise<RenameFileResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.renameFile(oldPath, newPath);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming file renaming\nexport async function quickRenameFileStream(\n oldPath: string,\n newPath: string,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.renameFileStream(oldPath, newPath);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick file moving\nexport async function quickMoveFile(\n sourcePath: string,\n destinationPath: string,\n options?: HttpClientOptions\n): Promise<MoveFileResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.moveFile(sourcePath, destinationPath);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming file moving\nexport async function quickMoveFileStream(\n sourcePath: string,\n destinationPath: string,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.moveFileStream(sourcePath, destinationPath);\n } finally {\n client.clearSession();\n }\n}\n"],"mappings":"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","names":[]}