@poncho-ai/harness 0.15.0 → 0.16.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @poncho-ai/harness@0.15.0 build /home/runner/work/poncho-ai/poncho-ai/packages/harness
2
+ > @poncho-ai/harness@0.16.0 build /Users/cesar/Dev/latitude/poncho-ai/packages/harness
3
3
  > tsup src/index.ts --format esm --dts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -7,8 +7,8 @@
7
7
  CLI tsup v8.5.1
8
8
  CLI Target: es2022
9
9
  ESM Build start
10
- ESM dist/index.js 182.55 KB
11
- ESM ⚡️ Build success in 144ms
10
+ ESM dist/index.js 185.71 KB
11
+ ESM ⚡️ Build success in 140ms
12
12
  DTS Build start
13
- DTS ⚡️ Build success in 6528ms
14
- DTS dist/index.d.ts 22.34 KB
13
+ DTS ⚡️ Build success in 7525ms
14
+ DTS dist/index.d.ts 22.38 KB
@@ -0,0 +1,6 @@
1
+
2
+ > @poncho-ai/harness@0.11.2 lint /Users/cesar/Dev/latitude/poncho-ai/packages/harness
3
+ > eslint src/
4
+
5
+ sh: eslint: command not found
6
+  ELIFECYCLE  Command failed.
@@ -0,0 +1,139 @@
1
+
2
+ > @poncho-ai/harness@0.14.2 test /Users/cesar/Dev/latitude/poncho-ai/packages/harness
3
+ > vitest
4
+
5
+
6
+  RUN  v1.6.1 /Users/cesar/Dev/latitude/poncho-ai/packages/harness
7
+
8
+ [event] step:completed {"type":"step:completed","step":1,"duration":1}
9
+ ✓ test/telemetry.test.ts  (3 tests) 3ms
10
+ [event] step:started {"type":"step:started","step":2}
11
+ ✓ test/schema-converter.test.ts  (27 tests) 16ms
12
+ stdout | test/mcp.test.ts > mcp bridge protocol transports > discovers and calls tools over streamable HTTP
13
+ [poncho][mcp] {"event":"catalog.loaded","server":"remote","discoveredCount":1}
14
+ [poncho][mcp] {"event":"tools.selected","requestedPatternCount":1,"registeredCount":1,"filteredByPolicyCount":0,"filteredByIntentCount":0}
15
+
16
+ ✓ test/agent-parser.test.ts  (10 tests) 17ms
17
+ ✓ test/memory.test.ts  (4 tests) 16ms
18
+ stdout | test/mcp.test.ts > mcp bridge protocol transports > selects discovered tools by requested patterns
19
+ [poncho][mcp] {"event":"catalog.loaded","server":"remote","discoveredCount":2}
20
+ [poncho][mcp] {"event":"tools.selected","requestedPatternCount":1,"registeredCount":1,"filteredByPolicyCount":0,"filteredByIntentCount":1}
21
+ [poncho][mcp] {"event":"tools.selected","requestedPatternCount":1,"registeredCount":2,"filteredByPolicyCount":0,"filteredByIntentCount":0}
22
+
23
+ stdout | test/mcp.test.ts > mcp bridge protocol transports > skips discovery when bearer token env value is missing
24
+ [poncho][mcp] {"event":"tools.selected","requestedPatternCount":1,"registeredCount":0,"filteredByPolicyCount":0,"filteredByIntentCount":0}
25
+
26
+ stderr | test/mcp.test.ts > mcp bridge protocol transports > skips discovery when bearer token env value is missing
27
+ [poncho][mcp] {"event":"auth.token_missing","server":"remote","tokenEnv":"MISSING_TOKEN_ENV"}
28
+
29
+ stdout | test/mcp.test.ts > mcp bridge protocol transports > returns actionable errors for 403 permission failures
30
+ [poncho][mcp] {"event":"catalog.loaded","server":"remote","discoveredCount":1}
31
+ [poncho][mcp] {"event":"tools.selected","requestedPatternCount":1,"registeredCount":1,"filteredByPolicyCount":0,"filteredByIntentCount":0}
32
+
33
+ ✓ test/mcp.test.ts  (6 tests) 97ms
34
+ ✓ test/state.test.ts  (5 tests) 217ms
35
+ ✓ test/agent-identity.test.ts  (2 tests) 15ms
36
+ ✓ test/model-factory.test.ts  (4 tests) 3ms
37
+ stdout | test/harness.test.ts > agent harness > registers default filesystem tools
38
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
39
+
40
+ stdout | test/harness.test.ts > agent harness > disables write_file by default in production environment
41
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
42
+
43
+ stdout | test/harness.test.ts > agent harness > allows disabling built-in tools via poncho.config.js
44
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
45
+
46
+ stdout | test/harness.test.ts > agent harness > supports per-environment tool overrides
47
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
48
+
49
+ stdout | test/harness.test.ts > agent harness > supports per-environment tool overrides
50
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
51
+
52
+ stdout | test/harness.test.ts > agent harness > does not auto-register exported tool objects from skill scripts
53
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
54
+
55
+ stdout | test/harness.test.ts > agent harness > refreshes skill metadata and tools in development mode
56
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
57
+
58
+ stdout | test/harness.test.ts > agent harness > refreshes skill metadata and tools in development mode
59
+ [poncho][mcp] {"event":"tools.cleared","reason":"skills:changed","requestedPatterns":[]}
60
+
61
+ stdout | test/harness.test.ts > agent harness > refreshes skill metadata and tools in development mode
62
+ [poncho][mcp] {"event":"tools.cleared","reason":"activate:beta","requestedPatterns":[]}
63
+
64
+ stdout | test/harness.test.ts > agent harness > prunes removed active skills after refresh in development mode
65
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
66
+ [poncho][mcp] {"event":"tools.cleared","reason":"activate:obsolete","requestedPatterns":[]}
67
+
68
+ stdout | test/harness.test.ts > agent harness > prunes removed active skills after refresh in development mode
69
+ [poncho][mcp] {"event":"tools.cleared","reason":"skills:changed","requestedPatterns":[]}
70
+
71
+ stdout | test/harness.test.ts > agent harness > does not refresh skills outside development mode
72
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
73
+
74
+ stdout | test/harness.test.ts > agent harness > clears active skills when skill metadata changes in development mode
75
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
76
+ [poncho][mcp] {"event":"tools.cleared","reason":"activate:alpha","requestedPatterns":[]}
77
+
78
+ stdout | test/harness.test.ts > agent harness > clears active skills when skill metadata changes in development mode
79
+ [poncho][mcp] {"event":"tools.cleared","reason":"skills:changed","requestedPatterns":[]}
80
+
81
+ stdout | test/harness.test.ts > agent harness > lists skill scripts through list_skill_scripts
82
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
83
+
84
+ stdout | test/harness.test.ts > agent harness > runs JavaScript/TypeScript skill scripts through run_skill_script
85
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
86
+
87
+ stdout | test/harness.test.ts > agent harness > runs AGENT-scope scripts from root scripts directory
88
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
89
+
90
+ stdout | test/harness.test.ts > agent harness > blocks path traversal in run_skill_script
91
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
92
+
93
+ stdout | test/harness.test.ts > agent harness > requires allowed-tools entries for non-standard script directories
94
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
95
+
96
+ stdout | test/harness.test.ts > agent harness > registers MCP tools dynamically for stacked active skills and supports deactivation
97
+ [poncho][mcp] {"event":"catalog.loaded","server":"remote","discoveredCount":2}
98
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
99
+ [poncho][mcp] {"event":"tools.selected","requestedPatternCount":1,"registeredCount":1,"filteredByPolicyCount":0,"filteredByIntentCount":1}
100
+ [poncho][mcp] {"event":"tools.refreshed","reason":"activate:skill-a","requestedPatterns":["remote/a"],"registeredCount":1,"activeSkills":["skill-a"]}
101
+
102
+ stdout | test/harness.test.ts > agent harness > registers MCP tools dynamically for stacked active skills and supports deactivation
103
+ [poncho][mcp] {"event":"tools.selected","requestedPatternCount":2,"registeredCount":2,"filteredByPolicyCount":0,"filteredByIntentCount":0}
104
+ [poncho][mcp] {"event":"tools.refreshed","reason":"activate:skill-b","requestedPatterns":["remote/a","remote/b"],"registeredCount":2,"activeSkills":["skill-a","skill-b"]}
105
+ [poncho][mcp] {"event":"tools.selected","requestedPatternCount":1,"registeredCount":1,"filteredByPolicyCount":0,"filteredByIntentCount":1}
106
+ [poncho][mcp] {"event":"tools.refreshed","reason":"deactivate:skill-a","requestedPatterns":["remote/b"],"registeredCount":1,"activeSkills":["skill-b"]}
107
+
108
+ stdout | test/harness.test.ts > agent harness > supports flat tool access config format
109
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
110
+
111
+ stdout | test/harness.test.ts > agent harness > flat tool access takes priority over legacy defaults
112
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
113
+
114
+ stdout | test/harness.test.ts > agent harness > byEnvironment overrides flat tool access
115
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
116
+
117
+ stdout | test/harness.test.ts > agent harness > registerTools skips tools disabled via config
118
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
119
+
120
+ stdout | test/harness.test.ts > agent harness > approval access level registers the tool but marks it for approval
121
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
122
+
123
+ stdout | test/harness.test.ts > agent harness > tools without approval config do not require approval
124
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
125
+
126
+ stdout | test/harness.test.ts > agent harness > allows in-flight MCP calls to finish after skill deactivation
127
+ [poncho][mcp] {"event":"catalog.loaded","server":"remote","discoveredCount":1}
128
+ [poncho][mcp] {"event":"tools.cleared","reason":"initialize","requestedPatterns":[]}
129
+ [poncho][mcp] {"event":"tools.selected","requestedPatternCount":1,"registeredCount":1,"filteredByPolicyCount":0,"filteredByIntentCount":0}
130
+ [poncho][mcp] {"event":"tools.refreshed","reason":"activate:skill-slow","requestedPatterns":["remote/slow"],"registeredCount":1,"activeSkills":["skill-slow"]}
131
+ [poncho][mcp] {"event":"tools.cleared","reason":"deactivate:skill-slow","requestedPatterns":[]}
132
+
133
+ ✓ test/harness.test.ts  (25 tests) 365ms
134
+
135
+  Test Files  9 passed (9)
136
+  Tests  86 passed (86)
137
+  Start at  13:30:36
138
+  Duration  2.19s (transform 1.11s, setup 0ms, collect 2.81s, tests 749ms, environment 5ms, prepare 1.23s)
139
+
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @poncho-ai/harness
2
2
 
