@pasko70/pibo 1.0.5 → 1.2.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/README.md +106 -250
- package/context/codex-base-prompt.md +4 -0
- package/context/compute-worker.md +23 -0
- package/context/pibo-native-tooling.md +18 -0
- package/context/pibo-system-prompt.md +69 -8
- package/dist/api/simple-agent-api.js +136 -0
- package/dist/app-context.js +4 -0
- package/dist/apps/chat/agent-profiles.js +42 -5
- package/dist/apps/chat/agent-store.js +113 -16
- package/dist/apps/chat/chat-api-routes.js +311 -0
- package/dist/apps/chat/chat-capability-routes.js +90 -0
- package/dist/apps/chat/chat-files.js +178 -0
- package/dist/apps/chat/chat-request-normalizers.js +681 -0
- package/dist/apps/chat/chat-settings-routes.js +75 -0
- package/dist/apps/chat/chat-trace-helpers.js +94 -0
- package/dist/apps/chat/chat-user-skill-routes.js +149 -0
- package/dist/apps/chat/cron-api.js +213 -0
- package/dist/apps/chat/data/chat-data-mappers.js +74 -0
- package/dist/apps/chat/data/event-command-service.js +75 -0
- package/dist/apps/chat/data/navigation-query-service.js +11 -0
- package/dist/apps/chat/data/project-service.js +844 -0
- package/dist/apps/chat/data/read-state-service.js +42 -0
- package/dist/apps/chat/data/room-service.js +52 -0
- package/dist/apps/chat/data/session-query-service.js +63 -0
- package/dist/apps/chat/data/timeline-query-service.js +96 -0
- package/dist/apps/chat/event-log.js +1 -307
- package/dist/apps/chat/model-catalog.js +47 -0
- package/dist/apps/chat/output-compactor.js +126 -0
- package/dist/apps/chat/output-event-policy.js +17 -0
- package/dist/apps/chat/project-workflow-human-actions.js +347 -0
- package/dist/apps/chat/project-workflow-sessions.js +260 -0
- package/dist/apps/chat/provider-auth-actions.js +43 -0
- package/dist/apps/chat/ralph-api.js +156 -0
- package/dist/apps/chat/read-model.js +1 -218
- package/dist/apps/chat/rooms.js +1 -321
- package/dist/apps/chat/static-assets.js +996 -0
- package/dist/apps/chat/stream.js +29 -6
- package/dist/apps/chat/trace.js +179 -1003
- package/dist/apps/chat/types/event-store.js +1 -0
- package/dist/apps/chat/types/read-model.js +1 -0
- package/dist/apps/chat/types/rooms.js +36 -0
- package/dist/apps/chat/web-app.js +3168 -1811
- package/dist/apps/chat/workflow-catalog.js +572 -0
- package/dist/apps/chat/workflow-edge-compatibility.js +51 -0
- package/dist/apps/chat/workflow-json-schema-validation.js +335 -0
- package/dist/apps/chat/workflow-persistence-model.js +140 -0
- package/dist/apps/chat/workflow-persistence.js +633 -0
- package/dist/apps/chat/workflow-registered-ref-params.js +130 -0
- package/dist/apps/chat/workflow-registered-ref-pickers.js +179 -0
- package/dist/apps/chat/workflow-registered-ref-validation.js +210 -0
- package/dist/apps/chat/workflow-v2-security-validation.js +93 -0
- package/dist/apps/chat/workflow-validation-helpers.js +114 -0
- package/dist/apps/chat-ui/assets/{dist-CI0Xj2Cp.js → dist-B4lw9z4F.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-aMr2VYOu.js → dist-BbTaHWON.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-u2OzzOTm.js → dist-BcT_c1EJ.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-Di1ScJ22.js → dist-CGINd7XU.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-wiRpAHIv.js → dist-CrBzZkUp.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CaNOvqMY.js → dist-CyyISotB.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-zgYUl2B-.js → dist-DFbnFNpX.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-CNlhGq5i.js → dist-DGLWQLX8.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-BGxHKHPX.js → dist-DfcIkFSN.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DrM-H3e1.js → dist-sKDHTwaT.js} +1 -1
- package/dist/apps/chat-ui/assets/{dist-DpmEro5R.js → dist-y9D6la48.js} +1 -1
- package/dist/apps/chat-ui/assets/index-C25VYnyb.css +1 -0
- package/dist/apps/chat-ui/assets/index-CUkuvI3v.js +165 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-144x144.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-192x192.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-48x48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-512x512.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-72x72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/android/launchericon-96x96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/1024.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/114.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/120.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/128.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/144.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/152.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/167.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/180.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/192.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/29.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/50.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/512.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/57.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/58.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/76.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/ios/87.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/LargeTile.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SmallTile.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/SplashScreen.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square150x150Logo.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-24.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-30.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-36.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-44.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-lightunplated_targetsize-96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-24.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-30.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-36.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-44.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.altform-unplated_targetsize-96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-16.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-20.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-24.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-256.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-30.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-32.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-36.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-40.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-44.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-48.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-60.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-64.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-72.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-80.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Square44x44Logo.targetsize-96.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/StoreLogo.scale-400.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-100.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-125.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-150.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-200.png +0 -0
- package/dist/apps/chat-ui/assets/pwa-images/windows/Wide310x150Logo.scale-400.png +0 -0
- package/dist/apps/chat-ui/index.html +8 -3
- package/dist/apps/chat-ui/manifest.webmanifest +25 -0
- package/dist/apps/chat-ui/sw.js +41 -0
- package/dist/apps/cli-ui/InkSessionApp.js +1218 -0
- package/dist/apps/cli-ui/InkTerminalLine.js +53 -0
- package/dist/apps/cli-ui/InkTerminalRow.js +304 -0
- package/dist/apps/cli-ui/InkTerminalView.js +25 -0
- package/dist/apps/cli-ui/cliSessionsCommand.js +232 -0
- package/dist/apps/cli-ui/index.js +8 -0
- package/dist/apps/cli-ui/inkColors.js +67 -0
- package/dist/apps/cli-ui/inkJson.js +244 -0
- package/dist/apps/cli-ui/inkMarkdown.js +122 -0
- package/dist/apps/context-files-ui/assets/{dist-DFi2YGux.js → dist-BOiGdrG-.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-DyfSeBMu.js → dist-DK01b7x4.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-CwbH_3RN.js → dist-DPG9jOQ-.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-dTBsFYAl.js → dist-Dp5AH00p.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-CxRLRmMx.js → dist-DqYw0LH7.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-MyZgX9K2.js → dist-TF5iO5ML.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-DQXzt2Ng.js → dist-TbjAhles.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-YwR9dpb-.js → dist-ZsBbt0uY.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-CKQF1zEu.js → dist-kmsvtHkH.js} +1 -1
- package/dist/apps/context-files-ui/assets/{dist-BJW3917N.js → dist-vnd7PMu3.js} +1 -1
- package/dist/apps/context-files-ui/assets/{index-BwRDoHMC.css → index-B92tL3Pp.css} +1 -1
- package/dist/apps/context-files-ui/assets/{index-GwvjXytt.js → index-BhAWD3dv.js} +2 -2
- package/dist/apps/context-files-ui/index.html +2 -2
- package/dist/auth/better-auth.js +2 -1
- package/dist/auth/login-actions.js +251 -0
- package/dist/auth/openai-codex-usage.js +147 -0
- package/dist/bin/pibo.js +0 -0
- package/dist/bin/rg.js +15 -0
- package/dist/cli-session/fakeSessionSource.js +804 -0
- package/dist/cli-session/index.js +3 -0
- package/dist/cli-session/localSessionSource.js +1144 -0
- package/dist/cli-session/sessionSource.js +13 -0
- package/dist/cli.js +142 -14
- package/dist/compute/cli.js +415 -0
- package/dist/compute/docker.js +827 -0
- package/dist/compute/resource-health.js +333 -0
- package/dist/compute/resource-policy.js +98 -0
- package/dist/config/config.js +9 -5
- package/dist/core/context-build.js +677 -0
- package/dist/core/model-defaults.js +51 -9
- package/dist/core/pibo-home.js +8 -0
- package/dist/core/profiles.js +48 -0
- package/dist/core/provider-telemetry.js +222 -0
- package/dist/core/routed-session.js +441 -47
- package/dist/core/runtime-telemetry.js +853 -0
- package/dist/core/runtime.js +103 -15
- package/dist/core/session-errors.js +47 -0
- package/dist/core/session-model.js +39 -0
- package/dist/core/session-router.js +292 -62
- package/dist/core/shared-app.js +17 -0
- package/dist/core/skill-expansion.js +43 -0
- package/dist/core/system-prompt-template.js +9 -9
- package/dist/core/telemetry-staleness.js +128 -0
- package/dist/core/test-output-compaction.js +145 -0
- package/dist/core/user-settings.js +73 -0
- package/dist/cron/channel.js +28 -0
- package/dist/cron/cli.js +230 -0
- package/dist/cron/plugin.js +11 -0
- package/dist/cron/schedule.js +214 -0
- package/dist/cron/service.js +177 -0
- package/dist/cron/store.js +349 -0
- package/dist/cron/types.js +1 -0
- package/dist/data/cli.js +184 -0
- package/dist/data/event-log.js +106 -0
- package/dist/data/final-app-space-cutover-migration.js +728 -0
- package/dist/data/ingest-service.js +389 -0
- package/dist/data/message-store.js +62 -0
- package/dist/data/navigation-store.js +75 -0
- package/dist/data/observation-store.js +46 -0
- package/dist/data/payload-store.js +144 -0
- package/dist/data/pibo-store.js +59 -0
- package/dist/data/schema.js +434 -0
- package/dist/data/session-store.js +63 -0
- package/dist/data/shared-app-migration.js +757 -0
- package/dist/data/sqlite-schema.js +12 -0
- package/dist/data/telemetry-preview.js +65 -0
- package/dist/data/telemetry-queries.js +212 -0
- package/dist/data/telemetry-retention.js +50 -0
- package/dist/data/telemetry-rows.js +158 -0
- package/dist/data/telemetry.js +357 -0
- package/dist/debug/delta-compaction.js +99 -0
- package/dist/debug/detail-format.js +86 -0
- package/dist/debug/events.js +149 -29
- package/dist/debug/failures.js +162 -0
- package/dist/debug/index.js +655 -30
- package/dist/debug/messages.js +185 -0
- package/dist/debug/next-commands.js +6 -0
- package/dist/debug/payloads.js +123 -0
- package/dist/debug/pty.js +924 -0
- package/dist/debug/session.js +45 -15
- package/dist/debug/sql.js +1 -1
- package/dist/debug/stores.js +18 -13
- package/dist/debug/summary.js +72 -0
- package/dist/debug/telemetry.js +649 -0
- package/dist/debug/tools.js +168 -0
- package/dist/debug/trace-render-check.js +151 -0
- package/dist/debug/trace.js +152 -27
- package/dist/debug/web-artifacts.js +63 -0
- package/dist/debug/web-options.js +313 -0
- package/dist/debug/web-render-analysis.js +310 -0
- package/dist/debug/web-snapshot-browser-scripts.js +303 -0
- package/dist/debug/web-streaming-benchmark-analysis.js +605 -0
- package/dist/debug/web-streaming-browser-library.js +928 -0
- package/dist/debug/web-streaming-browser-scripts.js +242 -0
- package/dist/debug/web-streaming-provider-telemetry.js +194 -0
- package/dist/debug/web-streaming-report.js +493 -0
- package/dist/debug/web-streaming-types.js +1 -0
- package/dist/debug/web.js +574 -0
- package/dist/gateway/backup.js +83 -0
- package/dist/gateway/cli.js +511 -0
- package/dist/gateway/fallback.js +155 -0
- package/dist/gateway/pidfile.js +84 -0
- package/dist/gateway/protocol.js +16 -0
- package/dist/gateway/server.js +174 -17
- package/dist/gateway/tool.js +54 -51
- package/dist/gateway/web.js +74 -2
- package/dist/index.js +3 -1
- package/dist/local/client.js +3 -3
- package/dist/local/extension.js +8 -5
- package/dist/plugins/builtin.js +252 -49
- package/dist/plugins/chat-vscode-web.js +28 -0
- package/dist/plugins/codex-compat.js +0 -41
- package/dist/plugins/context-files.js +98 -18
- package/dist/plugins/dev-auth.js +124 -0
- package/dist/plugins/native-tooling.js +15 -0
- package/dist/plugins/registry.js +66 -2
- package/dist/plugins/web-annotations.js +27 -0
- package/dist/providers/minimax.js +70 -0
- package/dist/providers/openai-compat.js +48 -0
- package/dist/ralph/channel.js +8 -0
- package/dist/ralph/cli.js +152 -0
- package/dist/ralph/plugin.js +14 -0
- package/dist/ralph/service.js +271 -0
- package/dist/ralph/stopping.js +151 -0
- package/dist/ralph/store.js +450 -0
- package/dist/ralph/templates.js +200 -0
- package/dist/ralph/types.js +1 -0
- package/dist/reliability/store.js +42 -26
- package/dist/runs/registry.js +72 -35
- package/dist/session-ui/commandCatalog.js +193 -0
- package/dist/session-ui/commandResults.js +95 -0
- package/dist/session-ui/index.js +7 -0
- package/dist/session-ui/ownerViewModel.js +27 -0
- package/dist/session-ui/roomSessionViewModel.js +69 -0
- package/dist/session-ui/statusViewModel.js +127 -0
- package/dist/session-ui/terminalCards.js +210 -0
- package/dist/session-ui/terminalRows.js +937 -0
- package/dist/session-ui/terminalValue.js +45 -0
- package/dist/sessions/pibo-data-store.js +178 -0
- package/dist/sessions/sqlite-store.js +78 -12
- package/dist/sessions/store.js +11 -4
- package/dist/sessions/workflow-session-kind.js +20 -0
- package/dist/setup/cli.js +567 -0
- package/dist/shared/trace-async-agent-runs.js +127 -0
- package/dist/shared/trace-engine.js +96 -0
- package/dist/shared/trace-event-projection.js +679 -0
- package/dist/shared/trace-live-reducer.js +191 -0
- package/dist/shared/trace-nodes.js +76 -0
- package/dist/shared/trace-order.js +11 -10
- package/dist/shared/trace-patch-nodes.js +83 -0
- package/dist/shared/trace-run-notifications.js +69 -0
- package/dist/shared/trace-subagent-links.js +46 -0
- package/dist/shared/trace-transcript.js +303 -0
- package/dist/shared/trace-types.js +1 -0
- package/dist/shared-app.js +4 -0
- package/dist/signals/aggregate.js +65 -0
- package/dist/signals/events.js +1 -0
- package/dist/signals/projector.js +158 -0
- package/dist/signals/registry.js +513 -0
- package/dist/signals/store.js +1 -0
- package/dist/signals/types.js +1 -0
- package/dist/skills/cli.js +117 -0
- package/dist/tools/agent-browser-leases.js +219 -0
- package/dist/tools/agent-browser-wrapper.js +99 -0
- package/dist/tools/browser-pool.js +623 -0
- package/dist/tools/browser-use-cdp.js +56 -4
- package/dist/tools/browser-use-leases.js +215 -37
- package/dist/tools/browser-use-wrapper.js +508 -65
- package/dist/tools/cdp-client.js +189 -0
- package/dist/tools/guides.js +203 -4
- package/dist/tools/index.js +666 -16
- package/dist/tools/npm-runtime.js +136 -0
- package/dist/tools/registry.js +107 -8
- package/dist/tools/runtime/index.js +3 -0
- package/dist/tools/runtime/node-backend.js +225 -0
- package/dist/tools/runtime/node-worker-source.js +206 -0
- package/dist/tools/runtime/python-backend.js +227 -0
- package/dist/tools/runtime/python-worker-source.js +178 -0
- package/dist/tools/runtime/registry.js +255 -0
- package/dist/tools/runtime/tool.js +168 -0
- package/dist/tools/runtime/types.js +1 -0
- package/dist/tools/web-search.js +2 -1
- package/dist/user-skills/installer.js +214 -0
- package/dist/user-skills/manager.js +35 -0
- package/dist/user-skills/store.js +267 -0
- package/dist/user-skills/types.js +1 -0
- package/dist/web/auth.js +5 -1
- package/dist/web/channel.js +86 -0
- package/dist/web/http.js +79 -14
- package/dist/web-annotations/api.js +348 -0
- package/dist/web-annotations/attachments.js +201 -0
- package/dist/web-annotations/cdp.js +1107 -0
- package/dist/web-annotations/index.js +7 -0
- package/dist/web-annotations/store.js +407 -0
- package/dist/web-annotations/tools.js +350 -0
- package/dist/web-annotations/types.js +34 -0
- package/dist/web-annotations/validation.js +288 -0
- package/docs/README.md +23 -0
- package/docs/ops/install-developer-host.md +112 -0
- package/docs/ops/install-user-host.md +76 -0
- package/docs/ops/upgrade-user-to-developer-host.md +69 -0
- package/package.json +24 -10
- package/{.codex/skills → skills/builtin}/pi-agent-harness/SKILL.md +24 -24
- package/skills/builtin/pibo-docker-system/SKILL.md +170 -0
- package/skills/builtin/pibo-spec-writing/SKILL.md +330 -0
- package/skills/builtin/prd/SKILL.md +143 -0
- package/skills/builtin/ralph-loop/SKILL.md +359 -0
- package/skills/builtin/ralph-prd-json/SKILL.md +123 -0
- package/skills/builtin/skill-creator/LICENSE.txt +202 -0
- package/skills/builtin/skill-creator/SKILL.md +513 -0
- package/skills/builtin/skill-creator/agents/analyzer.md +274 -0
- package/skills/builtin/skill-creator/agents/comparator.md +202 -0
- package/skills/builtin/skill-creator/agents/grader.md +223 -0
- package/skills/builtin/skill-creator/assets/eval_review.html +146 -0
- package/skills/builtin/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/builtin/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/builtin/skill-creator/references/schemas.md +430 -0
- package/skills/builtin/skill-creator/scripts/__init__.py +0 -0
- package/skills/builtin/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/builtin/skill-creator/scripts/generate_report.py +326 -0
- package/skills/builtin/skill-creator/scripts/improve_description.py +247 -0
- package/skills/builtin/skill-creator/scripts/package_skill.py +136 -0
- package/skills/builtin/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/builtin/skill-creator/scripts/run_eval.py +310 -0
- package/skills/builtin/skill-creator/scripts/run_loop.py +328 -0
- package/skills/builtin/skill-creator/scripts/utils.py +47 -0
- package/skills/builtin/web-annotations/SKILL.md +93 -0
- package/dist/apps/chat-ui/assets/index-B_E935fP.js +0 -151
- package/dist/apps/chat-ui/assets/index-Dk-opWl3.css +0 -1
- package/dist/env.js +0 -32
- package/dist/plugins/core-tools.js +0 -94
- package/dist/plugins/example.js +0 -67
- package/dist/plugins/remote-agent.js +0 -9
- package/dist/remote/channel.js +0 -176
- package/dist/remote/client.js +0 -92
- package/dist/remote/examples/tui-controller.js +0 -263
- package/dist/remote/protocol.js +0 -55
- package/dist/remote/session-client.js +0 -189
- package/dist/sessions/bindings.js +0 -41
- /package/{.codex/skills → skills/builtin}/pi-agent-harness/agents/openai.yaml +0 -0
package/dist/tools/index.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
1
4
|
import { Command } from 'commander';
|
|
2
5
|
import { ErrorCode, formatCliError } from '../cli-errors.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
6
|
+
import { acquireAgentBrowserLease, listAgentBrowserLeases, printAgentBrowserAuthTemplateEnv, printAgentBrowserAuthTemplatePath, reapStaleAgentBrowserLeases, releaseAgentBrowserLease, } from './agent-browser-leases.js';
|
|
7
|
+
import { ensureAgentBrowserWrapper } from './agent-browser-wrapper.js';
|
|
8
|
+
import { acquireBrowserUseLease, isExpired, listBrowserUseLeases, printBrowserUseAuthTemplateEnv, printBrowserUseAuthTemplatePath, readRegistry, reapStaleBrowserUseLeases, releaseBrowserUseLease, } from './browser-use-leases.js';
|
|
9
|
+
import { formatBrowserUseTargets, listBrowserUseCdpTargets, normalizeCdpUrlSync, printAttachChatExports, selectBestChatTarget, } from './browser-use-cdp.js';
|
|
5
10
|
import { ensureBrowserUseWrapper } from './browser-use-wrapper.js';
|
|
6
|
-
import {
|
|
11
|
+
import { browserPoolPaths, createEmptyBrowserPoolState, loadBrowserPoolState, reapIdleBrowserPool, } from './browser-pool.js';
|
|
12
|
+
import { detectDesktopEnv, hasDesktopDisplay } from './desktop-env.js';
|
|
7
13
|
import { doctorCliTool, findCliToolEntry, findToolGuide, getCliToolStatus, installCliTool, listCliToolEntries, removeCliTool, } from './registry.js';
|
|
8
14
|
function requireEntry(name) {
|
|
9
15
|
const entry = findCliToolEntry(name);
|
|
@@ -42,11 +48,33 @@ function printShow(name) {
|
|
|
42
48
|
const status = getCliToolStatus(entry);
|
|
43
49
|
console.log(`${entry.name}`);
|
|
44
50
|
console.log(` ${entry.description}`);
|
|
45
|
-
console.log(`
|
|
51
|
+
console.log(` kind: ${entry.kind === 'internal' ? 'built-in' : 'external'}`);
|
|
52
|
+
if (entry.runtime)
|
|
53
|
+
console.log(` package: ${entry.runtime.packageName}`);
|
|
46
54
|
console.log(` status: ${status.installed ? 'installed' : 'available'}`);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
55
|
+
if (status.rootDir)
|
|
56
|
+
console.log(` runtime: ${status.rootDir}`);
|
|
57
|
+
if (status.homeDir)
|
|
58
|
+
console.log(` home: ${status.homeDir}`);
|
|
59
|
+
if (entry.name === 'browser-use') {
|
|
60
|
+
const wrapperPath = ensureBrowserUseWrapper(status);
|
|
61
|
+
console.log(` wrapper: ${wrapperPath ?? 'not generated'}`);
|
|
62
|
+
console.log(` executable: ${status.executablePath}`);
|
|
63
|
+
console.log('');
|
|
64
|
+
console.log(' IMPORTANT: Always use the wrapper path above, not the raw executable.');
|
|
65
|
+
console.log(' The wrapper manages persistent Chrome profiles and CDP automatically.');
|
|
66
|
+
}
|
|
67
|
+
else if (entry.name === 'agent-browser') {
|
|
68
|
+
const wrapperPath = ensureAgentBrowserWrapper(status);
|
|
69
|
+
console.log(` wrapper: ${wrapperPath ?? 'not generated'}`);
|
|
70
|
+
console.log(` executable: ${status.executablePath}`);
|
|
71
|
+
console.log('');
|
|
72
|
+
console.log(' IMPORTANT: Always use the wrapper path above, not the raw executable.');
|
|
73
|
+
console.log(' The wrapper keeps Agent Browser state under the Pibo tool home.');
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log(` executable: ${status.executablePath}`);
|
|
77
|
+
}
|
|
50
78
|
console.log('');
|
|
51
79
|
console.log('Guides:');
|
|
52
80
|
for (const guide of entry.guides) {
|
|
@@ -60,11 +88,19 @@ function printShow(name) {
|
|
|
60
88
|
}
|
|
61
89
|
console.log('');
|
|
62
90
|
console.log('Next:');
|
|
63
|
-
|
|
91
|
+
if (entry.kind !== 'internal')
|
|
92
|
+
console.log(` pibo tools env ${entry.name}`);
|
|
64
93
|
console.log(` pibo tools guide ${entry.name} ${entry.guides[0]?.name ?? ''}`.trimEnd());
|
|
65
94
|
if (entry.name === 'browser-use') {
|
|
66
95
|
console.log(' pibo tools browser-use');
|
|
67
96
|
}
|
|
97
|
+
if (entry.name === 'agent-browser') {
|
|
98
|
+
console.log(' pibo tools agent-browser');
|
|
99
|
+
}
|
|
100
|
+
if (entry.name === 'ralph') {
|
|
101
|
+
console.log(' pibo tools ralph');
|
|
102
|
+
console.log(' pibo ralph templates');
|
|
103
|
+
}
|
|
68
104
|
}
|
|
69
105
|
function printGuides(name) {
|
|
70
106
|
const entry = requireEntry(name);
|
|
@@ -95,12 +131,34 @@ function printGuide(name, guideName) {
|
|
|
95
131
|
}
|
|
96
132
|
function printPath(name) {
|
|
97
133
|
const entry = requireEntry(name);
|
|
98
|
-
|
|
134
|
+
const status = getCliToolStatus(entry);
|
|
135
|
+
if (entry.name === 'browser-use') {
|
|
136
|
+
const wrapperPath = ensureBrowserUseWrapper(status);
|
|
137
|
+
if (wrapperPath) {
|
|
138
|
+
console.log(wrapperPath);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (entry.name === 'agent-browser') {
|
|
143
|
+
const wrapperPath = ensureAgentBrowserWrapper(status);
|
|
144
|
+
if (wrapperPath) {
|
|
145
|
+
console.log(wrapperPath);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
console.log(status.executablePath);
|
|
99
150
|
}
|
|
100
151
|
function printEnv(name) {
|
|
101
152
|
const entry = requireEntry(name);
|
|
102
153
|
const status = getCliToolStatus(entry);
|
|
103
154
|
const desktop = detectDesktopEnv();
|
|
155
|
+
if (entry.kind === 'internal') {
|
|
156
|
+
console.log(`# ${entry.name} is built into pibo; no extra environment is required.`);
|
|
157
|
+
console.log(`# Run: pibo ${entry.name} --help`);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (!entry.runtime)
|
|
161
|
+
throw new Error(`CLI tool "${entry.name}" is missing runtime`);
|
|
104
162
|
if (process.platform === 'win32') {
|
|
105
163
|
console.log(`$env:PATH = "${status.executablePath.replace(/\\[^\\]+$/, '')};$env:PATH"`);
|
|
106
164
|
if (entry.runtime.homeEnvVar)
|
|
@@ -108,7 +166,7 @@ function printEnv(name) {
|
|
|
108
166
|
return;
|
|
109
167
|
}
|
|
110
168
|
const binDir = status.executablePath.replace(/\/[^/]+$/, '');
|
|
111
|
-
const wrapperPath = ensureBrowserUseWrapper(status);
|
|
169
|
+
const wrapperPath = entry.name === 'agent-browser' ? ensureAgentBrowserWrapper(status) : ensureBrowserUseWrapper(status);
|
|
112
170
|
const wrapperBinDir = wrapperPath ? wrapperPath.replace(/\/[^/]+$/, '') : `${status.homeDir}/bin`;
|
|
113
171
|
console.log(`export PATH="${wrapperBinDir}:${binDir}:$PATH"`);
|
|
114
172
|
if (entry.runtime.homeEnvVar)
|
|
@@ -132,6 +190,13 @@ function parsePositiveInteger(value) {
|
|
|
132
190
|
}
|
|
133
191
|
return parsed;
|
|
134
192
|
}
|
|
193
|
+
function parseNonNegativeInteger(value) {
|
|
194
|
+
const parsed = Number.parseInt(value, 10);
|
|
195
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
196
|
+
throw new Error(`Expected a non-negative integer, got "${value}"`);
|
|
197
|
+
}
|
|
198
|
+
return parsed;
|
|
199
|
+
}
|
|
135
200
|
function printBrowserUseDiscovery() {
|
|
136
201
|
console.log(`pibo tools browser-use - browser-use helpers
|
|
137
202
|
|
|
@@ -147,16 +212,407 @@ Commands:
|
|
|
147
212
|
lease list List authenticated browser slots
|
|
148
213
|
lease release <id> Release one browser slot
|
|
149
214
|
lease reap-stale Release expired or dead browser slots
|
|
215
|
+
pool status Show read-only managed browser-pool status
|
|
216
|
+
pool reap Reap an idle managed browser pool
|
|
217
|
+
health Check browser-use health and report issues
|
|
150
218
|
|
|
151
219
|
Next:
|
|
152
220
|
pibo tools show browser-use
|
|
153
221
|
pibo tools guide browser-use browser-use
|
|
154
222
|
pibo tools browser-use targets
|
|
155
223
|
pibo tools browser-use auth-template env
|
|
156
|
-
pibo tools browser-use lease acquire
|
|
224
|
+
pibo tools browser-use lease acquire
|
|
225
|
+
pibo tools browser-use pool status
|
|
226
|
+
pibo tools browser-use pool reap --json`);
|
|
227
|
+
}
|
|
228
|
+
function getBrowserPoolStatusIdentity(options) {
|
|
229
|
+
return {
|
|
230
|
+
workerId: options.workerId || process.env.PIBO_BROWSER_POOL_WORKER_ID || process.env.PIBO_COMPUTE_WORKER_ID || process.env.HOSTNAME || 'local',
|
|
231
|
+
poolId: options.poolId || process.env.PIBO_BROWSER_POOL_ID || 'default',
|
|
232
|
+
maxBrowserProcesses: parsePositiveInteger(process.env.PIBO_BROWSER_POOL_MAX_PROCESSES || '1'),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function getBrowserPoolRoot(status, options) {
|
|
236
|
+
return options.root || process.env.PIBO_BROWSER_POOL_ROOT || join(process.env.BROWSER_USE_HOME || status.homeDir, 'pibo-browser-pool');
|
|
237
|
+
}
|
|
238
|
+
function browserPoolStatusNextCommands(state) {
|
|
239
|
+
if (state.state === 'stale' || state.state === 'dirty') {
|
|
240
|
+
return [
|
|
241
|
+
'pibo tools browser-use pool status --json',
|
|
242
|
+
'pibo tools browser-use pool reap --json',
|
|
243
|
+
'pibo tools browser-use health',
|
|
244
|
+
'eval "$(pibo tools env browser-use)" && browser-use --pibo-ensure-chrome',
|
|
245
|
+
];
|
|
246
|
+
}
|
|
247
|
+
if (state.state === 'empty') {
|
|
248
|
+
return ['eval "$(pibo tools env browser-use)" && browser-use --pibo-ensure-chrome'];
|
|
249
|
+
}
|
|
250
|
+
return ['pibo tools browser-use pool status --json'];
|
|
251
|
+
}
|
|
252
|
+
async function getBrowserPoolStatus(status, options) {
|
|
253
|
+
const identity = getBrowserPoolStatusIdentity(options);
|
|
254
|
+
const rootDir = getBrowserPoolRoot(status, options);
|
|
255
|
+
const paths = browserPoolPaths(rootDir, identity);
|
|
256
|
+
const stateFileExists = existsSync(paths.statePath);
|
|
257
|
+
let state = await loadBrowserPoolState(paths.statePath, { ...identity, onMissing: 'empty', onMalformed: 'empty' });
|
|
258
|
+
if (!stateFileExists && state.state === 'empty')
|
|
259
|
+
state = createEmptyBrowserPoolState(identity);
|
|
260
|
+
const staleReason = state.state === 'stale' ? state.lastError || 'Recorded browser is stale' : undefined;
|
|
261
|
+
const dirtyReason = state.state === 'dirty' ? state.lastError || 'Browser pool state is dirty' : undefined;
|
|
262
|
+
return {
|
|
263
|
+
...state,
|
|
264
|
+
rootDir,
|
|
265
|
+
statePath: paths.statePath,
|
|
266
|
+
lockPath: paths.lockPath,
|
|
267
|
+
stateFileExists,
|
|
268
|
+
readOnly: true,
|
|
269
|
+
staleReason,
|
|
270
|
+
dirtyReason,
|
|
271
|
+
nextCommands: browserPoolStatusNextCommands(state),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
function printBrowserPoolStatusText(result) {
|
|
275
|
+
const stateLabel = result.state === 'ready' ? 'ready (idle)' : result.state;
|
|
276
|
+
console.log(`browser pool status: ${stateLabel}`);
|
|
277
|
+
console.log(` worker id: ${result.workerId}`);
|
|
278
|
+
console.log(` pool id: ${result.poolId}`);
|
|
279
|
+
console.log(` max browser processes: ${result.maxBrowserProcesses}`);
|
|
280
|
+
console.log(` pid: ${result.pid ?? '-'}`);
|
|
281
|
+
console.log(` process group id: ${result.processGroupId ?? '-'}`);
|
|
282
|
+
console.log(` CDP URL: ${result.cdpUrl ?? '-'}`);
|
|
283
|
+
console.log(` CDP port: ${result.cdpPort ?? '-'}`);
|
|
284
|
+
console.log(` user-data dir: ${result.userDataDir ?? '-'}`);
|
|
285
|
+
console.log(` active lease id: ${result.activeLeaseId ?? '-'}`);
|
|
286
|
+
console.log(` holder: ${result.holder ?? '-'}`);
|
|
287
|
+
console.log(` last used at: ${result.lastUsedAt ?? '-'}`);
|
|
288
|
+
console.log(` idle expiry: ${result.idleExpiresAt ?? '-'}`);
|
|
289
|
+
console.log(` root: ${result.rootDir}`);
|
|
290
|
+
console.log(` state file: ${result.stateFileExists ? result.statePath : `${result.statePath} (missing)`}`);
|
|
291
|
+
if (result.staleReason || result.dirtyReason || result.lastError) {
|
|
292
|
+
console.log(` stale/dirty reason: ${result.staleReason || result.dirtyReason || result.lastError}`);
|
|
293
|
+
}
|
|
294
|
+
if (result.state === 'stale' || result.state === 'dirty') {
|
|
295
|
+
console.log('');
|
|
296
|
+
console.log('Next:');
|
|
297
|
+
for (const command of result.nextCommands)
|
|
298
|
+
console.log(` ${command}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async function printBrowserPoolStatus(status, options) {
|
|
302
|
+
const result = await getBrowserPoolStatus(status, options);
|
|
303
|
+
if (options.json) {
|
|
304
|
+
console.log(JSON.stringify(result, null, 2));
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
printBrowserPoolStatusText(result);
|
|
308
|
+
}
|
|
309
|
+
function browserPoolReapNextCommands(result) {
|
|
310
|
+
if (result.cleanupStatus === 'failed' || result.state.state === 'dirty') {
|
|
311
|
+
return [
|
|
312
|
+
'pibo tools browser-use pool status --json',
|
|
313
|
+
'pibo tools browser-use health',
|
|
314
|
+
'pibo tools browser-use pool reap --json',
|
|
315
|
+
];
|
|
316
|
+
}
|
|
317
|
+
return ['pibo tools browser-use pool status --json'];
|
|
318
|
+
}
|
|
319
|
+
async function getBrowserPoolReap(status, options) {
|
|
320
|
+
const identity = getBrowserPoolStatusIdentity(options);
|
|
321
|
+
const rootDir = getBrowserPoolRoot(status, options);
|
|
322
|
+
const paths = browserPoolPaths(rootDir, identity);
|
|
323
|
+
const missingState = !existsSync(paths.statePath);
|
|
324
|
+
const result = missingState
|
|
325
|
+
? {
|
|
326
|
+
reaped: false,
|
|
327
|
+
eligible: false,
|
|
328
|
+
reason: 'Browser pool has no recorded browser to reap',
|
|
329
|
+
affectedLeases: 0,
|
|
330
|
+
affectedBrowserPools: 0,
|
|
331
|
+
terminatedProcessTrees: 0,
|
|
332
|
+
staleStateFiles: 0,
|
|
333
|
+
cleanupStatus: 'skipped',
|
|
334
|
+
lastError: 'Browser pool has no recorded browser to reap',
|
|
335
|
+
state: createEmptyBrowserPoolState(identity),
|
|
336
|
+
}
|
|
337
|
+
: await reapIdleBrowserPool(paths, identity, { idleTimeoutMs: options.idleTimeoutMs });
|
|
338
|
+
return {
|
|
339
|
+
rootDir,
|
|
340
|
+
statePath: paths.statePath,
|
|
341
|
+
lockPath: paths.lockPath,
|
|
342
|
+
counts: {
|
|
343
|
+
affectedLeases: result.affectedLeases,
|
|
344
|
+
affectedBrowserPools: result.affectedBrowserPools,
|
|
345
|
+
terminatedProcessTrees: result.terminatedProcessTrees,
|
|
346
|
+
staleStateFiles: result.staleStateFiles,
|
|
347
|
+
},
|
|
348
|
+
pools: [{
|
|
349
|
+
workerId: result.state.workerId,
|
|
350
|
+
poolId: result.state.poolId,
|
|
351
|
+
reaped: result.reaped,
|
|
352
|
+
eligible: result.eligible,
|
|
353
|
+
reason: result.reason,
|
|
354
|
+
cleanupStatus: result.cleanupStatus,
|
|
355
|
+
lastError: result.lastError,
|
|
356
|
+
state: result.state,
|
|
357
|
+
terminatedProcessTrees: result.terminatedProcessTrees,
|
|
358
|
+
staleStateFiles: result.staleStateFiles,
|
|
359
|
+
affectedLeases: result.affectedLeases,
|
|
360
|
+
}],
|
|
361
|
+
nextCommands: browserPoolReapNextCommands(result),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
function printBrowserPoolReapText(result) {
|
|
365
|
+
const pool = result.pools[0];
|
|
366
|
+
const label = pool.cleanupStatus === 'failed' ? 'failed' : pool.reaped ? 'success' : 'no-op';
|
|
367
|
+
console.log(`browser pool reap: ${label}`);
|
|
368
|
+
console.log(` worker id: ${pool.workerId}`);
|
|
369
|
+
console.log(` pool id: ${pool.poolId}`);
|
|
370
|
+
console.log(` reason: ${pool.reason ?? '-'}`);
|
|
371
|
+
console.log(` cleanup status: ${pool.cleanupStatus}`);
|
|
372
|
+
console.log(` affected leases: ${result.counts.affectedLeases}`);
|
|
373
|
+
console.log(` affected browser pools: ${result.counts.affectedBrowserPools}`);
|
|
374
|
+
console.log(` terminated process trees: ${result.counts.terminatedProcessTrees}`);
|
|
375
|
+
console.log(` stale state files: ${result.counts.staleStateFiles}`);
|
|
376
|
+
console.log(` state file: ${result.statePath}`);
|
|
377
|
+
if (pool.lastError)
|
|
378
|
+
console.log(` error: ${pool.lastError}`);
|
|
379
|
+
if (pool.cleanupStatus === 'failed' || pool.state.state === 'dirty') {
|
|
380
|
+
console.log('');
|
|
381
|
+
console.log('Next:');
|
|
382
|
+
for (const command of result.nextCommands)
|
|
383
|
+
console.log(` ${command}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
async function printBrowserPoolReap(status, options) {
|
|
387
|
+
const result = await getBrowserPoolReap(status, options);
|
|
388
|
+
if (options.json) {
|
|
389
|
+
console.log(JSON.stringify(result, null, 2));
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
printBrowserPoolReapText(result);
|
|
393
|
+
}
|
|
394
|
+
function findChromeBinary() {
|
|
395
|
+
if (process.env.AGENT_BROWSER_EXECUTABLE_PATH && existsSync(process.env.AGENT_BROWSER_EXECUTABLE_PATH)) {
|
|
396
|
+
return process.env.AGENT_BROWSER_EXECUTABLE_PATH;
|
|
397
|
+
}
|
|
398
|
+
if (process.env.PIBO_BROWSER_USE_CHROME && existsSync(process.env.PIBO_BROWSER_USE_CHROME)) {
|
|
399
|
+
return process.env.PIBO_BROWSER_USE_CHROME;
|
|
400
|
+
}
|
|
401
|
+
const candidates = ['google-chrome', 'chromium', 'chromium-browser', 'chrome'];
|
|
402
|
+
for (const name of candidates) {
|
|
403
|
+
const result = spawnSync('command', ['-v', name], { shell: true, encoding: 'utf-8' });
|
|
404
|
+
if (result.status === 0 && result.stdout.trim()) {
|
|
405
|
+
return result.stdout.trim();
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return undefined;
|
|
409
|
+
}
|
|
410
|
+
function checkStaleCdpState(homeDir) {
|
|
411
|
+
const stateDir = join(homeDir, 'pibo-cdp');
|
|
412
|
+
if (!existsSync(stateDir))
|
|
413
|
+
return { stalePids: 0, stalePorts: 0, details: [] };
|
|
414
|
+
let stalePids = 0;
|
|
415
|
+
let stalePorts = 0;
|
|
416
|
+
const details = [];
|
|
417
|
+
for (const file of readdirSync(stateDir)) {
|
|
418
|
+
if (file.endsWith('.pid')) {
|
|
419
|
+
const pidPath = join(stateDir, file);
|
|
420
|
+
const text = readFileSync(pidPath, 'utf-8').trim();
|
|
421
|
+
const pid = Number.parseInt(text, 10);
|
|
422
|
+
let isDead = false;
|
|
423
|
+
if (!Number.isFinite(pid) || pid <= 0) {
|
|
424
|
+
isDead = true;
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
try {
|
|
428
|
+
process.kill(pid, 0);
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
isDead = true;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (isDead) {
|
|
435
|
+
stalePids += 1;
|
|
436
|
+
details.push(`stale pid file: ${file}`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
else if (file.endsWith('.port')) {
|
|
440
|
+
const base = file.slice(0, -5);
|
|
441
|
+
const pidPath = join(stateDir, `${base}.pid`);
|
|
442
|
+
if (!existsSync(pidPath)) {
|
|
443
|
+
stalePorts += 1;
|
|
444
|
+
details.push(`orphan port file: ${file}`);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
return { stalePids, stalePorts, details };
|
|
449
|
+
}
|
|
450
|
+
async function printAgentBrowserHealth(status, json = false) {
|
|
451
|
+
const wrapperPath = join(status.homeDir, 'bin', 'agent-browser');
|
|
452
|
+
const wrapperExists = existsSync(wrapperPath);
|
|
453
|
+
const npmExecutableExists = existsSync(status.executablePath);
|
|
454
|
+
const chromePath = findChromeBinary();
|
|
455
|
+
const desktop = detectDesktopEnv();
|
|
456
|
+
const hasDisplay = hasDesktopDisplay(desktop);
|
|
457
|
+
const nodeVersion = spawnSync('node', ['--version'], { encoding: 'utf-8' });
|
|
458
|
+
const npmVersion = spawnSync('npm', ['--version'], { encoding: 'utf-8' });
|
|
459
|
+
const packageJsonPath = join(status.rootDir, 'node', 'node_modules', 'agent-browser', 'package.json');
|
|
460
|
+
let packageVersion;
|
|
461
|
+
try {
|
|
462
|
+
packageVersion = JSON.parse(readFileSync(packageJsonPath, 'utf-8')).version;
|
|
463
|
+
}
|
|
464
|
+
catch {
|
|
465
|
+
packageVersion = undefined;
|
|
466
|
+
}
|
|
467
|
+
const staleState = checkStaleCdpState(status.homeDir);
|
|
468
|
+
const overall = !wrapperExists || !npmExecutableExists ? 'critical' : staleState.stalePids > 0 || staleState.stalePorts > 0 ? 'degraded' : 'ok';
|
|
469
|
+
const result = {
|
|
470
|
+
overall,
|
|
471
|
+
wrapper: { exists: wrapperExists, path: wrapperPath },
|
|
472
|
+
npmRuntime: { executable: npmExecutableExists, path: status.executablePath, packageVersion },
|
|
473
|
+
node: { ok: nodeVersion.status === 0, version: nodeVersion.stdout.trim() },
|
|
474
|
+
npm: { ok: npmVersion.status === 0, version: npmVersion.stdout.trim() },
|
|
475
|
+
chrome: { found: Boolean(chromePath), path: chromePath },
|
|
476
|
+
display: { available: hasDisplay, display: desktop.display, waylandDisplay: desktop.waylandDisplay },
|
|
477
|
+
staleState: { pidFiles: staleState.stalePids, portFiles: staleState.stalePorts, details: staleState.details },
|
|
478
|
+
nextCommands: ['pibo tools install agent-browser', 'eval "$(pibo tools env agent-browser)"', 'agent-browser doctor --offline --quick'],
|
|
479
|
+
};
|
|
480
|
+
if (json) {
|
|
481
|
+
console.log(JSON.stringify(result, null, 2));
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
console.log(`agent-browser health: ${overall}`);
|
|
485
|
+
console.log(` wrapper: ${wrapperExists ? 'ok' : 'MISSING'} (${wrapperPath})`);
|
|
486
|
+
console.log(` executable: ${npmExecutableExists ? 'ok' : 'MISSING'} (${status.executablePath})`);
|
|
487
|
+
console.log(` package version: ${packageVersion ?? 'unknown'}`);
|
|
488
|
+
console.log(` node: ${nodeVersion.status === 0 ? nodeVersion.stdout.trim() : 'missing'}`);
|
|
489
|
+
console.log(` npm: ${npmVersion.status === 0 ? npmVersion.stdout.trim() : 'missing'}`);
|
|
490
|
+
console.log(` chrome: ${chromePath ? `ok (${chromePath})` : 'not found; upstream install may be needed'}`);
|
|
491
|
+
console.log(` display: ${hasDisplay ? 'available' : 'none'} (${desktop.display || 'no DISPLAY'})`);
|
|
492
|
+
console.log(` stale state: ${staleState.stalePids} stale pid files, ${staleState.stalePorts} orphan port files`);
|
|
493
|
+
if (overall !== 'ok') {
|
|
494
|
+
console.log('');
|
|
495
|
+
console.log('Suggestions:');
|
|
496
|
+
if (!wrapperExists || !npmExecutableExists)
|
|
497
|
+
console.log(' Run: pibo tools install agent-browser');
|
|
498
|
+
if (!chromePath)
|
|
499
|
+
console.log(' Install Chrome/Chromium or run: agent-browser install');
|
|
500
|
+
if (staleState.stalePids > 0 || staleState.stalePorts > 0)
|
|
501
|
+
console.log(' Inspect and release stale sessions before deleting state.');
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
async function printAgentBrowserSessions(status, json = false) {
|
|
505
|
+
const wrapperPath = ensureAgentBrowserWrapper(status) || status.executablePath;
|
|
506
|
+
if (!existsSync(status.executablePath)) {
|
|
507
|
+
const result = { sessions: [], installed: false, nextCommands: ['pibo tools install agent-browser'] };
|
|
508
|
+
console.log(json ? JSON.stringify(result, null, 2) : 'agent-browser is not installed. Run: pibo tools install agent-browser');
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
const result = spawnSync(wrapperPath, ['session', 'list'], {
|
|
512
|
+
encoding: 'utf-8',
|
|
513
|
+
env: { ...process.env, AGENT_BROWSER_HOME: status.homeDir },
|
|
514
|
+
});
|
|
515
|
+
if (json) {
|
|
516
|
+
console.log(JSON.stringify({ installed: true, ok: result.status === 0, stdout: result.stdout, stderr: result.stderr }, null, 2));
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
if (result.stdout.trim())
|
|
520
|
+
console.log(result.stdout.trimEnd());
|
|
521
|
+
if (result.status !== 0 && result.stderr.trim())
|
|
522
|
+
console.error(result.stderr.trimEnd());
|
|
523
|
+
}
|
|
524
|
+
async function printBrowserUseHealth(status, json = false) {
|
|
525
|
+
const wrapperPath = join(status.homeDir, 'bin', 'browser-use');
|
|
526
|
+
const wrapperExists = existsSync(wrapperPath);
|
|
527
|
+
const chromePath = findChromeBinary();
|
|
528
|
+
const desktop = detectDesktopEnv();
|
|
529
|
+
const hasDisplay = hasDesktopDisplay(desktop);
|
|
530
|
+
const staleState = checkStaleCdpState(status.homeDir);
|
|
531
|
+
let expiredLeases = 0;
|
|
532
|
+
try {
|
|
533
|
+
const registry = readRegistry(status);
|
|
534
|
+
for (const lease of registry.leases) {
|
|
535
|
+
if (lease.status === 'active' && isExpired(lease))
|
|
536
|
+
expiredLeases++;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
catch {
|
|
540
|
+
// ignore registry read errors
|
|
541
|
+
}
|
|
542
|
+
const overall = !wrapperExists || !chromePath ? 'critical' : staleState.stalePids > 0 || staleState.stalePorts > 0 || expiredLeases > 0 ? 'degraded' : 'ok';
|
|
543
|
+
const result = {
|
|
544
|
+
overall,
|
|
545
|
+
wrapper: { exists: wrapperExists, path: wrapperPath },
|
|
546
|
+
chrome: { found: Boolean(chromePath), path: chromePath },
|
|
547
|
+
display: { available: hasDisplay, display: desktop.display, waylandDisplay: desktop.waylandDisplay },
|
|
548
|
+
staleState: { pidFiles: staleState.stalePids, portFiles: staleState.stalePorts, details: staleState.details },
|
|
549
|
+
leases: { expired: expiredLeases },
|
|
550
|
+
};
|
|
551
|
+
if (json) {
|
|
552
|
+
console.log(JSON.stringify(result, null, 2));
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
console.log(`browser-use health: ${overall}`);
|
|
556
|
+
console.log(` wrapper: ${wrapperExists ? 'ok' : 'MISSING'} (${wrapperPath})`);
|
|
557
|
+
console.log(` chrome: ${chromePath ? `ok (${chromePath})` : 'NOT FOUND'}`);
|
|
558
|
+
console.log(` display: ${hasDisplay ? 'available' : 'none'} (${desktop.display || 'no DISPLAY'})`);
|
|
559
|
+
console.log(` stale state: ${staleState.stalePids} stale pid files, ${staleState.stalePorts} orphan port files`);
|
|
560
|
+
console.log(` leases: ${expiredLeases} expired`);
|
|
561
|
+
if (overall !== 'ok') {
|
|
562
|
+
console.log('');
|
|
563
|
+
console.log('Suggestions:');
|
|
564
|
+
if (!wrapperExists)
|
|
565
|
+
console.log(' Run: pibo tools install browser-use');
|
|
566
|
+
if (!chromePath)
|
|
567
|
+
console.log(' Install Chrome/Chromium (e.g. apt install chromium)');
|
|
568
|
+
if (staleState.stalePids > 0 || staleState.stalePorts > 0) {
|
|
569
|
+
console.log(' Clean stale state: pibo tools browser-use lease reap-stale');
|
|
570
|
+
}
|
|
571
|
+
if (expiredLeases > 0)
|
|
572
|
+
console.log(' Reap expired leases: pibo tools browser-use lease reap-stale');
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
function printAgentBrowserDiscovery() {
|
|
576
|
+
console.log(`pibo tools agent-browser - Agent Browser helpers
|
|
577
|
+
|
|
578
|
+
Start:
|
|
579
|
+
eval "$(pibo tools env agent-browser)"
|
|
580
|
+
|
|
581
|
+
Commands:
|
|
582
|
+
health Check Agent Browser health and report issues
|
|
583
|
+
sessions List upstream Agent Browser sessions
|
|
584
|
+
targets List Chrome CDP targets with Chat auth hints
|
|
585
|
+
attach-chat Export the best existing authenticated Chat target
|
|
586
|
+
auth-template path Print the default authenticated template profile path
|
|
587
|
+
auth-template env Print shell exports for preparing the auth template profile
|
|
588
|
+
lease acquire Acquire an isolated authenticated browser slot
|
|
589
|
+
lease list List authenticated browser slots
|
|
590
|
+
lease release <id> Release one browser slot
|
|
591
|
+
lease reap-stale Release expired browser slots
|
|
592
|
+
|
|
593
|
+
Next:
|
|
594
|
+
pibo tools show agent-browser
|
|
595
|
+
pibo tools guide agent-browser agent-browser
|
|
596
|
+
pibo tools agent-browser health
|
|
597
|
+
pibo tools agent-browser lease acquire`);
|
|
598
|
+
}
|
|
599
|
+
function printRalphDiscovery() {
|
|
600
|
+
console.log(`pibo tools ralph - Ralph job helpers
|
|
601
|
+
|
|
602
|
+
Commands:
|
|
603
|
+
pibo ralph templates --json
|
|
604
|
+
pibo ralph add --template <id> --room <room-id> --start --json
|
|
605
|
+
pibo ralph list --all --json
|
|
606
|
+
pibo ralph runs --job <job-id> --json
|
|
607
|
+
pibo ralph stop <job-id>
|
|
608
|
+
pibo ralph cancel <job-id>
|
|
609
|
+
|
|
610
|
+
Next:
|
|
611
|
+
pibo tools guide ralph ralph
|
|
612
|
+
pibo ralph templates`);
|
|
157
613
|
}
|
|
158
614
|
function printToolsDiscovery() {
|
|
159
|
-
console.log(`pibo tools - curated
|
|
615
|
+
console.log(`pibo tools - curated CLI tools
|
|
160
616
|
|
|
161
617
|
Commands:
|
|
162
618
|
list List curated tools
|
|
@@ -169,6 +625,8 @@ Commands:
|
|
|
169
625
|
path <name> Print executable path
|
|
170
626
|
env <name> Print shell exports
|
|
171
627
|
browser-use Browser-use auth slots and helper commands
|
|
628
|
+
agent-browser Agent Browser sessions, targets, and auth slots
|
|
629
|
+
ralph Ralph job helper commands
|
|
172
630
|
|
|
173
631
|
Next:
|
|
174
632
|
pibo tools list`);
|
|
@@ -240,6 +698,159 @@ export async function runToolsCli(argv = process.argv) {
|
|
|
240
698
|
.argument('<name>')
|
|
241
699
|
.description('Print shell exports for using the tool directly')
|
|
242
700
|
.action(printEnv);
|
|
701
|
+
program
|
|
702
|
+
.command('ralph')
|
|
703
|
+
.description('Ralph job helper commands')
|
|
704
|
+
.action(printRalphDiscovery);
|
|
705
|
+
const agentBrowser = program
|
|
706
|
+
.command('agent-browser')
|
|
707
|
+
.description('Agent Browser sessions, targets, and auth slots')
|
|
708
|
+
.action(printAgentBrowserDiscovery);
|
|
709
|
+
agentBrowser
|
|
710
|
+
.command('health')
|
|
711
|
+
.description('Check Agent Browser health and report issues')
|
|
712
|
+
.option('--json', 'Print machine-readable health data')
|
|
713
|
+
.action(async (options) => {
|
|
714
|
+
await printAgentBrowserHealth(getCliToolStatus(requireEntry('agent-browser')), Boolean(options.json));
|
|
715
|
+
});
|
|
716
|
+
agentBrowser
|
|
717
|
+
.command('sessions')
|
|
718
|
+
.description('List upstream Agent Browser sessions')
|
|
719
|
+
.option('--json', 'Print machine-readable session output')
|
|
720
|
+
.action(async (options) => {
|
|
721
|
+
await printAgentBrowserSessions(getCliToolStatus(requireEntry('agent-browser')), Boolean(options.json));
|
|
722
|
+
});
|
|
723
|
+
agentBrowser
|
|
724
|
+
.command('targets')
|
|
725
|
+
.description('List Chrome CDP targets with Chat auth hints')
|
|
726
|
+
.option('--cdp-url <url>', 'Chrome DevTools HTTP URL')
|
|
727
|
+
.option('--no-probe', 'Only read /json/list without page DOM probes')
|
|
728
|
+
.option('--json', 'Print machine-readable target data')
|
|
729
|
+
.action(async (options) => {
|
|
730
|
+
const status = getCliToolStatus(requireEntry('agent-browser'));
|
|
731
|
+
const previousHome = process.env.BROWSER_USE_HOME;
|
|
732
|
+
process.env.BROWSER_USE_HOME = status.homeDir;
|
|
733
|
+
try {
|
|
734
|
+
const targets = await listBrowserUseCdpTargets({ cdpUrl: options.cdpUrl, probe: options.probe });
|
|
735
|
+
if (options.json) {
|
|
736
|
+
console.log(JSON.stringify({ targets }, null, 2));
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
739
|
+
console.log(formatBrowserUseTargets(targets));
|
|
740
|
+
if (targets.length === 0)
|
|
741
|
+
console.log('\nNext: eval "$(pibo tools env agent-browser)"');
|
|
742
|
+
}
|
|
743
|
+
finally {
|
|
744
|
+
if (previousHome === undefined)
|
|
745
|
+
delete process.env.BROWSER_USE_HOME;
|
|
746
|
+
else
|
|
747
|
+
process.env.BROWSER_USE_HOME = previousHome;
|
|
748
|
+
}
|
|
749
|
+
});
|
|
750
|
+
agentBrowser
|
|
751
|
+
.command('attach-chat')
|
|
752
|
+
.description('Export the best existing authenticated Chat target')
|
|
753
|
+
.option('--cdp-url <url>', 'Chrome DevTools HTTP URL')
|
|
754
|
+
.option('--json', 'Print machine-readable target data')
|
|
755
|
+
.action(async (options) => {
|
|
756
|
+
const status = getCliToolStatus(requireEntry('agent-browser'));
|
|
757
|
+
const previousHome = process.env.BROWSER_USE_HOME;
|
|
758
|
+
process.env.BROWSER_USE_HOME = status.homeDir;
|
|
759
|
+
try {
|
|
760
|
+
const targets = await listBrowserUseCdpTargets({ cdpUrl: options.cdpUrl });
|
|
761
|
+
const target = selectBestChatTarget(targets);
|
|
762
|
+
if (!target) {
|
|
763
|
+
throw new Error(formatCliError({
|
|
764
|
+
code: ErrorCode.CLIENT_ERROR,
|
|
765
|
+
type: 'AGENT_BROWSER_CHAT_TARGET_NOT_FOUND',
|
|
766
|
+
message: 'No authenticated Chat Web target with a composer textarea was found',
|
|
767
|
+
suggestion: 'Run `pibo tools agent-browser targets`, reuse an authenticated tab, or acquire a slot with `pibo tools agent-browser lease acquire`.',
|
|
768
|
+
}));
|
|
769
|
+
}
|
|
770
|
+
if (options.json) {
|
|
771
|
+
console.log(JSON.stringify({ target }, null, 2));
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
774
|
+
const cdpUrl = options.cdpUrl ? normalizeCdpUrlSync(options.cdpUrl) : 'http://127.0.0.1:56663';
|
|
775
|
+
console.log(`export PIBO_AGENT_BROWSER_CDP_URL='${cdpUrl.replaceAll("'", "'\\''")}'`);
|
|
776
|
+
printAttachChatExports(target, cdpUrl);
|
|
777
|
+
}
|
|
778
|
+
finally {
|
|
779
|
+
if (previousHome === undefined)
|
|
780
|
+
delete process.env.BROWSER_USE_HOME;
|
|
781
|
+
else
|
|
782
|
+
process.env.BROWSER_USE_HOME = previousHome;
|
|
783
|
+
}
|
|
784
|
+
});
|
|
785
|
+
const agentAuthTemplate = agentBrowser
|
|
786
|
+
.command('auth-template')
|
|
787
|
+
.description('Manage the Agent Browser authenticated template profile')
|
|
788
|
+
.action(() => {
|
|
789
|
+
console.log(`pibo tools agent-browser auth-template
|
|
790
|
+
|
|
791
|
+
Commands:
|
|
792
|
+
path Print the default authenticated template profile path
|
|
793
|
+
env Print shell exports for preparing the auth template profile`);
|
|
794
|
+
});
|
|
795
|
+
agentAuthTemplate
|
|
796
|
+
.command('path')
|
|
797
|
+
.option('--app <name>', 'Auth pool app name', 'pibo-chat')
|
|
798
|
+
.description('Print the default authenticated template profile path')
|
|
799
|
+
.action((options) => {
|
|
800
|
+
printAgentBrowserAuthTemplatePath(getCliToolStatus(requireEntry('agent-browser')), options.app);
|
|
801
|
+
});
|
|
802
|
+
agentAuthTemplate
|
|
803
|
+
.command('env')
|
|
804
|
+
.option('--app <name>', 'Auth pool app name', 'pibo-chat')
|
|
805
|
+
.description('Print shell exports for preparing the auth template profile')
|
|
806
|
+
.action(async (options) => {
|
|
807
|
+
await printAgentBrowserAuthTemplateEnv(getCliToolStatus(requireEntry('agent-browser')), options.app);
|
|
808
|
+
});
|
|
809
|
+
const agentLease = agentBrowser
|
|
810
|
+
.command('lease')
|
|
811
|
+
.description('Acquire and manage isolated Agent Browser slots')
|
|
812
|
+
.action(() => {
|
|
813
|
+
console.log(`pibo tools agent-browser lease
|
|
814
|
+
|
|
815
|
+
Commands:
|
|
816
|
+
acquire Acquire an isolated authenticated browser slot
|
|
817
|
+
list List authenticated browser slots
|
|
818
|
+
release <id> Release one browser slot
|
|
819
|
+
reap-stale Release expired browser slots`);
|
|
820
|
+
});
|
|
821
|
+
agentLease
|
|
822
|
+
.command('acquire')
|
|
823
|
+
.description('Acquire an isolated authenticated browser slot')
|
|
824
|
+
.option('--app <name>', 'Auth pool app name', 'pibo-chat')
|
|
825
|
+
.option('--holder <holder>', 'Lease holder label')
|
|
826
|
+
.option('--ttl-ms <ms>', 'Lease time-to-live in milliseconds', parsePositiveInteger)
|
|
827
|
+
.option('--max-slots <count>', 'Maximum active slots for the app', parsePositiveInteger)
|
|
828
|
+
.option('--json', 'Print machine-readable lease data')
|
|
829
|
+
.action(async (options) => {
|
|
830
|
+
await acquireAgentBrowserLease(getCliToolStatus(requireEntry('agent-browser')), options);
|
|
831
|
+
});
|
|
832
|
+
agentLease
|
|
833
|
+
.command('list')
|
|
834
|
+
.description('List authenticated browser slots')
|
|
835
|
+
.option('--json', 'Print machine-readable lease data')
|
|
836
|
+
.action(async (options) => {
|
|
837
|
+
await listAgentBrowserLeases(getCliToolStatus(requireEntry('agent-browser')), Boolean(options.json));
|
|
838
|
+
});
|
|
839
|
+
agentLease
|
|
840
|
+
.command('release')
|
|
841
|
+
.argument('<id>')
|
|
842
|
+
.option('--delete-profile', 'Delete the slot browser profile')
|
|
843
|
+
.description('Release one browser slot')
|
|
844
|
+
.action(async (id, options) => {
|
|
845
|
+
await releaseAgentBrowserLease(getCliToolStatus(requireEntry('agent-browser')), id, options);
|
|
846
|
+
});
|
|
847
|
+
agentLease
|
|
848
|
+
.command('reap-stale')
|
|
849
|
+
.description('Release expired browser slots')
|
|
850
|
+
.option('--json', 'Print machine-readable reap result')
|
|
851
|
+
.action(async (options) => {
|
|
852
|
+
await reapStaleAgentBrowserLeases(getCliToolStatus(requireEntry('agent-browser')), Boolean(options.json));
|
|
853
|
+
});
|
|
243
854
|
const browserUse = program
|
|
244
855
|
.command('browser-use')
|
|
245
856
|
.description('Browser-use auth slots and helper commands')
|
|
@@ -247,7 +858,7 @@ export async function runToolsCli(argv = process.argv) {
|
|
|
247
858
|
browserUse
|
|
248
859
|
.command('targets')
|
|
249
860
|
.description('List Chrome CDP targets with Chat auth hints')
|
|
250
|
-
.option('--cdp-url <url>', 'Chrome DevTools HTTP URL'
|
|
861
|
+
.option('--cdp-url <url>', 'Chrome DevTools HTTP URL')
|
|
251
862
|
.option('--no-probe', 'Only read /json/list without page DOM probes')
|
|
252
863
|
.option('--json', 'Print machine-readable target data')
|
|
253
864
|
.action(async (options) => {
|
|
@@ -265,7 +876,7 @@ export async function runToolsCli(argv = process.argv) {
|
|
|
265
876
|
browserUse
|
|
266
877
|
.command('attach-chat')
|
|
267
878
|
.description('Export the best existing authenticated Chat target')
|
|
268
|
-
.option('--cdp-url <url>', 'Chrome DevTools HTTP URL'
|
|
879
|
+
.option('--cdp-url <url>', 'Chrome DevTools HTTP URL')
|
|
269
880
|
.option('--json', 'Print machine-readable target data')
|
|
270
881
|
.action(async (options) => {
|
|
271
882
|
const targets = await listBrowserUseCdpTargets({ cdpUrl: options.cdpUrl });
|
|
@@ -282,7 +893,46 @@ export async function runToolsCli(argv = process.argv) {
|
|
|
282
893
|
console.log(JSON.stringify({ target }, null, 2));
|
|
283
894
|
return;
|
|
284
895
|
}
|
|
285
|
-
|
|
896
|
+
const cdpUrl = options.cdpUrl ? normalizeCdpUrlSync(options.cdpUrl) : undefined;
|
|
897
|
+
printAttachChatExports(target, cdpUrl);
|
|
898
|
+
});
|
|
899
|
+
browserUse
|
|
900
|
+
.command('health')
|
|
901
|
+
.description('Check browser-use health and report issues')
|
|
902
|
+
.option('--json', 'Print machine-readable health data')
|
|
903
|
+
.action(async (options) => {
|
|
904
|
+
await printBrowserUseHealth(getCliToolStatus(requireEntry('browser-use')), Boolean(options.json));
|
|
905
|
+
});
|
|
906
|
+
const pool = browserUse
|
|
907
|
+
.command('pool')
|
|
908
|
+
.description('Inspect and reap the managed browser pool')
|
|
909
|
+
.action(() => {
|
|
910
|
+
console.log(`pibo tools browser-use pool
|
|
911
|
+
|
|
912
|
+
Commands:
|
|
913
|
+
status Show read-only managed browser-pool status
|
|
914
|
+
reap Reap an idle managed browser pool`);
|
|
915
|
+
});
|
|
916
|
+
pool
|
|
917
|
+
.command('status')
|
|
918
|
+
.description('Show read-only managed browser-pool status')
|
|
919
|
+
.option('--worker-id <id>', 'Worker id to inspect')
|
|
920
|
+
.option('--pool-id <id>', 'Browser pool id to inspect')
|
|
921
|
+
.option('--root <path>', 'Browser pool root directory')
|
|
922
|
+
.option('--json', 'Print machine-readable pool status')
|
|
923
|
+
.action(async (options) => {
|
|
924
|
+
await printBrowserPoolStatus(getCliToolStatus(requireEntry('browser-use')), options);
|
|
925
|
+
});
|
|
926
|
+
pool
|
|
927
|
+
.command('reap')
|
|
928
|
+
.description('Reap an idle managed browser pool')
|
|
929
|
+
.option('--worker-id <id>', 'Worker id to inspect')
|
|
930
|
+
.option('--pool-id <id>', 'Browser pool id to inspect')
|
|
931
|
+
.option('--root <path>', 'Browser pool root directory')
|
|
932
|
+
.option('--idle-timeout-ms <ms>', 'Idle timeout in milliseconds (0 means immediately eligible)', parseNonNegativeInteger)
|
|
933
|
+
.option('--json', 'Print machine-readable reap result')
|
|
934
|
+
.action(async (options) => {
|
|
935
|
+
await printBrowserPoolReap(getCliToolStatus(requireEntry('browser-use')), options);
|
|
286
936
|
});
|
|
287
937
|
const authTemplate = browserUse
|
|
288
938
|
.command('auth-template')
|
|
@@ -322,7 +972,7 @@ Commands:
|
|
|
322
972
|
.command('acquire')
|
|
323
973
|
.description('Acquire an isolated authenticated browser slot')
|
|
324
974
|
.option('--app <name>', 'Auth pool app name', 'pibo-chat')
|
|
325
|
-
.option('--
|
|
975
|
+
.option('--holder <holder>', 'Lease holder label')
|
|
326
976
|
.option('--ttl-minutes <minutes>', 'Lease time-to-live in minutes', parsePositiveInteger)
|
|
327
977
|
.option('--max-slots <count>', 'Maximum active slots for the app', parsePositiveInteger)
|
|
328
978
|
.option('--template-dir <path>', 'Authenticated Chrome user-data-dir template to clone')
|