@pasko70/pibo 3.0.2 → 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 (69) hide show
  1. package/compute-image/Dockerfile +47 -0
  2. package/compute-image/Dockerfile.dockerignore +5 -0
  3. package/dist/agent-runtime/contract.js +78 -28
  4. package/dist/agent-runtime/portable-history.js +19 -9
  5. package/dist/agent-runtime/registry.js +8 -2
  6. package/dist/agent-runtime/routed-session.js +12 -6
  7. package/dist/agent-runtimes/pi/routed-session.js +10 -4
  8. package/dist/apps/chat/agent-store.js +55 -3
  9. package/dist/apps/chat/data/project-service.js +119 -15
  10. package/dist/apps/chat/data/room-service.js +21 -0
  11. package/dist/apps/chat/loop-api.js +10 -2
  12. package/dist/apps/chat/web-app.js +84 -25
  13. package/dist/apps/chat-ui/assets/{dist-CvaPTBTN.js → dist-CUQJqggN.js} +1 -1
  14. package/dist/apps/chat-ui/assets/{dist-BPotHecb.js → dist-ClUlQWYN.js} +1 -1
  15. package/dist/apps/chat-ui/assets/{dist-BzqQKeVO.js → dist-Djul9BmZ.js} +1 -1
  16. package/dist/apps/chat-ui/assets/{dist-paagejNj.js → dist-GD0JGdCi.js} +1 -1
  17. package/dist/apps/chat-ui/assets/{dist-B6GZgWSj.js → dist-W5HOqHym.js} +1 -1
  18. package/dist/apps/chat-ui/assets/index-BcjkX-iP.js +228 -0
  19. package/dist/apps/chat-ui/assets/index-CmqRSbBU.css +1 -0
  20. package/dist/apps/chat-ui/index.html +2 -2
  21. package/dist/apps/chat-vscode-web/assets/index-JvrPUGvI.js +43 -0
  22. package/dist/apps/chat-vscode-web/index.html +1 -1
  23. package/dist/apps/cli-ui/InkSessionApp.js +111 -12
  24. package/dist/compute/cli.js +35 -16
  25. package/dist/compute/docker.js +341 -94
  26. package/dist/config/config.js +3 -0
  27. package/dist/core/session-router.js +33 -105
  28. package/dist/data/pibo-store.js +8 -1
  29. package/dist/data/schema.js +125 -5
  30. package/dist/debug/agents.js +91 -89
  31. package/dist/debug/index.js +2 -0
  32. package/dist/debug/pty.js +127 -48
  33. package/dist/gateway/cli.js +4 -0
  34. package/dist/loops/channel.js +3 -1
  35. package/dist/loops/cli.js +2 -1
  36. package/dist/loops/service.js +90 -11
  37. package/dist/loops/store.js +100 -74
  38. package/dist/mcp/agent-context.js +13 -26
  39. package/dist/mcp/commands/info.js +3 -1
  40. package/dist/mcp/config-command.js +46 -2
  41. package/dist/mcp/config.js +18 -4
  42. package/dist/plugins/context-files-store.js +6 -6
  43. package/dist/previews/base-url.js +34 -0
  44. package/dist/previews/config.js +2 -32
  45. package/dist/ralph/store.js +5 -0
  46. package/dist/reliability/store.js +174 -111
  47. package/dist/session-ui/terminalRows.js +2 -1
  48. package/dist/subagents/observation-query.js +121 -0
  49. package/dist/tools/agent-browser-leases.js +58 -23
  50. package/dist/tools/agent-browser-wrapper.js +1 -1
  51. package/dist/tools/browser-use-leases.js +129 -16
  52. package/dist/tools/browser-use-wrapper.js +1 -1
  53. package/dist/tools/index.js +27 -11
  54. package/dist/tools/python-runtime.js +10 -3
  55. package/dist/tools/registry.js +1 -1
  56. package/dist/tools/runtime/node-backend.js +16 -5
  57. package/dist/tools/runtime/node-worker-source.js +112 -33
  58. package/dist/tools/runtime/python-backend.js +16 -5
  59. package/dist/tools/runtime/python-worker-source.js +167 -16
  60. package/dist/tools/runtime/registry.js +23 -10
  61. package/dist/user-skills/store.js +0 -1
  62. package/npm-shrinkwrap.json +9 -2
  63. package/package.json +8 -2
  64. package/scripts/docker-entrypoint.sh +46 -0
  65. package/scripts/prepare-agent-browser-wrapper.sh +70 -0
  66. package/scripts/prepare-browser-use-wrapper.sh +255 -0
  67. package/dist/apps/chat-ui/assets/index-6JJV-eic.js +0 -228
  68. package/dist/apps/chat-ui/assets/index-CeL9JPP5.css +0 -1
  69. package/dist/apps/chat-vscode-web/assets/index-U-MSErGa.js +0 -43
@@ -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"