3
+ ## 0.16.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`12f2845`](https://github.com/cesr/poncho-ai/commit/12f28457c20e650640ff2a1c1dbece2a6e4a9ddd) Thanks [@cesr](https://github.com/cesr)! - Add browser storage persistence (cookies/localStorage survive restarts via configured storage provider) and new `browser_content` tool for fast text extraction from pages.
8
+
9
+ ## 0.15.1
10
+
11
+ ### Patch Changes
12
+
13
+ - Fix browser session reconnection, tab lifecycle management, and web UI panel state handling.
14
+
15
+ - Updated dependencies []:
16
+ - @poncho-ai/sdk@1.1.1
17
+
3
18
  ## 0.15.0
4
19
 
5
20
  ### Minor Changes
package/dist/index.d.ts CHANGED
@@ -486,6 +486,7 @@ declare class AgentHarness {
486
486
  private registerSkillTools;
487
487
  private refreshSkillsIfChanged;
488
488
  initialize(): Promise<void>;
489
+ private buildBrowserStoragePersistence;
489
490
  private initBrowserTools;
490
491
  /** Conversation ID of the currently executing run (set during run, cleared after). */
491
492
  private _currentRunConversationId?;
package/dist/index.js CHANGED
@@ -3290,6 +3290,85 @@ var AgentHarness = class {
3290
3290
  );
3291
3291
  }
