wuying-agentbay-sdk 0.10.2 → 0.11.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.
- package/dist/chunk-E7QC5S76.mjs +3143 -0
- package/dist/chunk-E7QC5S76.mjs.map +1 -0
- package/dist/chunk-ZUB35HKV.cjs +3134 -0
- package/dist/chunk-ZUB35HKV.cjs.map +1 -0
- package/dist/index.cjs +3588 -3921
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +2088 -687
- package/dist/index.d.ts +2088 -687
- package/dist/index.mjs +3556 -3889
- package/dist/index.mjs.map +1 -1
- package/dist/key-normalizer-AF7APGQZ.cjs +136 -0
- package/dist/key-normalizer-AF7APGQZ.cjs.map +1 -0
- package/dist/key-normalizer-QDBRLFHF.mjs +145 -0
- package/dist/key-normalizer-QDBRLFHF.mjs.map +1 -0
- package/dist/model-2G37RFQQ.cjs +188 -0
- package/dist/model-2G37RFQQ.cjs.map +1 -0
- package/dist/model-ZFTLKEMC.mjs +197 -0
- package/docs/api/README.md +26 -0
- package/docs/api/browser-use/browser.md +177 -0
- package/docs/api/browser-use/extension.md +284 -0
- package/docs/api/codespace/code.md +77 -0
- package/docs/api/common-features/advanced/agent.md +84 -0
- package/docs/api/common-features/advanced/oss.md +221 -0
- package/docs/api/common-features/basics/agentbay.md +181 -0
- package/docs/api/common-features/basics/command.md +83 -0
- package/docs/api/common-features/basics/context-manager.md +130 -0
- package/docs/api/common-features/basics/context-sync.md +51 -0
- package/docs/api/common-features/basics/context.md +348 -0
- package/docs/api/common-features/basics/filesystem.md +499 -0
- package/docs/api/common-features/basics/logging.md +77 -0
- package/docs/api/common-features/basics/session.md +412 -0
- package/docs/api/computer-use/computer.md +786 -0
- package/docs/api/mobile-use/mobile.md +395 -0
- package/docs/examples/README.md +332 -0
- package/docs/examples/basic-usage.ts +86 -0
- package/docs/examples/browser-use/browser/README.md +356 -0
- package/docs/examples/browser-use/browser/basic-usage.ts +136 -0
- package/docs/examples/browser-use/browser/browser-command-args.ts +117 -0
- package/docs/examples/browser-use/browser/browser-context-cookie-persistence.ts +348 -0
- package/docs/examples/browser-use/browser/browser-fingerprint-basic-usage.ts +121 -0
- package/docs/examples/browser-use/browser/browser-fingerprint-construct.ts +114 -0
- package/docs/examples/browser-use/browser/browser-fingerprint-local-sync.ts +98 -0
- package/docs/examples/browser-use/browser/browser-fingerprint-persistence.ts +242 -0
- package/docs/examples/browser-use/browser/browser-proxies.ts +149 -0
- package/docs/examples/browser-use/browser/browser-type-example.ts +266 -0
- package/docs/examples/browser-use/browser/browser-viewport.ts +129 -0
- package/docs/examples/browser-use/browser/call_for_user_jd.ts +184 -0
- package/docs/examples/browser-use/browser/captcha_tongcheng.ts +151 -0
- package/docs/examples/browser-use/browser/run-2048.ts +209 -0
- package/docs/examples/browser-use/browser/run-sudoku.ts +150 -0
- package/docs/examples/browser-use/browser/screenshot-example.ts +132 -0
- package/docs/examples/browser-use/extension-example/README.md +252 -0
- package/docs/examples/browser-use/extension-example/extension-example.ts +380 -0
- package/docs/examples/codespace/automation/automation-example.ts +322 -0
- package/docs/examples/common-features/advanced/agent-module-example/README.md +40 -0
- package/docs/examples/common-features/advanced/agent-module-example.ts +66 -0
- package/docs/examples/common-features/advanced/archive-upload-mode-example/README.md +212 -0
- package/docs/examples/common-features/advanced/archive-upload-mode-example/archive-upload-mode-example.ts +213 -0
- package/docs/examples/common-features/advanced/vpc-session-example/README.md +47 -0
- package/docs/examples/common-features/advanced/vpc-session-example.ts +106 -0
- package/docs/examples/common-features/basics/archive-upload-mode-example/README.md +236 -0
- package/docs/examples/common-features/basics/archive-upload-mode-example/main.ts +236 -0
- package/docs/examples/common-features/basics/command-example/README.md +47 -0
- package/docs/examples/common-features/basics/command-example/command-example.ts +153 -0
- package/docs/examples/common-features/basics/context-management/README.md +55 -0
- package/docs/examples/common-features/basics/context-management/context-management.ts +140 -0
- package/docs/examples/common-features/basics/data-persistence/README.md +129 -0
- package/docs/examples/common-features/basics/data-persistence/context-sync-demo.md +144 -0
- package/docs/examples/common-features/basics/data-persistence/context-sync-demo.ts +275 -0
- package/docs/examples/common-features/basics/data-persistence/data-persistence.ts +259 -0
- package/docs/examples/common-features/basics/data-persistence/recycle-policy-example.ts +294 -0
- package/docs/examples/common-features/basics/filesystem-example/README.md +57 -0
- package/docs/examples/common-features/basics/filesystem-example/filesystem-example.ts +164 -0
- package/docs/examples/common-features/basics/filesystem-example/filesystem-filetransfer-example.ts +153 -0
- package/docs/examples/common-features/basics/filesystem-example/watch-directory-example.ts +168 -0
- package/docs/examples/common-features/basics/get/README.md +136 -0
- package/docs/examples/common-features/basics/get/main.ts +79 -0
- package/docs/examples/common-features/basics/list_sessions/README.md +54 -0
- package/docs/examples/common-features/basics/list_sessions/main.ts +258 -0
- package/docs/examples/common-features/basics/mcp_tool_direct_call/README.md +142 -0
- package/docs/examples/common-features/basics/mcp_tool_direct_call/main.ts +135 -0
- package/docs/examples/common-features/basics/session-creation/README.md +28 -0
- package/docs/examples/common-features/basics/session-creation/session-creation.ts +295 -0
- package/docs/examples/mobile-use/mobile-get-adb-url/README.md +92 -0
- package/docs/examples/mobile-use/mobile-get-adb-url/index.ts +80 -0
- package/docs/examples/mobile-use/mobile-get-adb-url/package-lock.json +279 -0
- package/docs/examples/mobile-use/mobile-get-adb-url/package.json +18 -0
- package/package.json +18 -11
- package/dist/application-KZWXH46T.mjs +0 -17
- package/dist/application-LMA7KSRH.cjs +0 -8
- package/dist/application-LMA7KSRH.cjs.map +0 -1
- package/dist/chunk-BQNGKBQF.mjs +0 -386
- package/dist/chunk-BQNGKBQF.mjs.map +0 -1
- package/dist/chunk-IOVGAAJL.cjs +0 -558
- package/dist/chunk-IOVGAAJL.cjs.map +0 -1
- package/dist/chunk-UF2TC2R4.mjs +0 -567
- package/dist/chunk-UF2TC2R4.mjs.map +0 -1
- package/dist/chunk-X6MS7Z5L.cjs +0 -377
- package/dist/chunk-X6MS7Z5L.cjs.map +0 -1
- package/dist/window-DH37ZDD5.mjs +0 -17
- package/dist/window-DH37ZDD5.mjs.map +0 -1
- package/dist/window-U7N3H735.cjs +0 -8
- package/dist/window-U7N3H735.cjs.map +0 -1
- /package/dist/{application-KZWXH46T.mjs.map → model-ZFTLKEMC.mjs.map} +0 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { AgentBay, ContextSync, CreateSessionParams, newSyncPolicyWithDefaults } from 'wuying-agentbay-sdk';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Context Sync Dual-Mode Example for TypeScript SDK
|
|
5
|
+
*
|
|
6
|
+
* This example demonstrates the dual-mode context.sync() functionality:
|
|
7
|
+
* 1. Async mode with callback - immediate return, result handled via callback
|
|
8
|
+
* 2. Sync mode with await - waits for completion before returning
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
async function contextSyncWithCallbackDemo(agentBay: AgentBay): Promise<void> {
|
|
12
|
+
console.log("🔄 Starting context sync with callback demo...");
|
|
13
|
+
|
|
14
|
+
// Step 1: Create context for persistent storage
|
|
15
|
+
console.log("\n📦 Creating context for persistent storage...");
|
|
16
|
+
const contextResult = await agentBay.context.get("sync-callback-demo", true);
|
|
17
|
+
if (!contextResult.success) {
|
|
18
|
+
throw new Error(`Context creation failed: ${contextResult.errorMessage}`);
|
|
19
|
+
}
|
|
20
|
+
const context = contextResult.context!;
|
|
21
|
+
console.log(`✅ Context created: ${context.id}`);
|
|
22
|
+
|
|
23
|
+
// Step 2: Create session with context sync
|
|
24
|
+
console.log("\n📦 Creating session with context sync...");
|
|
25
|
+
const syncPolicy = newSyncPolicyWithDefaults();
|
|
26
|
+
const contextSync = new ContextSync(
|
|
27
|
+
context.id,
|
|
28
|
+
"/tmp/sync_data",
|
|
29
|
+
syncPolicy
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
const params: CreateSessionParams = {
|
|
33
|
+
contextSync: [contextSync]
|
|
34
|
+
};
|
|
35
|
+
const sessionResult = await agentBay.create(params);
|
|
36
|
+
if (!sessionResult.success) {
|
|
37
|
+
throw new Error(`Failed to create session: ${sessionResult.errorMessage}`);
|
|
38
|
+
}
|
|
39
|
+
const session = sessionResult.session!;
|
|
40
|
+
console.log(`✅ Session created: ${session.getSessionId()}`);
|
|
41
|
+
|
|
42
|
+
// Step 3: Create test data
|
|
43
|
+
console.log("\n💾 Creating test data...");
|
|
44
|
+
await session.command.executeCommand("mkdir -p /tmp/sync_data/test_files");
|
|
45
|
+
|
|
46
|
+
const testFiles = [
|
|
47
|
+
{
|
|
48
|
+
path: "/tmp/sync_data/test_files/small.txt",
|
|
49
|
+
content: "Small test file content\n".repeat(10)
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
path: "/tmp/sync_data/test_files/medium.txt",
|
|
53
|
+
content: "Medium test file content\n".repeat(100)
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
path: "/tmp/sync_data/config.json",
|
|
57
|
+
content: JSON.stringify({
|
|
58
|
+
sync_demo: true,
|
|
59
|
+
created_at: new Date().toISOString(),
|
|
60
|
+
session_id: session.getSessionId()
|
|
61
|
+
}, null, 2)
|
|
62
|
+
}
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
let createdFiles = 0;
|
|
66
|
+
for (const file of testFiles) {
|
|
67
|
+
const writeResult = await session.fileSystem.writeFile(file.path, file.content);
|
|
68
|
+
if (writeResult.success) {
|
|
69
|
+
console.log(`✅ Created file: ${file.path}`);
|
|
70
|
+
createdFiles++;
|
|
71
|
+
} else {
|
|
72
|
+
console.log(`❌ Failed to create file ${file.path}: ${writeResult.errorMessage}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
console.log(`📊 Created ${createdFiles}/${testFiles.length} test files`);
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
// Method 1: Async interface with callback
|
|
80
|
+
console.log("\n📞 Calling context.sync() with callback...");
|
|
81
|
+
const syncStartTime = Date.now();
|
|
82
|
+
|
|
83
|
+
// Use callback mode - function returns immediately
|
|
84
|
+
const syncResult = await session.context.sync(
|
|
85
|
+
undefined, // contextId
|
|
86
|
+
undefined, // path
|
|
87
|
+
undefined, // mode
|
|
88
|
+
(success: boolean) => {
|
|
89
|
+
console.log("Callback called ==============");
|
|
90
|
+
const callbackTime = Date.now();
|
|
91
|
+
const duration = callbackTime - syncStartTime;
|
|
92
|
+
|
|
93
|
+
if (success) {
|
|
94
|
+
console.log(`✅ Context sync completed successfully in ${duration}ms`);
|
|
95
|
+
} else {
|
|
96
|
+
console.log(`❌ Context sync completed with failures in ${duration}ms`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Delete session in callback
|
|
100
|
+
console.log("🗑️ Deleting session from callback...");
|
|
101
|
+
session.delete(false) // Don't sync again since we already did
|
|
102
|
+
.then(() => {
|
|
103
|
+
console.log("✅ Session deleted successfully from callback");
|
|
104
|
+
})
|
|
105
|
+
.catch((error: any) => {
|
|
106
|
+
console.error("❌ Failed to delete session from callback:", error);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
console.log(`📤 Sync initiation result: success=${syncResult.success}, requestId=${syncResult.requestId}`);
|
|
112
|
+
console.log("⏳ Waiting for callback to complete...");
|
|
113
|
+
|
|
114
|
+
// Wait a bit for the callback to complete
|
|
115
|
+
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
116
|
+
|
|
117
|
+
} catch (error) {
|
|
118
|
+
console.error("❌ Context sync with callback failed:", error);
|
|
119
|
+
// Clean up session
|
|
120
|
+
try {
|
|
121
|
+
await session.delete(false);
|
|
122
|
+
console.log("✅ Session cleaned up after error");
|
|
123
|
+
} catch (deleteError) {
|
|
124
|
+
console.error("❌ Failed to clean up session:", deleteError);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function contextSyncDemo(agentBay: AgentBay): Promise<void> {
|
|
130
|
+
console.log("🔄 Starting context sync demo...");
|
|
131
|
+
|
|
132
|
+
// Step 1: Create context for persistent storage
|
|
133
|
+
console.log("\n📦 Creating context for persistent storage...");
|
|
134
|
+
const contextResult = await agentBay.context.get("sync-await-demo", true);
|
|
135
|
+
if (!contextResult.success) {
|
|
136
|
+
throw new Error(`Context creation failed: ${contextResult.errorMessage}`);
|
|
137
|
+
}
|
|
138
|
+
const context = contextResult.context!;
|
|
139
|
+
console.log(`✅ Context created: ${context.id}`);
|
|
140
|
+
|
|
141
|
+
// Step 2: Create session with context sync
|
|
142
|
+
console.log("\n📦 Creating session with context sync...");
|
|
143
|
+
const syncPolicy = newSyncPolicyWithDefaults();
|
|
144
|
+
const contextSync = new ContextSync(
|
|
145
|
+
context.id,
|
|
146
|
+
"/tmp/sync_data",
|
|
147
|
+
syncPolicy
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const params: CreateSessionParams = {
|
|
151
|
+
contextSync: [contextSync]
|
|
152
|
+
};
|
|
153
|
+
const sessionResult = await agentBay.create(params);
|
|
154
|
+
if (!sessionResult.success) {
|
|
155
|
+
throw new Error(`Failed to create session: ${sessionResult.errorMessage}`);
|
|
156
|
+
}
|
|
157
|
+
const session = sessionResult.session!;
|
|
158
|
+
console.log(`✅ Session created: ${session.getSessionId()}`);
|
|
159
|
+
|
|
160
|
+
// Step 3: Create test data
|
|
161
|
+
console.log("\n💾 Creating test data...");
|
|
162
|
+
await session.command.executeCommand("mkdir -p /tmp/sync_data/test_files");
|
|
163
|
+
|
|
164
|
+
const testFiles = [
|
|
165
|
+
{
|
|
166
|
+
path: "/tmp/sync_data/test_files/small.txt",
|
|
167
|
+
content: "Small test file content\n".repeat(10)
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
path: "/tmp/sync_data/test_files/medium.txt",
|
|
171
|
+
content: "Medium test file content\n".repeat(100)
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
path: "/tmp/sync_data/config.json",
|
|
175
|
+
content: JSON.stringify({
|
|
176
|
+
sync_demo: true,
|
|
177
|
+
created_at: new Date().toISOString(),
|
|
178
|
+
session_id: session.getSessionId()
|
|
179
|
+
}, null, 2)
|
|
180
|
+
}
|
|
181
|
+
];
|
|
182
|
+
|
|
183
|
+
let createdFiles = 0;
|
|
184
|
+
for (const file of testFiles) {
|
|
185
|
+
const writeResult = await session.fileSystem.writeFile(file.path, file.content);
|
|
186
|
+
if (writeResult.success) {
|
|
187
|
+
console.log(`✅ Created file: ${file.path}`);
|
|
188
|
+
createdFiles++;
|
|
189
|
+
} else {
|
|
190
|
+
console.log(`❌ Failed to create file ${file.path}: ${writeResult.errorMessage}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
console.log(`📊 Created ${createdFiles}/${testFiles.length} test files`);
|
|
195
|
+
|
|
196
|
+
try {
|
|
197
|
+
// Method 2: Sync interface with await
|
|
198
|
+
console.log("\n⏳ Calling context.sync() with await...");
|
|
199
|
+
const syncStartTime = Date.now();
|
|
200
|
+
|
|
201
|
+
// Use await mode - function waits for completion
|
|
202
|
+
const syncResult = await session.context.sync();
|
|
203
|
+
|
|
204
|
+
const syncDuration = Date.now() - syncStartTime;
|
|
205
|
+
|
|
206
|
+
if (syncResult.success) {
|
|
207
|
+
console.log(`✅ Context sync completed successfully in ${syncDuration}ms`);
|
|
208
|
+
} else {
|
|
209
|
+
console.log(`❌ Context sync completed with failures in ${syncDuration}ms`);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
console.log(`📤 Sync result: success=${syncResult.success}, requestId=${syncResult.requestId}`);
|
|
213
|
+
|
|
214
|
+
// Delete session
|
|
215
|
+
console.log("🗑️ Deleting session...");
|
|
216
|
+
await session.delete(false); // Don't sync again since we already did
|
|
217
|
+
console.log("✅ Session deleted successfully");
|
|
218
|
+
|
|
219
|
+
} catch (error) {
|
|
220
|
+
console.error("❌ Context sync failed:", error);
|
|
221
|
+
// Clean up session
|
|
222
|
+
try {
|
|
223
|
+
await session.delete(false);
|
|
224
|
+
console.log("✅ Session cleaned up after error");
|
|
225
|
+
} catch (deleteError) {
|
|
226
|
+
console.error("❌ Failed to clean up session:", deleteError);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async function main(): Promise<void> {
|
|
232
|
+
console.log("🔄 AgentBay Context Sync Dual-Mode Example (TypeScript)");
|
|
233
|
+
|
|
234
|
+
// Initialize AgentBay client
|
|
235
|
+
const agentBay = new AgentBay();
|
|
236
|
+
|
|
237
|
+
try {
|
|
238
|
+
// Method 1: Async interface with callback
|
|
239
|
+
console.log("\n" + "=".repeat(60));
|
|
240
|
+
console.log("🔄 Method 1: context_sync_with_callback (Async with callback)");
|
|
241
|
+
console.log("=".repeat(60));
|
|
242
|
+
|
|
243
|
+
// Start the first demo without waiting for it to complete
|
|
244
|
+
const callbackPromise = contextSyncWithCallbackDemo(agentBay);
|
|
245
|
+
console.log("contextSyncWithCallbackDemo started (not awaited)");
|
|
246
|
+
console.log("=".repeat(60));
|
|
247
|
+
|
|
248
|
+
// Sleep 3 seconds
|
|
249
|
+
console.log("\n⏳ Sleeping 3 seconds before next demo...");
|
|
250
|
+
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
251
|
+
|
|
252
|
+
// Method 2: Sync interface with await
|
|
253
|
+
console.log("\n" + "=".repeat(60));
|
|
254
|
+
console.log("🔄 Method 2: context_sync (Sync with await)");
|
|
255
|
+
console.log("=".repeat(60));
|
|
256
|
+
await contextSyncDemo(agentBay); // With await
|
|
257
|
+
|
|
258
|
+
// Wait for the first demo to complete
|
|
259
|
+
console.log("\n⏳ Waiting for callback demo to complete...");
|
|
260
|
+
await callbackPromise;
|
|
261
|
+
|
|
262
|
+
} catch (error) {
|
|
263
|
+
console.error("❌ Example execution failed:", error);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
console.log("✅ Context sync dual-mode example completed");
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Run the example
|
|
270
|
+
if (require.main === module) {
|
|
271
|
+
main().catch(console.error);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export { contextSyncDemo, contextSyncWithCallbackDemo, main };
|
|
275
|
+
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* AgentBay SDK - Data Persistence Example
|
|
5
|
+
*
|
|
6
|
+
* This example demonstrates real data persistence functionality:
|
|
7
|
+
* - Context creation for persistent storage
|
|
8
|
+
* - File persistence across multiple sessions
|
|
9
|
+
* - Context synchronization and file sharing
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { CreateSessionParams } from 'wuying-agentbay-sdk';
|
|
13
|
+
import { AgentBay, ContextSync, logError, newSyncPolicy } from 'wuying-agentbay-sdk';
|
|
14
|
+
|
|
15
|
+
async function main(): Promise<void> {
|
|
16
|
+
console.log('🗄️ AgentBay Data Persistence Example');
|
|
17
|
+
|
|
18
|
+
// Initialize AgentBay client
|
|
19
|
+
const apiKey = process.env.AGENTBAY_API_KEY || '';
|
|
20
|
+
if (!apiKey) {
|
|
21
|
+
console.log('❌ Please set AGENTBAY_API_KEY environment variable');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const agentBay = new AgentBay({ apiKey });
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
// Run the complete data persistence demonstration
|
|
29
|
+
await dataPersistenceDemo(agentBay);
|
|
30
|
+
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.log(`❌ Example execution failed: ${error}`);
|
|
33
|
+
logError('Error:', error);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
console.log('✅ Data persistence example completed');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function dataPersistenceDemo(agentBay: AgentBay): Promise<void> {
|
|
40
|
+
console.log('\n🔄 === Data Persistence Demonstration ===');
|
|
41
|
+
|
|
42
|
+
// Step 1: Create a context for persistent storage
|
|
43
|
+
console.log('\n📦 Step 1: Creating context for persistent storage...');
|
|
44
|
+
const contextResult = await agentBay.context.get('persistence-demo', true);
|
|
45
|
+
|
|
46
|
+
if (!contextResult.success) {
|
|
47
|
+
console.log(`❌ Context creation failed: ${contextResult.errorMessage}`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const context = contextResult.context;
|
|
52
|
+
console.log(`✅ Context created successfully: ${context.id}`);
|
|
53
|
+
console.log(` Name: ${context.name}`);
|
|
54
|
+
|
|
55
|
+
// Step 2: Create first session with context sync
|
|
56
|
+
console.log('\n🔧 Step 2: Creating first session with context synchronization...');
|
|
57
|
+
|
|
58
|
+
// Create sync policy for context synchronization
|
|
59
|
+
const syncPolicy = newSyncPolicy();
|
|
60
|
+
|
|
61
|
+
// Create context sync configuration
|
|
62
|
+
const contextSync = new ContextSync(
|
|
63
|
+
context.id,
|
|
64
|
+
'/tmp/persistent_data', // Mount context to this path in session
|
|
65
|
+
syncPolicy
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
// Create session with context sync
|
|
69
|
+
const params1: CreateSessionParams = {
|
|
70
|
+
contextSync: [contextSync]
|
|
71
|
+
};
|
|
72
|
+
const session1Result = await agentBay.create(params1);
|
|
73
|
+
|
|
74
|
+
if (!session1Result.success) {
|
|
75
|
+
console.log(`❌ First session creation failed: ${session1Result.errorMessage}`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const session1 = session1Result.session;
|
|
80
|
+
console.log(`✅ First session created successfully: ${session1.sessionId}`);
|
|
81
|
+
|
|
82
|
+
let session1Id = '';
|
|
83
|
+
try {
|
|
84
|
+
session1Id = session1.sessionId;
|
|
85
|
+
|
|
86
|
+
// Step 3: Write persistent data in first session
|
|
87
|
+
console.log('\n💾 Step 3: Writing persistent data in first session...');
|
|
88
|
+
|
|
89
|
+
// Create directory structure
|
|
90
|
+
await session1.command.executeCommand('mkdir -p /tmp/persistent_data/config');
|
|
91
|
+
await session1.command.executeCommand('mkdir -p /tmp/persistent_data/logs');
|
|
92
|
+
|
|
93
|
+
// Write configuration file
|
|
94
|
+
const configData = {
|
|
95
|
+
app_name: 'AgentBay Demo',
|
|
96
|
+
version: '1.0.0',
|
|
97
|
+
created_at: new Date().toISOString(),
|
|
98
|
+
session_id: session1.sessionId,
|
|
99
|
+
features: ['data_persistence', 'context_sync', 'multi_session']
|
|
100
|
+
};
|
|
101
|
+
const configContent = JSON.stringify(configData, null, 2);
|
|
102
|
+
|
|
103
|
+
const configResult = await session1.fileSystem.writeFile('/tmp/persistent_data/config/app.json', configContent);
|
|
104
|
+
if (configResult.success) {
|
|
105
|
+
console.log('✅ Configuration file written successfully');
|
|
106
|
+
} else {
|
|
107
|
+
console.log(`❌ Failed to write config file: ${configResult.errorMessage}`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Write a log file
|
|
111
|
+
const logContent = `Application Log - Session 1
|
|
112
|
+
Created: ${new Date().toISOString()}
|
|
113
|
+
Session ID: ${session1.sessionId}
|
|
114
|
+
Operation: Data persistence demonstration
|
|
115
|
+
Status: Files created successfully
|
|
116
|
+
`;
|
|
117
|
+
|
|
118
|
+
const logResult = await session1.fileSystem.writeFile('/tmp/persistent_data/logs/session1.log', logContent);
|
|
119
|
+
if (logResult.success) {
|
|
120
|
+
console.log('✅ Log file written successfully');
|
|
121
|
+
} else {
|
|
122
|
+
console.log(`❌ Failed to write log file: ${logResult.errorMessage}`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Write a data file
|
|
126
|
+
const dataContent = 'This is persistent data that should be available across sessions.\nIt demonstrates the context synchronization functionality.';
|
|
127
|
+
|
|
128
|
+
const dataResult = await session1.fileSystem.writeFile('/tmp/persistent_data/shared_data.txt', dataContent);
|
|
129
|
+
if (dataResult.success) {
|
|
130
|
+
console.log('✅ Data file written successfully');
|
|
131
|
+
} else {
|
|
132
|
+
console.log(`❌ Failed to write data file: ${dataResult.errorMessage}`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// List files to verify
|
|
136
|
+
console.log('\n📋 Files created in first session:');
|
|
137
|
+
const listResult = await session1.command.executeCommand('find /tmp/persistent_data -type f -ls');
|
|
138
|
+
if (listResult.success) {
|
|
139
|
+
console.log(listResult.output);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
} finally {
|
|
144
|
+
// Clean up first session
|
|
145
|
+
console.log('\n🧹 Cleaning up first session...');
|
|
146
|
+
const deleteResult1 = await agentBay.delete(session1, true); // Sync before deletion
|
|
147
|
+
if (deleteResult1.success) {
|
|
148
|
+
console.log('✅ First session deleted successfully (with context sync)');
|
|
149
|
+
} else {
|
|
150
|
+
console.log(`❌ First session deletion failed: ${deleteResult1.errorMessage}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Step 4: Create second session to verify persistence
|
|
155
|
+
console.log('\n🔧 Step 4: Creating second session to verify data persistence...');
|
|
156
|
+
|
|
157
|
+
// Create second session with same context sync
|
|
158
|
+
const params2: CreateSessionParams = {
|
|
159
|
+
contextSync: [contextSync]
|
|
160
|
+
};
|
|
161
|
+
const session2Result = await agentBay.create(params2);
|
|
162
|
+
|
|
163
|
+
if (!session2Result.success) {
|
|
164
|
+
console.log(`❌ Second session creation failed: ${session2Result.errorMessage}`);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const session2 = session2Result.session;
|
|
169
|
+
console.log(`✅ Second session created successfully: ${session2.sessionId}`);
|
|
170
|
+
|
|
171
|
+
try {
|
|
172
|
+
// Step 5: Verify persistent data in second session
|
|
173
|
+
console.log('\n🔍 Step 5: Verifying persistent data in second session...');
|
|
174
|
+
|
|
175
|
+
// Note: agent_bay.create() already waits for context synchronization to complete
|
|
176
|
+
console.log('✅ Context synchronization completed (handled by agentBay.create())');
|
|
177
|
+
|
|
178
|
+
// Check if files exist
|
|
179
|
+
const filesToCheck = [
|
|
180
|
+
'/tmp/persistent_data/config/app.json',
|
|
181
|
+
'/tmp/persistent_data/logs/session1.log',
|
|
182
|
+
'/tmp/persistent_data/shared_data.txt'
|
|
183
|
+
];
|
|
184
|
+
|
|
185
|
+
let persistentFilesFound = 0;
|
|
186
|
+
|
|
187
|
+
for (const filePath of filesToCheck) {
|
|
188
|
+
console.log(`\n🔍 Checking file: ${filePath}`);
|
|
189
|
+
const readResult = await session2.fileSystem.readFile(filePath);
|
|
190
|
+
|
|
191
|
+
if (readResult.success) {
|
|
192
|
+
console.log('✅ File found and readable!');
|
|
193
|
+
if (filePath.endsWith('.json')) {
|
|
194
|
+
try {
|
|
195
|
+
const data = JSON.parse(readResult.content);
|
|
196
|
+
console.log(` 📄 Config data: ${data.app_name} v${data.version}`);
|
|
197
|
+
console.log(` 🕒 Created by session: ${data.session_id}`);
|
|
198
|
+
} catch {
|
|
199
|
+
console.log(` 📄 Content: ${readResult.content.substring(0, 100)}...`);
|
|
200
|
+
}
|
|
201
|
+
} else {
|
|
202
|
+
console.log(` 📄 Content preview: ${readResult.content.substring(0, 100)}...`);
|
|
203
|
+
}
|
|
204
|
+
persistentFilesFound++;
|
|
205
|
+
} else {
|
|
206
|
+
console.log(`❌ File not found or not readable: ${readResult.errorMessage}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Add new data in second session
|
|
211
|
+
console.log('\n💾 Adding new data in second session...');
|
|
212
|
+
const session2Log = `Application Log - Session 2
|
|
213
|
+
Created: ${new Date().toISOString()}
|
|
214
|
+
Session ID: ${session2.sessionId}
|
|
215
|
+
Operation: Data persistence verification
|
|
216
|
+
Persistent files found: ${persistentFilesFound}/${filesToCheck.length}
|
|
217
|
+
Status: Persistence verification completed
|
|
218
|
+
`;
|
|
219
|
+
|
|
220
|
+
const session2Result = await session2.fileSystem.writeFile('/tmp/persistent_data/logs/session2.log', session2Log);
|
|
221
|
+
if (session2Result.success) {
|
|
222
|
+
console.log('✅ Second session log written successfully');
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Summary
|
|
226
|
+
console.log('\n📊 === Persistence Verification Summary ===');
|
|
227
|
+
console.log(`✅ Context ID: ${context.id}`);
|
|
228
|
+
console.log(`✅ First session: ${session1Id} (deleted)`);
|
|
229
|
+
console.log(`✅ Second session: ${session2.sessionId} (active)`);
|
|
230
|
+
console.log(`✅ Persistent files found: ${persistentFilesFound}/${filesToCheck.length}`);
|
|
231
|
+
|
|
232
|
+
if (persistentFilesFound === filesToCheck.length) {
|
|
233
|
+
console.log('🎉 Data persistence verification SUCCESSFUL!');
|
|
234
|
+
console.log(' Files created in first session are accessible in second session');
|
|
235
|
+
} else {
|
|
236
|
+
console.log('⚠️ Data persistence verification PARTIAL');
|
|
237
|
+
console.log(' Some files may still be syncing or failed to persist');
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
} finally {
|
|
241
|
+
// Clean up second session
|
|
242
|
+
console.log('\n🧹 Cleaning up second session...');
|
|
243
|
+
const deleteResult2 = await agentBay.delete(session2, true);
|
|
244
|
+
if (deleteResult2.success) {
|
|
245
|
+
console.log('✅ Second session deleted successfully (with context sync)');
|
|
246
|
+
} else {
|
|
247
|
+
console.log(`❌ Second session deletion failed: ${deleteResult2.errorMessage}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
// Execute the main function
|
|
254
|
+
if (require.main === module) {
|
|
255
|
+
main().catch(error => {
|
|
256
|
+
logError('Error in main execution:', error);
|
|
257
|
+
process.exit(1);
|
|
258
|
+
});
|
|
259
|
+
}
|