@pasko70/pibo 3.0.1 → 3.1.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.
Files changed (122) hide show
  1. package/README.md +20 -6
  2. package/compute-image/Dockerfile +47 -0
  3. package/compute-image/Dockerfile.dockerignore +5 -0
  4. package/dist/agent-runtime/context-build.js +26 -2
  5. package/dist/agent-runtime/contract.js +78 -28
  6. package/dist/agent-runtime/portable-history.js +19 -9
  7. package/dist/agent-runtime/registry.js +8 -2
  8. package/dist/agent-runtime/routed-session.js +120 -15
  9. package/dist/agent-runtimes/codex-native/adapter.js +12 -0
  10. package/dist/agent-runtimes/codex-native/resource-delivery.js +35 -7
  11. package/dist/agent-runtimes/omp/adapter.js +3 -7
  12. package/dist/agent-runtimes/pi/adapter.js +5 -3
  13. package/dist/agent-runtimes/pi/routed-session.js +59 -12
  14. package/dist/agent-runtimes/pi/runtime.js +6 -0
  15. package/dist/apps/chat/agent-profiles.js +31 -2
  16. package/dist/apps/chat/agent-store.js +98 -6
  17. package/dist/apps/chat/chat-request-normalizers.js +31 -0
  18. package/dist/apps/chat/data/chat-data-mappers.js +61 -11
  19. package/dist/apps/chat/data/project-service.js +119 -15
  20. package/dist/apps/chat/data/room-service.js +21 -0
  21. package/dist/apps/chat/data/session-query-service.js +33 -10
  22. package/dist/apps/chat/data/timeline-query-service.js +60 -35
  23. package/dist/apps/chat/loop-api.js +10 -2
  24. package/dist/apps/chat/output-compactor.js +144 -21
  25. package/dist/apps/chat/output-event-policy.js +179 -2
  26. package/dist/apps/chat/stream.js +16 -7
  27. package/dist/apps/chat/trace-v2.js +1 -0
  28. package/dist/apps/chat/web-app.js +317 -86
  29. package/dist/apps/chat-ui/assets/{dist-BDIATCQt.js → dist-CUQJqggN.js} +1 -1
  30. package/dist/apps/chat-ui/assets/{dist-mqCviI-c.js → dist-ClUlQWYN.js} +1 -1
  31. package/dist/apps/chat-ui/assets/{dist-JnW4v8UE.js → dist-Djul9BmZ.js} +1 -1
  32. package/dist/apps/chat-ui/assets/{dist-lRiLP9rr.js → dist-GD0JGdCi.js} +1 -1
  33. package/dist/apps/chat-ui/assets/{dist-BBDMeU5-.js → dist-W5HOqHym.js} +1 -1
  34. package/dist/apps/chat-ui/assets/index-BcjkX-iP.js +228 -0
  35. package/dist/apps/chat-ui/assets/index-CmqRSbBU.css +1 -0
  36. package/dist/apps/chat-ui/index.html +2 -2
  37. package/dist/apps/chat-vscode-web/assets/index-JvrPUGvI.js +43 -0
  38. package/dist/apps/chat-vscode-web/index.html +1 -1
  39. package/dist/apps/cli-ui/InkSessionApp.js +111 -12
  40. package/dist/apps/cli-ui/cliSessionsCommand.js +34 -8
  41. package/dist/cli-session/localSessionSource.js +153 -161
  42. package/dist/cli.js +7 -11
  43. package/dist/compute/cli.js +35 -16
  44. package/dist/compute/docker.js +341 -94
  45. package/dist/config/config.js +3 -0
  46. package/dist/core/context-build.js +7 -16
  47. package/dist/core/output-persistence-retry.js +484 -0
  48. package/dist/core/output-render-sequence.js +331 -0
  49. package/dist/core/profiles.js +24 -0
  50. package/dist/core/provider-recovery.js +7 -1
  51. package/dist/core/session-model.js +37 -1
  52. package/dist/core/session-router.js +78 -110
  53. package/dist/data/ingest-service.js +91 -9
  54. package/dist/data/navigation-store.js +5 -5
  55. package/dist/data/pibo-store.js +8 -1
  56. package/dist/data/schema.js +243 -3
  57. package/dist/data/session-store.js +3 -3
  58. package/dist/debug/agents.js +91 -89
  59. package/dist/debug/index.js +46 -2
  60. package/dist/debug/pty.js +127 -48
  61. package/dist/gateway/cli.js +4 -0
  62. package/dist/gateway/web.js +8 -8
  63. package/dist/local/client.js +3 -2
  64. package/dist/loops/channel.js +3 -1
  65. package/dist/loops/cli.js +2 -1
  66. package/dist/loops/service.js +90 -11
  67. package/dist/loops/store.js +100 -74
  68. package/dist/mcp/agent-context.js +13 -26
  69. package/dist/mcp/commands/info.js +3 -1
  70. package/dist/mcp/config-command.js +46 -2
  71. package/dist/mcp/config.js +18 -4
  72. package/dist/plugins/context-files-store.js +36 -6
  73. package/dist/plugins/context-files.js +52 -1
  74. package/dist/plugins/registry.js +2 -0
  75. package/dist/plugins/user-profile-resources.js +22 -0
  76. package/dist/previews/base-url.js +34 -0
  77. package/dist/previews/config.js +2 -32
  78. package/dist/ralph/store.js +5 -0
  79. package/dist/reliability/store.js +378 -106
  80. package/dist/session-ui/terminalRows.js +8 -4
  81. package/dist/sessions/pibo-data-store.js +145 -0
  82. package/dist/sessions/store.js +42 -0
  83. package/dist/setup/cli.js +422 -6
  84. package/dist/setup/installation-profiles.js +464 -0
  85. package/dist/shared/deterministic-digest.js +94 -0
  86. package/dist/shared/trace-engine.js +54 -0
  87. package/dist/shared/trace-event-projection.js +124 -67
  88. package/dist/shared/trace-history.js +47 -12
  89. package/dist/shared/trace-live-reducer.js +23 -4
  90. package/dist/shared/trace-nodes.js +17 -28
  91. package/dist/shared/trace-order.js +41 -5
  92. package/dist/shared/trace-page-merge.js +44 -14
  93. package/dist/shared/trace-patch-nodes.js +2 -0
  94. package/dist/shared/trace-subagent-links.js +4 -1
  95. package/dist/shared/trace-tool-identity.js +15 -8
  96. package/dist/signals/projector.js +28 -6
  97. package/dist/subagents/observation-query.js +121 -0
  98. package/dist/subagents/tool.js +7 -3
  99. package/dist/tools/agent-browser-leases.js +58 -23
  100. package/dist/tools/agent-browser-wrapper.js +1 -1
  101. package/dist/tools/browser-use-leases.js +129 -16
  102. package/dist/tools/browser-use-wrapper.js +1 -1
  103. package/dist/tools/index.js +27 -11
  104. package/dist/tools/python-runtime.js +10 -3
  105. package/dist/tools/registry.js +1 -1
  106. package/dist/tools/runtime/node-backend.js +16 -5
  107. package/dist/tools/runtime/node-worker-source.js +112 -33
  108. package/dist/tools/runtime/python-backend.js +16 -5
  109. package/dist/tools/runtime/python-worker-source.js +167 -16
  110. package/dist/tools/runtime/registry.js +23 -10
  111. package/dist/user-skills/store.js +0 -1
  112. package/docs/ops/vscode-extension-release.md +9 -1
  113. package/npm-shrinkwrap.json +9 -2
  114. package/package.json +9 -2
  115. package/scripts/docker-entrypoint.sh +46 -0
  116. package/scripts/prepare-agent-browser-wrapper.sh +70 -0
  117. package/scripts/prepare-browser-use-wrapper.sh +255 -0
  118. package/dist/apps/chat-ui/assets/index-0XOOVxLP.js +0 -228
  119. package/dist/apps/chat-ui/assets/index-DV7_CgsC.css +0 -1
  120. package/dist/apps/chat-vscode-web/assets/index-Dtw2Z7jz.js +0 -43
  121. package/dist/apps/vscode-artifacts/latest.vsix +0 -0
  122. package/dist/apps/vscode-artifacts/pibo-vscode-ext-3.0.1.vsix +0 -0