3292
3292
  }
3293
+ async buildBrowserStoragePersistence(config, sessionId) {
3294
+ const provider = config.storage?.provider ?? config.state?.provider ?? "local";
3295
+ const stateKey = `poncho:browser:state:${sessionId}`;
3296
+ if (provider === "memory") return void 0;
3297
+ if (provider === "local") {
3298
+ const { resolve: pathResolve } = await import("path");
3299
+ const { homedir: home } = await import("os");
3300
+ const stateDir = pathResolve(home(), ".poncho", "browser-state");
3301
+ const filePath = pathResolve(stateDir, `${sessionId}.json`);
3302
+ return {
3303
+ async save(json) {
3304
+ const { mkdir: mkdir5, writeFile: writeFile6 } = await import("fs/promises");
3305
+ await mkdir5(stateDir, { recursive: true });
3306
+ await writeFile6(filePath, json, "utf8");
3307
+ },
3308
+ async load() {
3309
+ const { readFile: readFile8 } = await import("fs/promises");
3310
+ try {
3311
+ return await readFile8(filePath, "utf8");
3312
+ } catch {
3313
+ return void 0;
3314
+ }
3315
+ }
3316
+ };
3317
+ }
3318
+ if (provider === "upstash") {
3319
+ const urlEnv = config.storage?.urlEnv ?? (process.env.UPSTASH_REDIS_REST_URL ? "UPSTASH_REDIS_REST_URL" : "KV_REST_API_URL");
3320
+ const tokenEnv = config.storage?.tokenEnv ?? (process.env.UPSTASH_REDIS_REST_TOKEN ? "UPSTASH_REDIS_REST_TOKEN" : "KV_REST_API_TOKEN");
3321
+ const baseUrl = (process.env[urlEnv] ?? "").replace(/\/+$/, "");
3322
+ const token = process.env[tokenEnv] ?? "";
3323
+ if (!baseUrl || !token) return void 0;
3324
+ const headers = { Authorization: `Bearer ${token}`, "Content-Type": "application/json" };
3325
+ return {
3326
+ async save(json) {
3327
+ await fetch(`${baseUrl}/set/${encodeURIComponent(stateKey)}/${encodeURIComponent(json)}`, { method: "POST", headers });
3328
+ },
3329
+ async load() {
3330
+ const res = await fetch(`${baseUrl}/get/${encodeURIComponent(stateKey)}`, { headers });
3331
+ if (!res.ok) return void 0;
3332
+ const body = await res.json();
3333
+ return body.result ?? void 0;
3334
+ }
3335
+ };
3336
+ }
3337
+ if (provider === "redis") {
3338
+ const urlEnv = config.storage?.urlEnv ?? "REDIS_URL";
3339
+ const url = process.env[urlEnv] ?? "";
3340
+ if (!url) return void 0;
3341
+ let clientPromise;
3342
+ const getClient = () => {
3343
+ if (!clientPromise) {
3344
+ clientPromise = (async () => {
3345
+ try {
3346
+ const mod = await import("redis");
3347
+ const c = mod.createClient({ url });
3348
+ await c.connect();
3349
+ return c;
3350
+ } catch {
3351
+ return void 0;
3352
+ }
3353
+ })();
3354
+ }
3355
+ return clientPromise;
3356
+ };
3357
+ return {
3358
+ async save(json) {
3359
+ const c = await getClient();
3360
+ if (c) await c.set(stateKey, json);
3361
+ },
3362
+ async load() {
3363
+ const c = await getClient();
3364
+ if (!c) return void 0;
3365
+ const val = await c.get(stateKey);
3366
+ return val ?? void 0;
3367
+ }
3368
+ };
3369
+ }
3370
+ return void 0;
3371
+ }
3293
3372
  async initBrowserTools(config) {
3294
3373
  const spec = ["@poncho-ai", "browser"].join("/");
3295
3374
  let browserMod;
@@ -3318,9 +3397,14 @@ var AgentHarness = class {
3318
3397
  );
3319
3398
  }