@@ -0,0 +1,46 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ # Xvfb starten (virtueller Display-Server für Browser-Automation)
5
+ if ! pgrep -x Xvfb >/dev/null 2>&1; then
6
+ echo "[docker-entrypoint] Starting Xvfb on DISPLAY=:99 ..."
7
+ Xvfb :99 -screen 0 1920x1080x24 -ac -nolisten tcp &
8
+ sleep 0.5
9
+ fi
10
+
11
+ export DISPLAY=:99
12
+
13
+ # Sicherstellen, dass die Browser-Wrapper existieren
14
+ if [ ! -x "$HOME/.pibo/tools/browser-use/home/bin/browser-use" ]; then
15
+ echo "[docker-entrypoint] Preparing browser-use wrapper ..."
16
+ /app/scripts/prepare-browser-use-wrapper.sh
17
+ fi
18
+
19
+ if [ ! -x "$HOME/.pibo/tools/agent-browser/home/bin/agent-browser" ]; then
20
+ echo "[docker-entrypoint] Preparing agent-browser wrapper ..."
21
+ /app/scripts/prepare-agent-browser-wrapper.sh
22
+ fi
23
+
24
+ # PATH erweitern
25
+ export PATH="$HOME/.pibo/tools/agent-browser/home/bin:$HOME/.pibo/tools/agent-browser/node/node_modules/.bin:$HOME/.pibo/tools/browser-use/home/bin:$HOME/.pibo/tools/browser-use/.venv/bin:$PATH"
26
+ export BROWSER_USE_HOME="$HOME/.pibo/tools/browser-use/home"
27
+ export AGENT_BROWSER_HOME="$HOME/.pibo/tools/agent-browser/home"
28
+
29
+ # Pibo-CLI-Argumente verarbeiten
30
+ case "${1:-gateway}" in
31
+ gateway)
32
+ echo "[docker-entrypoint] Starting Pibo gateway on 0.0.0.0:4789 ..."
33
+ exec node -e "import('./dist/gateway/server.js').then(m => m.runGatewayServer({ host: '0.0.0.0' }))"
34
+ ;;
35
+ gateway:web)
36
+ echo "[docker-entrypoint] Starting Pibo gateway:web with local auth on 0.0.0.0:4789 ..."
37
+ exec node -e "import('./dist/gateway/web.js').then(m => m.runWebGatewayServer({ authMode: 'local', web: { host: '0.0.0.0' } }))"
38
+ ;;
39
+ shell|bash|sh)
40
+ exec /bin/sh
41
+ ;;
42
+ *)
43
+ # Alles andere direkt an Pibo weiterleiten
44
+ exec node dist/bin/pibo.js "$@"
45
+ ;;
46
+ esac
@@ -0,0 +1,70 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ real_agent_browser="$HOME/.pibo/tools/agent-browser/node/node_modules/.bin/agent-browser"
5
+ wrapper_dir="$HOME/.pibo/tools/agent-browser/home/bin"
6
+ wrapper_path="$wrapper_dir/agent-browser"
7
+
8
+ mkdir -p "$wrapper_dir" "$HOME/.pibo/tools/agent-browser/home/profiles"
9
+
10
+ cat > "$wrapper_path" <<'WRAPPER'
11
+ #!/usr/bin/env bash
12
+ set -euo pipefail
13
+
14
+ real_agent_browser="$HOME/.pibo/tools/agent-browser/node/node_modules/.bin/agent-browser"
15
+ default_home="$HOME/.pibo/tools/agent-browser/home"
16
+
17
+ if [ -z "${AGENT_BROWSER_HOME:-}" ]; then
18
+ export AGENT_BROWSER_HOME="$default_home"
19
+ fi
20
+ mkdir -p "$AGENT_BROWSER_HOME" "$AGENT_BROWSER_HOME/profiles"
21
+
22
+ if [ "${PIBO_AGENT_BROWSER_PRESERVE_HOME:-0}" != "1" ]; then
23
+ export HOME="$AGENT_BROWSER_HOME"
24
+ fi
25
+
26
+ explicit_runtime=0
27
+ fresh_profile=0
28
+ show_help=0
29
+ starts_browser=0
30
+ args=()
31
+
32
+ print_wrapper_help() {
33
+ cat <<'HELP'
34
+ Pibo agent-browser wrapper
35
+ - keeps Agent Browser state under AGENT_BROWSER_HOME by default
36
+ - prepends a persistent Pibo profile for browser-launching commands
37
+ - pass --fresh-profile to disable Pibo profile injection
38
+ HELP
39
+ }
40
+
41
+ while [ "$#" -gt 0 ]; do
42
+ case "$1" in
43
+ --help|-h) show_help=1; args+=("$1") ;;
44
+ --fresh-profile) fresh_profile=1 ;;
45
+ --profile|--state|--cdp|--auto-connect|--provider|--engine|--executable-path|--config)
46
+ explicit_runtime=1; args+=("$1"); if [ "$#" -gt 1 ]; then shift; args+=("$1"); fi ;;
47
+ --profile=*|--state=*|--cdp=*|--auto-connect=*|--provider=*|--engine=*|--executable-path=*|--config=*)
48
+ explicit_runtime=1; args+=("$1") ;;
49
+ open|launch|new|goto) starts_browser=1; args+=("$1") ;;
50
+ *) args+=("$1") ;;
51
+ esac
52
+ shift
53
+ done
54
+
55
+ if [ "$show_help" -eq 1 ]; then
56
+ print_wrapper_help
57
+ exec "$real_agent_browser" "${args[@]}"
58
+ fi
59
+
60
+ if [ "$starts_browser" -eq 1 ] && [ "$fresh_profile" -eq 0 ] && [ "$explicit_runtime" -eq 0 ]; then
61
+ profile_dir=${AGENT_BROWSER_PROFILE:-$AGENT_BROWSER_HOME/profiles/PIBo}
62
+ mkdir -p "$profile_dir"
63
+ exec "$real_agent_browser" --profile "$profile_dir" "${args[@]}"
64
+ fi
65
+
66
+ exec "$real_agent_browser" "${args[@]}"
67
+ WRAPPER
68
+
69
+ chmod +x "$wrapper_path"
70
+ printf '%s\n' "$wrapper_path"
@@ -0,0 +1,255 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ real_browser_use="$HOME/.pibo/tools/browser-use/.venv/bin/browser-use"
5
+ wrapper_dir="$HOME/.pibo/tools/browser-use/home/bin"
6
+ wrapper_path=$wrapper_dir/browser-use
7
+
8
+ mkdir -p "$wrapper_dir"
9
+
10
+ cat > "$wrapper_path" <<'WRAPPER'
11
+ #!/bin/sh
12
+ set -eu
13
+
14
+ real_browser_use="$HOME/.pibo/tools/browser-use/.venv/bin/browser-use"
15
+ default_profile='PIBo'
16
+ fresh_flag='--fresh-profile'
17
+ python_cmd="$HOME/.pibo/tools/browser-use/.venv/bin/python"
18
+
19
+ session=${PIBO_BROWSER_USE_SESSION:-default}
20
+ explicit_profile=0
21
+ fresh_profile=0
22
+ starts_browser=0
23
+ show_help=0
24
+ headed=0
25
+ sanitized_args=
26
+
27
+ append_arg() {
28
+ if [ "$#" -eq 0 ]; then return; fi
29
+ if [ -z "$sanitized_args" ]; then
30
+ sanitized_args=$(printf '%s\n' "$1")
31
+ else
32
+ sanitized_args=$(printf '%s\n%s\n' "$sanitized_args" "$1")
33
+ fi
34
+ }
35
+
36
+ find_chrome() {
37
+ if [ -n "${PIBO_BROWSER_USE_CHROME:-}" ]; then
38
+ printf '%s\n' "$PIBO_BROWSER_USE_CHROME"
39
+ return
40
+ fi
41
+ for candidate in google-chrome chrome chromium chromium-browser /opt/google/chrome/chrome; do
42
+ if command -v "$candidate" >/dev/null 2>&1; then
43
+ command -v "$candidate"
44
+ return
45
+ fi
46
+ if [ -x "$candidate" ]; then
47
+ printf '%s\n' "$candidate"
48
+ return
49
+ fi
50
+ done
51
+ }
52
+
53
+ resolve_profile_directory() {
54
+ user_data_dir=$1
55
+ profile_name=$2
56
+ if [ -n "${PIBO_BROWSER_USE_CHROME_PROFILE_DIRECTORY:-}" ]; then
57
+ printf '%s\n' "$PIBO_BROWSER_USE_CHROME_PROFILE_DIRECTORY"
58
+ return
59
+ fi
60
+ "$python_cmd" - "$user_data_dir" "$profile_name" <<'PY'
61
+ import json, sys
62
+ from pathlib import Path
63
+ user_data_dir = Path(sys.argv[1])
64
+ profile_name = sys.argv[2]
65
+ local_state = user_data_dir / "Local State"
66
+ try:
67
+ data = json.loads(local_state.read_text())
68
+ except Exception:
69
+ print(profile_name if (user_data_dir / profile_name).is_dir() else "Default")
70
+ raise SystemExit
71
+ info_cache = data.get("profile", {}).get("info_cache", {})
72
+ if profile_name in info_cache:
73
+ print(profile_name)
74
+ raise SystemExit
75
+ profile_name_lower = profile_name.lower()
76
+ for directory, info in info_cache.items():
77
+ if str(info.get("name", directory)).lower() == profile_name_lower:
78
+ print(directory)
79
+ raise SystemExit
80
+ for directory in info_cache:
81
+ if directory.lower() == profile_name_lower:
82
+ print(directory)
83
+ raise SystemExit
84
+ print(profile_name if (user_data_dir / profile_name).is_dir() else "Default")
85
+ PY
86
+ }
87
+
88
+ find_free_port() {
89
+ "$python_cmd" - <<'PY'
90
+ import socket
91
+ with socket.socket() as sock:
92
+ sock.bind(("127.0.0.1", 0))
93
+ print(sock.getsockname()[1])
94
+ PY
95
+ }
96
+
97
+ pibo_cdp_is_ready() {
98
+ "$python_cmd" - "$1" <<'PY'
99
+ import socket, sys
100
+ port = int(sys.argv[1])
101
+ try:
102
+ with socket.create_connection(("127.0.0.1", port), timeout=0.2) as sock:
103
+ sock.sendall(b"GET /json/version HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n")
104
+ data = sock.recv(128)
105
+ raise SystemExit(0 if b"200" in data else 1)
106
+ except Exception:
107
+ raise SystemExit(1)
108
+ PY
109
+ }
110
+
111
+ persistent_chrome_url_if_alive() {
112
+ safe_session=$(printf '%s' "$session" | tr -c 'A-Za-z0-9_.-' '_')
113
+ state_dir=${BROWSER_USE_HOME:-$HOME/.browser-use}/pibo-cdp
114
+ pid_file=$state_dir/$safe_session.pid
115
+ port_file=$state_dir/$safe_session.port
116
+ if [ -s "$pid_file" ] && [ -s "$port_file" ]; then
117
+ chrome_pid=$(cat "$pid_file" 2>/dev/null || true)
118
+ chrome_port=$(cat "$port_file" 2>/dev/null || true)
119
+ if [ -n "$chrome_pid" ] && [ -n "$chrome_port" ] && kill -0 "$chrome_pid" 2>/dev/null && pibo_cdp_is_ready "$chrome_port"; then
120
+ printf 'http://127.0.0.1:%s\n' "$chrome_port"
121
+ return 0
122
+ fi
123
+ fi
124
+ return 1
125
+ }
126
+
127
+ ensure_persistent_chrome() {
128
+ safe_session=$(printf '%s' "$session" | tr -c 'A-Za-z0-9_.-' '_')
129
+ state_dir=${BROWSER_USE_HOME:-$HOME/.browser-use}/pibo-cdp
130
+ mkdir -p "$state_dir"
131
+ pid_file=$state_dir/$safe_session.pid
132
+ port_file=$state_dir/$safe_session.port
133
+ log_file=$state_dir/$safe_session.chrome.log
134
+
135
+ if cdp_url=$(persistent_chrome_url_if_alive); then
136
+ printf '%s\n' "$cdp_url"
137
+ return
138
+ fi
139
+
140
+ chrome_bin=$(find_chrome)
141
+ if [ -z "$chrome_bin" ]; then
142
+ echo "pibo browser-use: could not find Chrome" >&2
143
+ exit 1
144
+ fi
145
+
146
+ user_data_dir=${PIBO_BROWSER_USE_CHROME_USER_DATA_DIR:-}
147
+ if [ -z "$user_data_dir" ]; then
148
+ user_data_dir=${BROWSER_USE_HOME:-$HOME/.browser-use}/chrome-profiles/$default_profile
149
+ fi
150
+
151
+ mkdir -p "$user_data_dir"
152
+ profile_directory=$(resolve_profile_directory "$user_data_dir" "$default_profile")
153
+ chrome_port=$(find_free_port)
154
+ headless_arg=
155
+ if [ "$headed" -eq 0 ]; then
156
+ headless_arg="--headless=new"
157
+ fi
158
+
159
+ nohup "$chrome_bin" \
160
+ --user-data-dir="$user_data_dir" \
161
+ --profile-directory="$profile_directory" \
162
+ --remote-debugging-port="$chrome_port" \
163
+ --no-first-run \
164
+ --no-default-browser-check \
165
+ --disable-default-apps \
166
+ --no-sandbox \
167
+ --disable-setuid-sandbox \
168
+ --disable-dev-shm-usage \
169
+ $headless_arg \
170
+ about:blank >"$log_file" 2>&1 &
171
+ chrome_pid=$!
172
+
173
+ ready=0
174
+ if [ "${PIBO_BROWSER_USE_SKIP_CDP_WAIT:-}" = "1" ]; then ready=1; fi
175
+ attempt=0
176
+ while [ "$ready" -ne 1 ] && [ "$attempt" -lt 50 ]; do
177
+ if pibo_cdp_is_ready "$chrome_port"; then ready=1; break; fi
178
+ if ! kill -0 "$chrome_pid" 2>/dev/null; then break; fi
179
+ attempt=$((attempt + 1))
180
+ sleep 0.1
181
+ done
182
+
183
+ if [ "$ready" -ne 1 ]; then
184
+ echo "pibo browser-use: Chrome did not expose CDP on port $chrome_port." >&2
185
+ sed -n '1,80p' "$log_file" >&2 2>/dev/null || true
186
+ exit 1
187
+ fi
188
+
189
+ printf '%s\n' "$chrome_pid" > "$pid_file"
190
+ printf '%s\n' "$chrome_port" > "$port_file"
191
+ printf 'pibo browser-use: started Chrome profile "%s" on CDP port %s.\n' "$default_profile" "$chrome_port" >&2
192
+ printf 'http://127.0.0.1:%s\n' "$chrome_port"
193
+ }
194
+
195
+ while [ "$#" -gt 0 ]; do
196
+ arg=$1; shift
197
+ case "$arg" in
198
+ "$fresh_flag") fresh_profile=1; continue ;;
199
+ --help|-h) show_help=1 ;;
200
+ --headed) headed=1 ;;
201
+ --profile) explicit_profile=1; append_arg "$arg"; continue ;;
202
+ --cdp-url) explicit_profile=1; append_arg "$arg"; if [ "$#" -gt 0 ]; then append_arg "$1"; shift; fi; continue ;;
203
+ --profile=*|--cdp-url=*|--connect|--mcp|--use-cloud|--cloud-profile-id|--cloud-profile-id=*) explicit_profile=1 ;;
204
+ --session) append_arg "$arg"; if [ "$#" -gt 0 ]; then session=$1; append_arg "$1"; shift; fi; continue ;;
205
+ --session=*) session=${arg#--session=} ;;
206
+ -*) ;;
207
+ open|click|type|input|scroll|back|screenshot|state|switch|close-tab|keys|select|upload|eval|extract|hover|dblclick|rightclick|cookies|wait|get|python) starts_browser=1 ;;
208
+ close|sessions|install|init|setup|doctor|cloud|profile) ;;
209
+ esac
210
+ append_arg "$arg"
211
+ done
212
+
213
+ if [ "$show_help" -eq 1 ]; then
214
+ {
215
+ echo "Pibo browser-use wrapper:"
216
+ echo " Default persistent Chrome profile via CDP."
217
+ echo " Use $fresh_flag for a temporary browser profile."
218
+ echo ""
219
+ } >&2
220
+ fi
221
+
222
+ set --
223
+ if [ -n "$sanitized_args" ]; then
224
+ while IFS= read -r item; do
225
+ set -- "$@" "$item"
226
+ done <<EOF
227
+ $sanitized_args
228
+ EOF
229
+ fi
230
+
231
+ session_pid_file=${BROWSER_USE_HOME:-$HOME/.browser-use}/$session.pid
232
+ session_alive=0
233
+ if [ -s "$session_pid_file" ]; then
234
+ session_pid=$(cat "$session_pid_file" 2>/dev/null || true)
235
+ if [ -n "$session_pid" ] && kill -0 "$session_pid" 2>/dev/null; then
236
+ session_alive=1
237
+ fi
238
+ fi
239
+
240
+ if [ "$starts_browser" -eq 1 ] && [ "$explicit_profile" -eq 0 ] && [ "$fresh_profile" -eq 0 ]; then
241
+ if [ "$session_alive" -eq 1 ] && persistent_chrome_url_if_alive >/dev/null; then
242
+ exec "$real_browser_use" "$@"
243
+ fi
244
+ if [ "$session_alive" -eq 1 ]; then
245
+ "$real_browser_use" --session "$session" close >/dev/null 2>&1 || true
246
+ sleep 0.2
247
+ fi
248
+ cdp_url=$(ensure_persistent_chrome)
249
+ exec "$real_browser_use" --cdp-url "$cdp_url" "$@"
250
+ fi
251
+
252
+ exec "$real_browser_use" "$@"
253
+ WRAPPER
254
+
255
+ chmod +x "$wrapper_path"