3320
3399
  this._browserMod = browserMod;
3321
- const browserCfg = typeof config.browser === "object" ? config.browser : {};
3400
+ const browserCfg = typeof config.browser === "object" ? { ...config.browser } : {};
3322
3401
  const agentId = this.parsedAgent?.frontmatter.id ?? this.parsedAgent?.frontmatter.name ?? "default";
3323
- const session = new browserMod.BrowserSession(`poncho-${agentId}`, browserCfg);
3402
+ const sessionId = `poncho-${agentId}`;
3403
+ const storagePersistence = await this.buildBrowserStoragePersistence(config, sessionId);
3404
+ if (storagePersistence) {
3405
+ browserCfg.storagePersistence = storagePersistence;
3406
+ }
3407
+ const session = new browserMod.BrowserSession(sessionId, browserCfg);
3324
3408
  this._browserSession = session;
3325
3409
  const tools = browserMod.createBrowserTools(
3326
3410
  () => session,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@poncho-ai/harness",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "Agent execution runtime - conversation loop, tool dispatch, streaming",
5
5
  "repository": {
6
6
  "type": "git",
@@ -31,7 +31,7 @@
31
31
  "redis": "^5.10.0",
32
32
  "yaml": "^2.4.0",
33
33
  "zod": "^3.22.0",
34
- "@poncho-ai/sdk": "1.1.0"
34
+ "@poncho-ai/sdk": "1.1.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/mustache": "^4.2.6",
package/src/harness.ts CHANGED
@@ -914,6 +914,94 @@ export class AgentHarness {
914
914
  }
915
915
  }
916
916
 
917
+ private async buildBrowserStoragePersistence(
918
+ config: PonchoConfig,
919
+ sessionId: string,
920
+ ): Promise<{ save(json: string): Promise<void>; load(): Promise<string | undefined> } | undefined> {
921
+ const provider = config.storage?.provider ?? (config.state as Record<string, unknown> | undefined)?.provider as string | undefined ?? "local";
922
+ const stateKey = `poncho:browser:state:${sessionId}`;
923
+
924
+ if (provider === "memory") return undefined;
925
+
926
+ if (provider === "local") {
927
+ const { resolve: pathResolve } = await import("node:path");
928
+ const { homedir: home } = await import("node:os");
929
+ const stateDir = pathResolve(home(), ".poncho", "browser-state");
930
+ const filePath = pathResolve(stateDir, `${sessionId}.json`);
931
+ return {
932
+ async save(json: string) {
933
+ const { mkdir, writeFile } = await import("node:fs/promises");
934
+ await mkdir(stateDir, { recursive: true });
935
+ await writeFile(filePath, json, "utf8");
936
+ },
937
+ async load() {
938
+ const { readFile } = await import("node:fs/promises");
939
+ try { return await readFile(filePath, "utf8"); } catch { return undefined; }
940
+ },
941
+ };
942
+ }
943
+
944
+ if (provider === "upstash") {
945
+ const urlEnv = config.storage?.urlEnv ?? (process.env.UPSTASH_REDIS_REST_URL ? "UPSTASH_REDIS_REST_URL" : "KV_REST_API_URL");
946
+ const tokenEnv = config.storage?.tokenEnv ?? (process.env.UPSTASH_REDIS_REST_TOKEN ? "UPSTASH_REDIS_REST_TOKEN" : "KV_REST_API_TOKEN");
947
+ const baseUrl = (process.env[urlEnv] ?? "").replace(/\/+$/, "");
948
+ const token = process.env[tokenEnv] ?? "";
949
+ if (!baseUrl || !token) return undefined;
950
+ const headers = { Authorization: `Bearer ${token}`, "Content-Type": "application/json" };
951
+ return {
952
+ async save(json: string) {
953
+ await fetch(`${baseUrl}/set/${encodeURIComponent(stateKey)}/${encodeURIComponent(json)}`, { method: "POST", headers });
954
+ },
955
+ async load() {
956
+ const res = await fetch(`${baseUrl}/get/${encodeURIComponent(stateKey)}`, { headers });
957
+ if (!res.ok) return undefined;
958
+ const body = await res.json() as { result?: string | null };
959
+ return body.result ?? undefined;
960
+ },
961
+ };
962
+ }
963
+
964
+ if (provider === "redis") {
965
+ const urlEnv = config.storage?.urlEnv ?? "REDIS_URL";
966
+ const url = process.env[urlEnv] ?? "";
967
+ if (!url) return undefined;
968
+ let clientPromise: Promise<{ get(k: string): Promise<string | null>; set(k: string, v: string): Promise<unknown> } | undefined> | undefined;
969
+ const getClient = () => {
970
+ if (!clientPromise) {
971
+ clientPromise = (async () => {
972
+ try {
973
+ const mod = (await import("redis")) as unknown as {
974
+ createClient: (opts: { url: string }) => {
975
+ connect(): Promise<unknown>;
976
+ get(k: string): Promise<string | null>;
977
+ set(k: string, v: string): Promise<unknown>;
978
+ };
979
+ };
980
+ const c = mod.createClient({ url });
981
+ await c.connect();
982
+ return c;
983
+ } catch { return undefined; }
984
+ })();
985
+ }
986
+ return clientPromise;
987
+ };
988
+ return {
989
+ async save(json: string) {
990
+ const c = await getClient();
991
+ if (c) await c.set(stateKey, json);
992
+ },
993
+ async load() {
994
+ const c = await getClient();
995
+ if (!c) return undefined;
996
+ const val = await c.get(stateKey);
997
+ return val ?? undefined;
998
+ },
999
+ };
1000
+ }
1001
+
1002
+ return undefined;
1003
+ }
1004
+
917
1005
  private async initBrowserTools(config: PonchoConfig): Promise<void> {
918
1006
  const spec = ["@poncho-ai", "browser"].join("/");
919
1007
  let browserMod: {
@@ -947,9 +1035,16 @@ export class AgentHarness {
947
1035
  }
948
1036
 
949
1037
  this._browserMod = browserMod;
950
- const browserCfg = typeof config.browser === "object" ? config.browser : {};
1038
+ const browserCfg: Record<string, unknown> = typeof config.browser === "object" ? { ...config.browser } : {};
951
1039
  const agentId = this.parsedAgent?.frontmatter.id ?? this.parsedAgent?.frontmatter.name ?? "default";
952
- const session = new browserMod.BrowserSession(`poncho-${agentId}`, browserCfg);
1040
+ const sessionId = `poncho-${agentId}`;
1041
+
1042
+ const storagePersistence = await this.buildBrowserStoragePersistence(config, sessionId);
1043
+ if (storagePersistence) {
1044
+ browserCfg.storagePersistence = storagePersistence;
1045
+ }
1046
+
1047
+ const session = new browserMod.BrowserSession(sessionId, browserCfg);
953
1048
  this._browserSession = session;
954
1049
 
955
1050
  const tools = browserMod.createBrowserTools(