@namzu/cli 29.0.1 → 30.0.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/CHANGELOG.md +194 -0
- package/README.md +20 -0
- package/dist/browser/commands.d.ts +29 -0
- package/dist/browser/commands.d.ts.map +1 -0
- package/dist/browser/commands.js +361 -0
- package/dist/browser/commands.js.map +1 -0
- package/dist/browser/control.d.ts +79 -0
- package/dist/browser/control.d.ts.map +1 -0
- package/dist/browser/control.js +140 -0
- package/dist/browser/control.js.map +1 -0
- package/dist/browser/describe.d.ts +12 -0
- package/dist/browser/describe.d.ts.map +1 -0
- package/dist/browser/describe.js +27 -0
- package/dist/browser/describe.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/acp.d.ts.map +1 -1
- package/dist/commands/acp.js +1 -0
- package/dist/commands/acp.js.map +1 -1
- package/dist/commands/browser.d.ts +7 -0
- package/dist/commands/browser.d.ts.map +1 -0
- package/dist/commands/browser.js +16 -0
- package/dist/commands/browser.js.map +1 -0
- package/dist/commands/drain.d.ts +2 -1
- package/dist/commands/drain.d.ts.map +1 -1
- package/dist/commands/drain.js +6 -3
- package/dist/commands/drain.js.map +1 -1
- package/dist/commands/exec-flags.d.ts +2 -1
- package/dist/commands/exec-flags.d.ts.map +1 -1
- package/dist/commands/exec-flags.js +6 -3
- package/dist/commands/exec-flags.js.map +1 -1
- package/dist/commands/exec-json.d.ts.map +1 -1
- package/dist/commands/exec-json.js +2 -1
- package/dist/commands/exec-json.js.map +1 -1
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +5 -1
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/host-queries.d.ts.map +1 -1
- package/dist/commands/host-queries.js +10 -3
- package/dist/commands/host-queries.js.map +1 -1
- package/dist/commands/schedule.d.ts +9 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +126 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/serve.d.ts +3 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +5 -3
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/skills.d.ts +10 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +23 -7
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/upgrade.d.ts +5 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +11 -0
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/config/load.d.ts +39 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +232 -1
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +78 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/config/user-config.d.ts +23 -0
- package/dist/config/user-config.d.ts.map +1 -0
- package/dist/config/user-config.js +48 -0
- package/dist/config/user-config.js.map +1 -0
- package/dist/context/capabilities.d.ts +1 -1
- package/dist/context/capabilities.d.ts.map +1 -1
- package/dist/context/capabilities.js +1 -0
- package/dist/context/capabilities.js.map +1 -1
- package/dist/context/environment.d.ts +26 -3
- package/dist/context/environment.d.ts.map +1 -1
- package/dist/context/environment.js +68 -9
- package/dist/context/environment.js.map +1 -1
- package/dist/doctor/checks/browser.d.ts +15 -0
- package/dist/doctor/checks/browser.d.ts.map +1 -0
- package/dist/doctor/checks/browser.js +63 -0
- package/dist/doctor/checks/browser.js.map +1 -0
- package/dist/doctor/checks/index.d.ts +4 -1
- package/dist/doctor/checks/index.d.ts.map +1 -1
- package/dist/doctor/checks/index.js +8 -1
- package/dist/doctor/checks/index.js.map +1 -1
- package/dist/doctor/checks/scheduler.d.ts +10 -0
- package/dist/doctor/checks/scheduler.d.ts.map +1 -0
- package/dist/doctor/checks/scheduler.js +74 -0
- package/dist/doctor/checks/scheduler.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/notifications/desktop/freedesktop.d.ts +10 -0
- package/dist/integrations/notifications/desktop/freedesktop.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/freedesktop.js +33 -0
- package/dist/integrations/notifications/desktop/freedesktop.js.map +1 -0
- package/dist/integrations/notifications/desktop/macos.d.ts +6 -0
- package/dist/integrations/notifications/desktop/macos.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/macos.js +17 -0
- package/dist/integrations/notifications/desktop/macos.js.map +1 -0
- package/dist/integrations/notifications/desktop/sanitize.d.ts +16 -0
- package/dist/integrations/notifications/desktop/sanitize.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/sanitize.js +49 -0
- package/dist/integrations/notifications/desktop/sanitize.js.map +1 -0
- package/dist/integrations/notifications/desktop/throttle.d.ts +10 -0
- package/dist/integrations/notifications/desktop/throttle.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/throttle.js +39 -0
- package/dist/integrations/notifications/desktop/throttle.js.map +1 -0
- package/dist/integrations/notifications/desktop/windows-toast.d.ts +23 -0
- package/dist/integrations/notifications/desktop/windows-toast.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop/windows-toast.js +56 -0
- package/dist/integrations/notifications/desktop/windows-toast.js.map +1 -0
- package/dist/integrations/notifications/desktop.d.ts +84 -0
- package/dist/integrations/notifications/desktop.d.ts.map +1 -0
- package/dist/integrations/notifications/desktop.js +199 -0
- package/dist/integrations/notifications/desktop.js.map +1 -0
- package/dist/integrations/plugins/runtime.d.ts +8 -2
- package/dist/integrations/plugins/runtime.d.ts.map +1 -1
- package/dist/integrations/plugins/runtime.js +14 -8
- package/dist/integrations/plugins/runtime.js.map +1 -1
- package/dist/integrations/providers/harness-credentials.d.ts +9 -4
- package/dist/integrations/providers/harness-credentials.d.ts.map +1 -1
- package/dist/integrations/providers/harness-credentials.js +16 -8
- package/dist/integrations/providers/harness-credentials.js.map +1 -1
- package/dist/integrations/resident/session-step.d.ts.map +1 -1
- package/dist/integrations/resident/session-step.js +1 -0
- package/dist/integrations/resident/session-step.js.map +1 -1
- package/dist/integrations/subagents/runtime.d.ts +6 -0
- package/dist/integrations/subagents/runtime.d.ts.map +1 -1
- package/dist/integrations/subagents/runtime.js +14 -5
- package/dist/integrations/subagents/runtime.js.map +1 -1
- package/dist/integrations/web/open-url.d.ts +24 -0
- package/dist/integrations/web/open-url.d.ts.map +1 -0
- package/dist/integrations/web/open-url.js +73 -0
- package/dist/integrations/web/open-url.js.map +1 -0
- package/dist/permissions/browser-sites.d.ts +95 -0
- package/dist/permissions/browser-sites.d.ts.map +1 -0
- package/dist/permissions/browser-sites.js +270 -0
- package/dist/permissions/browser-sites.js.map +1 -0
- package/dist/schedule/build.d.ts +86 -0
- package/dist/schedule/build.d.ts.map +1 -0
- package/dist/schedule/build.js +267 -0
- package/dist/schedule/build.js.map +1 -0
- package/dist/schedule/changes.d.ts +28 -0
- package/dist/schedule/changes.d.ts.map +1 -0
- package/dist/schedule/changes.js +65 -0
- package/dist/schedule/changes.js.map +1 -0
- package/dist/schedule/commands/add.d.ts +24 -0
- package/dist/schedule/commands/add.d.ts.map +1 -0
- package/dist/schedule/commands/add.js +447 -0
- package/dist/schedule/commands/add.js.map +1 -0
- package/dist/schedule/commands/args.d.ts +22 -0
- package/dist/schedule/commands/args.d.ts.map +1 -0
- package/dist/schedule/commands/args.js +80 -0
- package/dist/schedule/commands/args.js.map +1 -0
- package/dist/schedule/commands/confirm-prompt.d.ts +6 -0
- package/dist/schedule/commands/confirm-prompt.d.ts.map +1 -0
- package/dist/schedule/commands/confirm-prompt.js +21 -0
- package/dist/schedule/commands/confirm-prompt.js.map +1 -0
- package/dist/schedule/commands/lifecycle.d.ts +39 -0
- package/dist/schedule/commands/lifecycle.d.ts.map +1 -0
- package/dist/schedule/commands/lifecycle.js +586 -0
- package/dist/schedule/commands/lifecycle.js.map +1 -0
- package/dist/schedule/commands/list.d.ts +33 -0
- package/dist/schedule/commands/list.d.ts.map +1 -0
- package/dist/schedule/commands/list.js +206 -0
- package/dist/schedule/commands/list.js.map +1 -0
- package/dist/schedule/commands/logs.d.ts +7 -0
- package/dist/schedule/commands/logs.d.ts.map +1 -0
- package/dist/schedule/commands/logs.js +106 -0
- package/dist/schedule/commands/logs.js.map +1 -0
- package/dist/schedule/commands/service.d.ts +16 -0
- package/dist/schedule/commands/service.d.ts.map +1 -0
- package/dist/schedule/commands/service.js +458 -0
- package/dist/schedule/commands/service.js.map +1 -0
- package/dist/schedule/daemon/daemon.d.ts +156 -0
- package/dist/schedule/daemon/daemon.d.ts.map +1 -0
- package/dist/schedule/daemon/daemon.js +1253 -0
- package/dist/schedule/daemon/daemon.js.map +1 -0
- package/dist/schedule/daemon/endpoint.d.ts +38 -0
- package/dist/schedule/daemon/endpoint.d.ts.map +1 -0
- package/dist/schedule/daemon/endpoint.js +158 -0
- package/dist/schedule/daemon/endpoint.js.map +1 -0
- package/dist/schedule/daemon/exit.d.ts +8 -0
- package/dist/schedule/daemon/exit.d.ts.map +1 -0
- package/dist/schedule/daemon/exit.js +8 -0
- package/dist/schedule/daemon/exit.js.map +1 -0
- package/dist/schedule/daemon/log.d.ts +12 -0
- package/dist/schedule/daemon/log.d.ts.map +1 -0
- package/dist/schedule/daemon/log.js +53 -0
- package/dist/schedule/daemon/log.js.map +1 -0
- package/dist/schedule/daemon/notify.d.ts +38 -0
- package/dist/schedule/daemon/notify.d.ts.map +1 -0
- package/dist/schedule/daemon/notify.js +115 -0
- package/dist/schedule/daemon/notify.js.map +1 -0
- package/dist/schedule/daemon/retention.d.ts +16 -0
- package/dist/schedule/daemon/retention.d.ts.map +1 -0
- package/dist/schedule/daemon/retention.js +46 -0
- package/dist/schedule/daemon/retention.js.map +1 -0
- package/dist/schedule/daemon/sessions.d.ts +23 -0
- package/dist/schedule/daemon/sessions.d.ts.map +1 -0
- package/dist/schedule/daemon/sessions.js +52 -0
- package/dist/schedule/daemon/sessions.js.map +1 -0
- package/dist/schedule/env.d.ts +32 -0
- package/dist/schedule/env.d.ts.map +1 -0
- package/dist/schedule/env.js +106 -0
- package/dist/schedule/env.js.map +1 -0
- package/dist/schedule/fire/browser-preflight.d.ts +41 -0
- package/dist/schedule/fire/browser-preflight.d.ts.map +1 -0
- package/dist/schedule/fire/browser-preflight.js +73 -0
- package/dist/schedule/fire/browser-preflight.js.map +1 -0
- package/dist/schedule/fire/calls.d.ts +49 -0
- package/dist/schedule/fire/calls.d.ts.map +1 -0
- package/dist/schedule/fire/calls.js +114 -0
- package/dist/schedule/fire/calls.js.map +1 -0
- package/dist/schedule/fire/fire.d.ts +78 -0
- package/dist/schedule/fire/fire.d.ts.map +1 -0
- package/dist/schedule/fire/fire.js +490 -0
- package/dist/schedule/fire/fire.js.map +1 -0
- package/dist/schedule/fire/result.d.ts +13 -0
- package/dist/schedule/fire/result.d.ts.map +1 -0
- package/dist/schedule/fire/result.js +18 -0
- package/dist/schedule/fire/result.js.map +1 -0
- package/dist/schedule/fire/unattended-note.d.ts +22 -0
- package/dist/schedule/fire/unattended-note.d.ts.map +1 -0
- package/dist/schedule/fire/unattended-note.js +46 -0
- package/dist/schedule/fire/unattended-note.js.map +1 -0
- package/dist/schedule/floor.d.ts +136 -0
- package/dist/schedule/floor.d.ts.map +1 -0
- package/dist/schedule/floor.js +1289 -0
- package/dist/schedule/floor.js.map +1 -0
- package/dist/schedule/folder.d.ts +34 -0
- package/dist/schedule/folder.d.ts.map +1 -0
- package/dist/schedule/folder.js +84 -0
- package/dist/schedule/folder.js.map +1 -0
- package/dist/schedule/paths.d.ts +49 -0
- package/dist/schedule/paths.d.ts.map +1 -0
- package/dist/schedule/paths.js +53 -0
- package/dist/schedule/paths.js.map +1 -0
- package/dist/schedule/policy.d.ts +141 -0
- package/dist/schedule/policy.d.ts.map +1 -0
- package/dist/schedule/policy.js +378 -0
- package/dist/schedule/policy.js.map +1 -0
- package/dist/schedule/resume-command.d.ts +36 -0
- package/dist/schedule/resume-command.d.ts.map +1 -0
- package/dist/schedule/resume-command.js +72 -0
- package/dist/schedule/resume-command.js.map +1 -0
- package/dist/schedule/service/detect.d.ts +22 -0
- package/dist/schedule/service/detect.d.ts.map +1 -0
- package/dist/schedule/service/detect.js +29 -0
- package/dist/schedule/service/detect.js.map +1 -0
- package/dist/schedule/service/index.d.ts +48 -0
- package/dist/schedule/service/index.d.ts.map +1 -0
- package/dist/schedule/service/index.js +361 -0
- package/dist/schedule/service/index.js.map +1 -0
- package/dist/schedule/service/launchd.d.ts +24 -0
- package/dist/schedule/service/launchd.d.ts.map +1 -0
- package/dist/schedule/service/launchd.js +84 -0
- package/dist/schedule/service/launchd.js.map +1 -0
- package/dist/schedule/service/manifest.d.ts +44 -0
- package/dist/schedule/service/manifest.d.ts.map +1 -0
- package/dist/schedule/service/manifest.js +16 -0
- package/dist/schedule/service/manifest.js.map +1 -0
- package/dist/schedule/service/names.d.ts +9 -0
- package/dist/schedule/service/names.d.ts.map +1 -0
- package/dist/schedule/service/names.js +22 -0
- package/dist/schedule/service/names.js.map +1 -0
- package/dist/schedule/service/quote.d.ts +24 -0
- package/dist/schedule/service/quote.d.ts.map +1 -0
- package/dist/schedule/service/quote.js +64 -0
- package/dist/schedule/service/quote.js.map +1 -0
- package/dist/schedule/service/runner.d.ts +17 -0
- package/dist/schedule/service/runner.d.ts.map +1 -0
- package/dist/schedule/service/runner.js +31 -0
- package/dist/schedule/service/runner.js.map +1 -0
- package/dist/schedule/service/systemd.d.ts +37 -0
- package/dist/schedule/service/systemd.d.ts.map +1 -0
- package/dist/schedule/service/systemd.js +96 -0
- package/dist/schedule/service/systemd.js.map +1 -0
- package/dist/schedule/service/windows-task.d.ts +58 -0
- package/dist/schedule/service/windows-task.d.ts.map +1 -0
- package/dist/schedule/service/windows-task.js +199 -0
- package/dist/schedule/service/windows-task.js.map +1 -0
- package/dist/schedule/service/wsl.d.ts +69 -0
- package/dist/schedule/service/wsl.d.ts.map +1 -0
- package/dist/schedule/service/wsl.js +121 -0
- package/dist/schedule/service/wsl.js.map +1 -0
- package/dist/schedule/store/atomic.d.ts +43 -0
- package/dist/schedule/store/atomic.d.ts.map +1 -0
- package/dist/schedule/store/atomic.js +135 -0
- package/dist/schedule/store/atomic.js.map +1 -0
- package/dist/schedule/store/claims.d.ts +26 -0
- package/dist/schedule/store/claims.d.ts.map +1 -0
- package/dist/schedule/store/claims.js +57 -0
- package/dist/schedule/store/claims.js.map +1 -0
- package/dist/schedule/store/digest.d.ts +18 -0
- package/dist/schedule/store/digest.d.ts.map +1 -0
- package/dist/schedule/store/digest.js +139 -0
- package/dist/schedule/store/digest.js.map +1 -0
- package/dist/schedule/store/history.d.ts +21 -0
- package/dist/schedule/store/history.d.ts.map +1 -0
- package/dist/schedule/store/history.js +114 -0
- package/dist/schedule/store/history.js.map +1 -0
- package/dist/schedule/store/jobs.d.ts +61 -0
- package/dist/schedule/store/jobs.d.ts.map +1 -0
- package/dist/schedule/store/jobs.js +210 -0
- package/dist/schedule/store/jobs.js.map +1 -0
- package/dist/schedule/store/state.d.ts +19 -0
- package/dist/schedule/store/state.d.ts.map +1 -0
- package/dist/schedule/store/state.js +38 -0
- package/dist/schedule/store/state.js.map +1 -0
- package/dist/schedule/types.d.ts +283 -0
- package/dist/schedule/types.d.ts.map +1 -0
- package/dist/schedule/types.js +9 -0
- package/dist/schedule/types.js.map +1 -0
- package/dist/skills/catalog.d.ts +96 -0
- package/dist/skills/catalog.d.ts.map +1 -0
- package/dist/skills/catalog.js +226 -0
- package/dist/skills/catalog.js.map +1 -0
- package/dist/skills/directory.d.ts +38 -0
- package/dist/skills/directory.d.ts.map +1 -0
- package/dist/skills/directory.js +51 -0
- package/dist/skills/directory.js.map +1 -0
- package/dist/skills/save.d.ts +148 -0
- package/dist/skills/save.d.ts.map +1 -0
- package/dist/skills/save.js +344 -0
- package/dist/skills/save.js.map +1 -0
- package/dist/skills/store.d.ts +103 -16
- package/dist/skills/store.d.ts.map +1 -1
- package/dist/skills/store.js +227 -30
- package/dist/skills/store.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +609 -74
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/LiveActivity.d.ts +8 -1
- package/dist/tui/LiveActivity.d.ts.map +1 -1
- package/dist/tui/LiveActivity.js +20 -4
- package/dist/tui/LiveActivity.js.map +1 -1
- package/dist/tui/PermissionOverlay.d.ts +36 -4
- package/dist/tui/PermissionOverlay.d.ts.map +1 -1
- package/dist/tui/PermissionOverlay.js +135 -15
- package/dist/tui/PermissionOverlay.js.map +1 -1
- package/dist/tui/SaveSkillOverlay.d.ts +33 -0
- package/dist/tui/SaveSkillOverlay.d.ts.map +1 -0
- package/dist/tui/SaveSkillOverlay.js +118 -0
- package/dist/tui/SaveSkillOverlay.js.map +1 -0
- package/dist/tui/agent.d.ts +208 -6
- package/dist/tui/agent.d.ts.map +1 -1
- package/dist/tui/agent.js +371 -58
- package/dist/tui/agent.js.map +1 -1
- package/dist/tui/browser-notices.d.ts +33 -0
- package/dist/tui/browser-notices.d.ts.map +1 -0
- package/dist/tui/browser-notices.js +102 -0
- package/dist/tui/browser-notices.js.map +1 -0
- package/dist/tui/open-browser.d.ts +29 -1
- package/dist/tui/open-browser.d.ts.map +1 -1
- package/dist/tui/open-browser.js +83 -11
- package/dist/tui/open-browser.js.map +1 -1
- package/dist/tui/permission-review.d.ts +10 -1
- package/dist/tui/permission-review.d.ts.map +1 -1
- package/dist/tui/permission-review.js +228 -22
- package/dist/tui/permission-review.js.map +1 -1
- package/dist/tui/schedule/host-commands.d.ts +34 -0
- package/dist/tui/schedule/host-commands.d.ts.map +1 -0
- package/dist/tui/schedule/host-commands.js +310 -0
- package/dist/tui/schedule/host-commands.js.map +1 -0
- package/dist/tui/schedule/integration.d.ts +62 -0
- package/dist/tui/schedule/integration.d.ts.map +1 -0
- package/dist/tui/schedule/integration.js +145 -0
- package/dist/tui/schedule/integration.js.map +1 -0
- package/dist/tui/schedule/loop-host.d.ts +42 -0
- package/dist/tui/schedule/loop-host.d.ts.map +1 -0
- package/dist/tui/schedule/loop-host.js +153 -0
- package/dist/tui/schedule/loop-host.js.map +1 -0
- package/dist/tui/schedule/resume.d.ts +122 -0
- package/dist/tui/schedule/resume.d.ts.map +1 -0
- package/dist/tui/schedule/resume.js +324 -0
- package/dist/tui/schedule/resume.js.map +1 -0
- package/dist/tui/schedule/startup.d.ts +11 -0
- package/dist/tui/schedule/startup.d.ts.map +1 -0
- package/dist/tui/schedule/startup.js +121 -0
- package/dist/tui/schedule/startup.js.map +1 -0
- package/dist/tui/schedule/tool-host.d.ts +58 -0
- package/dist/tui/schedule/tool-host.d.ts.map +1 -0
- package/dist/tui/schedule/tool-host.js +479 -0
- package/dist/tui/schedule/tool-host.js.map +1 -0
- package/dist/tui/skills/learning.d.ts +74 -0
- package/dist/tui/skills/learning.d.ts.map +1 -0
- package/dist/tui/skills/learning.js +131 -0
- package/dist/tui/skills/learning.js.map +1 -0
- package/dist/tui/skills/suggest-setting.d.ts +22 -0
- package/dist/tui/skills/suggest-setting.d.ts.map +1 -0
- package/dist/tui/skills/suggest-setting.js +55 -0
- package/dist/tui/skills/suggest-setting.js.map +1 -0
- package/dist/tui/skills/suggestion-ledger.d.ts +35 -0
- package/dist/tui/skills/suggestion-ledger.d.ts.map +1 -0
- package/dist/tui/skills/suggestion-ledger.js +52 -0
- package/dist/tui/skills/suggestion-ledger.js.map +1 -0
- package/dist/tui/slashCommands.d.ts +20 -0
- package/dist/tui/slashCommands.d.ts.map +1 -1
- package/dist/tui/slashCommands.js +76 -2
- package/dist/tui/slashCommands.js.map +1 -1
- package/dist/tui/turn-interruption.d.ts +20 -1
- package/dist/tui/turn-interruption.d.ts.map +1 -1
- package/dist/tui/turn-interruption.js +43 -0
- package/dist/tui/turn-interruption.js.map +1 -1
- package/dist/tui/types.d.ts +9 -1
- package/dist/tui/types.d.ts.map +1 -1
- package/package.json +7 -5
- package/skills/README.md +20 -0
- package/skills/browser-automation/SKILL.md +84 -0
- package/skills/schedule-task/SKILL.md +146 -0
- package/skills/skill-creator/SKILL.md +101 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `namzu browser <verb>`: the operator's side of the browser. Profiles are
|
|
3
|
+
* made and signed in to here, in a visible window, never by the model.
|
|
4
|
+
*
|
|
5
|
+
* - `login <profile> [url]` open a visible window on the profile; return when
|
|
6
|
+
* the person presses Enter or closes the window
|
|
7
|
+
* - `list [--json]` the profiles and when each was last signed in to
|
|
8
|
+
* - `status [profile] [--json]` which browser the tools would drive here
|
|
9
|
+
* - `install [--dry-run]` Playwright's Chromium, for a machine with no Chrome
|
|
10
|
+
* - `remove <profile> [--yes]` delete a profile and its cookies
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from 'node:child_process';
|
|
13
|
+
import { createRequire } from 'node:module';
|
|
14
|
+
import { dirname, join, resolve as resolvePath } from 'node:path';
|
|
15
|
+
import { createInterface } from 'node:readline';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
import { canonicalizeBrowserUrl } from '@namzu/sdk';
|
|
18
|
+
import { EXIT_FAIL, EXIT_OK, EXIT_UNAVAILABLE, EXIT_USAGE } from '../exit-codes.js';
|
|
19
|
+
import { resolveNamzuHome } from '../integrations/state/home.js';
|
|
20
|
+
import { flag, has, interactive, parseArgs } from '../schedule/commands/args.js';
|
|
21
|
+
import { isBrowserProfileName } from './control.js';
|
|
22
|
+
import { browserName, describeBrowserPlan, engineLabel } from './describe.js';
|
|
23
|
+
export const BROWSER_HELP = [
|
|
24
|
+
'Usage: namzu browser <command> [options]',
|
|
25
|
+
'',
|
|
26
|
+
'The browser the interactive terminal drives (the browser and browser_act',
|
|
27
|
+
'tools). A profile is a browser user-data directory namzu owns: sign in to',
|
|
28
|
+
'a site once here, in a visible window, and the agent reuses the sign-in.',
|
|
29
|
+
'The model never signs in, and never chooses the profile.',
|
|
30
|
+
'',
|
|
31
|
+
'Commands',
|
|
32
|
+
' login <profile> [url] Open a visible window on the profile at url.',
|
|
33
|
+
' Sign in, then press Enter or close the window.',
|
|
34
|
+
' list [--json] Profiles, their browser, last sign-in',
|
|
35
|
+
' status [profile] [--json] Which browser runs here, and a profile in detail',
|
|
36
|
+
' install [--dry-run] Download Playwright’s Chromium (not needed when',
|
|
37
|
+
' Chrome is installed, or in WSL with Windows Chrome)',
|
|
38
|
+
' remove <profile> [--yes] Delete a profile and everything signed in to it',
|
|
39
|
+
'',
|
|
40
|
+
'Options: --home <dir> (default NAMZU_HOME).',
|
|
41
|
+
'Config: browser.defaultProfile, browser.engine (auto|windows|local),',
|
|
42
|
+
'browser.headless (auto|always|never), browser.sites, browser.keepOpen.',
|
|
43
|
+
'',
|
|
44
|
+
'Exit codes: 0 done, 1 failed, 64 wrong arguments, 69 no browser can run here.',
|
|
45
|
+
].join('\n');
|
|
46
|
+
function waitForEnterOnStdin(signal) {
|
|
47
|
+
if (!process.stdin.isTTY)
|
|
48
|
+
return new Promise(() => { });
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
const rl = createInterface({ input: process.stdin });
|
|
51
|
+
const done = () => {
|
|
52
|
+
rl.close();
|
|
53
|
+
resolve();
|
|
54
|
+
};
|
|
55
|
+
rl.once('line', done);
|
|
56
|
+
signal.addEventListener('abort', () => rl.close(), { once: true });
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/** `node playwright-core/cli.js install chromium`, the version `@namzu/browser` pins. */
|
|
60
|
+
async function spawnPlaywrightInstall(args) {
|
|
61
|
+
const browserEntry = fileURLToPath(import.meta.resolve('@namzu/browser'));
|
|
62
|
+
// `cli.js` is not in playwright-core's export map; its manifest is.
|
|
63
|
+
const manifest = createRequire(browserEntry).resolve('playwright-core/package.json');
|
|
64
|
+
const cli = join(dirname(manifest), 'cli.js');
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
const child = spawn(process.execPath, [cli, 'install', ...args, 'chromium'], {
|
|
67
|
+
stdio: 'inherit',
|
|
68
|
+
});
|
|
69
|
+
child.on('exit', (code) => resolve(code ?? 1));
|
|
70
|
+
child.on('error', () => resolve(1));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
export const defaultBrowserCommandDeps = {
|
|
74
|
+
load: () => import('@namzu/browser'),
|
|
75
|
+
env: process.env,
|
|
76
|
+
platform: process.platform,
|
|
77
|
+
waitForEnter: waitForEnterOnStdin,
|
|
78
|
+
pollMs: 500,
|
|
79
|
+
spawnInstall: spawnPlaywrightInstall,
|
|
80
|
+
};
|
|
81
|
+
function homeOf(args, deps) {
|
|
82
|
+
const home = flag(args, 'home');
|
|
83
|
+
return home ? resolvePath(home) : resolveNamzuHome({ env: deps.env });
|
|
84
|
+
}
|
|
85
|
+
function detectPlan(mod, ctx, deps, headed = false) {
|
|
86
|
+
const browser = ctx.config.browser;
|
|
87
|
+
return mod.runnableBrowserPlan(mod.detectBrowserEnvironment(deps.env, deps.platform, undefined, {
|
|
88
|
+
...(browser?.engine ? { engine: browser.engine } : {}),
|
|
89
|
+
headless: headed ? 'never' : (browser?.headless ?? 'auto'),
|
|
90
|
+
mode: 'interactive',
|
|
91
|
+
}));
|
|
92
|
+
}
|
|
93
|
+
function errorText(error) {
|
|
94
|
+
if (error instanceof Error)
|
|
95
|
+
return error.message;
|
|
96
|
+
const message = error?.message;
|
|
97
|
+
return typeof message === 'string' ? message : String(error);
|
|
98
|
+
}
|
|
99
|
+
export async function browserCommand(ctx, argv, deps = defaultBrowserCommandDeps) {
|
|
100
|
+
const [verb, ...rest] = argv;
|
|
101
|
+
switch (verb) {
|
|
102
|
+
case 'login':
|
|
103
|
+
return loginCommand(ctx, rest, deps);
|
|
104
|
+
case 'list':
|
|
105
|
+
case 'ls':
|
|
106
|
+
return listCommand(ctx, rest, deps);
|
|
107
|
+
case 'status':
|
|
108
|
+
return statusCommand(ctx, rest, deps);
|
|
109
|
+
case 'install':
|
|
110
|
+
return installCommand(ctx, rest, deps);
|
|
111
|
+
case 'remove':
|
|
112
|
+
case 'rm':
|
|
113
|
+
return removeCommand(ctx, rest, deps);
|
|
114
|
+
default:
|
|
115
|
+
ctx.formatter.error({
|
|
116
|
+
message: verb ? `unknown browser command: ${verb}` : 'a browser command is required',
|
|
117
|
+
});
|
|
118
|
+
ctx.formatter.print({ text: BROWSER_HELP });
|
|
119
|
+
return EXIT_USAGE;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function loginCommand(ctx, argv, deps) {
|
|
123
|
+
const args = parseArgs(argv, ['home']);
|
|
124
|
+
const [profile, rawUrl, ...extra] = args.positionals;
|
|
125
|
+
if (args.unknown.length > 0 || !profile || extra.length > 0) {
|
|
126
|
+
ctx.formatter.error({ message: 'usage: namzu browser login <profile> [url]' });
|
|
127
|
+
return EXIT_USAGE;
|
|
128
|
+
}
|
|
129
|
+
if (!isBrowserProfileName(profile)) {
|
|
130
|
+
ctx.formatter.error({
|
|
131
|
+
message: `"${profile}" is not a profile name: use lowercase letters, digits and single hyphens, at most 64 characters.`,
|
|
132
|
+
});
|
|
133
|
+
return EXIT_USAGE;
|
|
134
|
+
}
|
|
135
|
+
let url = 'about:blank';
|
|
136
|
+
if (rawUrl !== undefined) {
|
|
137
|
+
// A bare host is what people type; the browser needs a scheme.
|
|
138
|
+
const withScheme = /^[a-z][a-z0-9+.-]*:/i.test(rawUrl) ? rawUrl : `https://${rawUrl}`;
|
|
139
|
+
const verdict = canonicalizeBrowserUrl(withScheme);
|
|
140
|
+
if (!verdict.ok) {
|
|
141
|
+
ctx.formatter.error({ message: `${rawUrl}: ${verdict.reason}` });
|
|
142
|
+
return EXIT_USAGE;
|
|
143
|
+
}
|
|
144
|
+
url = verdict.url;
|
|
145
|
+
}
|
|
146
|
+
const mod = await deps.load();
|
|
147
|
+
const home = homeOf(args, deps);
|
|
148
|
+
const plan = detectPlan(mod, ctx, deps, true);
|
|
149
|
+
if (plan.unavailableReason !== undefined) {
|
|
150
|
+
ctx.formatter.error({
|
|
151
|
+
message: `Cannot open a browser window here: ${plan.unavailableReason}`,
|
|
152
|
+
details: {
|
|
153
|
+
hint: plan.display
|
|
154
|
+
? 'Install Google Chrome, or run `namzu browser install`.'
|
|
155
|
+
: 'Signing in needs a display: run this where you have a desktop (or `ssh -X`, or `xvfb-run` with a VNC viewer), then reuse the profile here.',
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
return EXIT_UNAVAILABLE;
|
|
159
|
+
}
|
|
160
|
+
const host = new mod.PlaywrightBrowserHost({
|
|
161
|
+
profile,
|
|
162
|
+
home,
|
|
163
|
+
plan,
|
|
164
|
+
mode: 'interactive',
|
|
165
|
+
// The person is driving: every site may load, and the host's checks
|
|
166
|
+
// after the fact have nothing to clear.
|
|
167
|
+
sites: { '*': 'act' },
|
|
168
|
+
...(ctx.config.browser?.keepOpen ? { keepOpen: true } : {}),
|
|
169
|
+
});
|
|
170
|
+
ctx.formatter.info(`Opening ${browserName(plan.browser)} (${engineLabel(plan)}) on profile ${profile}…`);
|
|
171
|
+
try {
|
|
172
|
+
await host.observe(url === 'about:blank' ? { action: 'snapshot' } : { action: 'tabs', op: 'new', url });
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
const code = error.code;
|
|
176
|
+
// A sign-in page is why the window is open.
|
|
177
|
+
if (code !== 'browser_human_required') {
|
|
178
|
+
await host.dispose().catch(() => undefined);
|
|
179
|
+
ctx.formatter.error({ message: `The browser did not open: ${errorText(error)}` });
|
|
180
|
+
return code === 'browser_unavailable' || code === 'browser_profile_busy'
|
|
181
|
+
? EXIT_UNAVAILABLE
|
|
182
|
+
: EXIT_FAIL;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const where = url === 'about:blank' ? 'the sites you want the agent to use' : new URL(url).origin;
|
|
186
|
+
ctx.formatter.print({
|
|
187
|
+
text: `Sign in to ${where} in the window that opened (profile ${profile}).\n${interactive() ? 'Press Enter here when you are done, or close the window.' : 'Close the window when you are done.'}`,
|
|
188
|
+
});
|
|
189
|
+
const stop = new AbortController();
|
|
190
|
+
const closed = new Promise((resolve) => {
|
|
191
|
+
const timer = setInterval(() => {
|
|
192
|
+
if (!host.running) {
|
|
193
|
+
clearInterval(timer);
|
|
194
|
+
resolve('closed');
|
|
195
|
+
}
|
|
196
|
+
}, deps.pollMs);
|
|
197
|
+
stop.signal.addEventListener('abort', () => clearInterval(timer), { once: true });
|
|
198
|
+
});
|
|
199
|
+
const how = await Promise.race([
|
|
200
|
+
deps.waitForEnter(stop.signal).then(() => 'enter'),
|
|
201
|
+
closed,
|
|
202
|
+
]);
|
|
203
|
+
stop.abort();
|
|
204
|
+
await host.dispose().catch(() => undefined);
|
|
205
|
+
try {
|
|
206
|
+
new mod.BrowserProfileStore(home).markLogin(profile);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// A window closed before the profile was written has nothing to mark.
|
|
210
|
+
}
|
|
211
|
+
ctx.formatter.print({
|
|
212
|
+
text: `${how === 'closed' ? 'Window closed' : 'Done'}. Profile ${profile} keeps what you signed in to; the agent uses it when the profile is selected (browser.defaultProfile, or /browser profile ${profile}), and a scheduled job when it is given the profile (namzu schedule add … --browser ${profile}).`,
|
|
213
|
+
});
|
|
214
|
+
return EXIT_OK;
|
|
215
|
+
}
|
|
216
|
+
async function listCommand(ctx, argv, deps) {
|
|
217
|
+
const args = parseArgs(argv, ['home', 'json!']);
|
|
218
|
+
if (args.unknown.length > 0 || args.positionals.length > 0) {
|
|
219
|
+
ctx.formatter.error({ message: 'usage: namzu browser list [--json]' });
|
|
220
|
+
return EXIT_USAGE;
|
|
221
|
+
}
|
|
222
|
+
const mod = await deps.load();
|
|
223
|
+
const home = homeOf(args, deps);
|
|
224
|
+
const leases = new mod.BrowserLeaseStore(home);
|
|
225
|
+
const profiles = new mod.BrowserProfileStore(home).list().map((profile) => ({
|
|
226
|
+
...profile,
|
|
227
|
+
inUse: leases.holders(profile.name).length > 0,
|
|
228
|
+
}));
|
|
229
|
+
if (has(args, 'json') || ctx.formatter.name !== 'text') {
|
|
230
|
+
const payload = { v: 1, profiles };
|
|
231
|
+
ctx.formatter.print(ctx.formatter.name === 'text' ? JSON.stringify(payload, null, 2) : payload);
|
|
232
|
+
return EXIT_OK;
|
|
233
|
+
}
|
|
234
|
+
if (profiles.length === 0) {
|
|
235
|
+
ctx.formatter.print('No browser profiles yet. Make one with `namzu browser login <profile> <url>`.');
|
|
236
|
+
return EXIT_OK;
|
|
237
|
+
}
|
|
238
|
+
ctx.formatter.print(profiles
|
|
239
|
+
.map((p) => `${p.name} ${browserName(p.browser)} (${p.engine})${p.inUse ? ' in use' : ''}\n ${p.lastLoginAt ? `last sign-in ${p.lastLoginAt}` : 'never signed in'} · created ${p.createdAt}`)
|
|
240
|
+
.join('\n'));
|
|
241
|
+
return EXIT_OK;
|
|
242
|
+
}
|
|
243
|
+
async function statusCommand(ctx, argv, deps) {
|
|
244
|
+
const args = parseArgs(argv, ['home', 'json!']);
|
|
245
|
+
const [profile, ...extra] = args.positionals;
|
|
246
|
+
if (args.unknown.length > 0 || extra.length > 0) {
|
|
247
|
+
ctx.formatter.error({ message: 'usage: namzu browser status [profile] [--json]' });
|
|
248
|
+
return EXIT_USAGE;
|
|
249
|
+
}
|
|
250
|
+
if (profile !== undefined && !isBrowserProfileName(profile)) {
|
|
251
|
+
ctx.formatter.error({ message: `"${profile}" is not a profile name.` });
|
|
252
|
+
return EXIT_USAGE;
|
|
253
|
+
}
|
|
254
|
+
const mod = await deps.load();
|
|
255
|
+
const home = homeOf(args, deps);
|
|
256
|
+
const plan = detectPlan(mod, ctx, deps);
|
|
257
|
+
const browser = ctx.config.browser;
|
|
258
|
+
const descriptor = profile ? new mod.BrowserProfileStore(home).get(profile) : undefined;
|
|
259
|
+
const holders = profile ? new mod.BrowserLeaseStore(home).holders(profile) : [];
|
|
260
|
+
const payload = {
|
|
261
|
+
v: 1,
|
|
262
|
+
engine: engineLabel(plan),
|
|
263
|
+
browser: plan.browser,
|
|
264
|
+
headless: plan.headless,
|
|
265
|
+
...(plan.unavailableReason !== undefined ? { unavailableReason: plan.unavailableReason } : {}),
|
|
266
|
+
warnings: plan.warnings,
|
|
267
|
+
enabled: browser?.enabled !== false,
|
|
268
|
+
defaultProfile: browser?.defaultProfile ?? 'default',
|
|
269
|
+
sites: browser?.sites ?? { '*': 'ask' },
|
|
270
|
+
...(profile ? { profile: descriptor ?? null, inUse: holders.length > 0 } : {}),
|
|
271
|
+
};
|
|
272
|
+
if (has(args, 'json') || ctx.formatter.name !== 'text') {
|
|
273
|
+
ctx.formatter.print(ctx.formatter.name === 'text' ? JSON.stringify(payload, null, 2) : payload);
|
|
274
|
+
return plan.unavailableReason !== undefined ? EXIT_UNAVAILABLE : EXIT_OK;
|
|
275
|
+
}
|
|
276
|
+
const lines = [
|
|
277
|
+
`Engine: ${describeBrowserPlan(plan)}`,
|
|
278
|
+
...(plan.unavailableReason !== undefined ? [`Unavailable: ${plan.unavailableReason}`] : []),
|
|
279
|
+
...plan.warnings.map((w) => `Note: ${w}`),
|
|
280
|
+
`Browser tools: ${payload.enabled ? 'on in the interactive terminal' : 'off (browser.enabled: false)'}`,
|
|
281
|
+
`Default profile: ${payload.defaultProfile}`,
|
|
282
|
+
`Sites: ${Object.entries(payload.sites)
|
|
283
|
+
.map(([site, level]) => `${site} ${level}`)
|
|
284
|
+
.join(' · ')}`,
|
|
285
|
+
];
|
|
286
|
+
if (profile) {
|
|
287
|
+
lines.push(descriptor
|
|
288
|
+
? `Profile ${profile}: ${browserName(descriptor.browser)} (${descriptor.engine}) · ${descriptor.lastLoginAt ? `last sign-in ${descriptor.lastLoginAt}` : 'never signed in'}${holders.length > 0 ? ' · in use' : ''}\n ${descriptor.userDataDir}`
|
|
289
|
+
: `Profile ${profile}: does not exist yet. \`namzu browser login ${profile} <url>\` makes it.`);
|
|
290
|
+
}
|
|
291
|
+
ctx.formatter.print(lines.join('\n'));
|
|
292
|
+
return plan.unavailableReason !== undefined ? EXIT_UNAVAILABLE : EXIT_OK;
|
|
293
|
+
}
|
|
294
|
+
async function installCommand(ctx, argv, deps) {
|
|
295
|
+
const args = parseArgs(argv, ['dry-run!', 'force!']);
|
|
296
|
+
if (args.unknown.length > 0 || args.positionals.length > 0) {
|
|
297
|
+
ctx.formatter.error({ message: 'usage: namzu browser install [--dry-run] [--force]' });
|
|
298
|
+
return EXIT_USAGE;
|
|
299
|
+
}
|
|
300
|
+
const mod = await deps.load();
|
|
301
|
+
const plan = detectPlan(mod, ctx, deps);
|
|
302
|
+
if (plan.browser !== 'chromium' && plan.unavailableReason === undefined && !has(args, 'force')) {
|
|
303
|
+
ctx.formatter.print(`Nothing to install: the browser tools drive ${describeBrowserPlan(plan)}. Pass --force to download Playwright’s Chromium anyway.`);
|
|
304
|
+
return EXIT_OK;
|
|
305
|
+
}
|
|
306
|
+
ctx.formatter.info(`Downloading Chromium for playwright-core ${mod.PLAYWRIGHT_CORE_VERSION}…`);
|
|
307
|
+
const code = await deps.spawnInstall(has(args, 'dry-run') ? ['--dry-run'] : []);
|
|
308
|
+
return code === 0 ? EXIT_OK : EXIT_FAIL;
|
|
309
|
+
}
|
|
310
|
+
async function removeCommand(ctx, argv, deps) {
|
|
311
|
+
const args = parseArgs(argv, ['home', 'yes!']);
|
|
312
|
+
const [profile, ...extra] = args.positionals;
|
|
313
|
+
if (args.unknown.length > 0 || !profile || extra.length > 0) {
|
|
314
|
+
ctx.formatter.error({ message: 'usage: namzu browser remove <profile> [--yes]' });
|
|
315
|
+
return EXIT_USAGE;
|
|
316
|
+
}
|
|
317
|
+
if (!isBrowserProfileName(profile)) {
|
|
318
|
+
ctx.formatter.error({ message: `"${profile}" is not a profile name.` });
|
|
319
|
+
return EXIT_USAGE;
|
|
320
|
+
}
|
|
321
|
+
const mod = await deps.load();
|
|
322
|
+
const home = homeOf(args, deps);
|
|
323
|
+
const store = new mod.BrowserProfileStore(home);
|
|
324
|
+
const descriptor = store.get(profile);
|
|
325
|
+
if (!descriptor) {
|
|
326
|
+
ctx.formatter.error({ message: `There is no browser profile "${profile}".` });
|
|
327
|
+
return EXIT_FAIL;
|
|
328
|
+
}
|
|
329
|
+
if (!has(args, 'yes')) {
|
|
330
|
+
if (!interactive()) {
|
|
331
|
+
ctx.formatter.error({
|
|
332
|
+
message: `Removing profile ${profile} deletes everything signed in to it. Pass --yes to confirm.`,
|
|
333
|
+
});
|
|
334
|
+
return EXIT_USAGE;
|
|
335
|
+
}
|
|
336
|
+
const answer = await new Promise((resolve) => {
|
|
337
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
338
|
+
rl.question(`Delete browser profile ${profile} (${descriptor.userDataDir}) and every sign-in in it? [y/N] `, (text) => {
|
|
339
|
+
rl.close();
|
|
340
|
+
resolve(text);
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
if (!/^y(es)?$/i.test(answer.trim())) {
|
|
344
|
+
ctx.formatter.print('Kept.');
|
|
345
|
+
return EXIT_OK;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
const plan = detectPlan(mod, ctx, deps);
|
|
349
|
+
try {
|
|
350
|
+
store.remove(profile, new mod.BrowserLeaseStore(home), {
|
|
351
|
+
...(plan.engine === 'windows-cdp' ? { mountRoot: plan.mountRoot } : {}),
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
ctx.formatter.error({ message: errorText(error) });
|
|
356
|
+
return EXIT_FAIL;
|
|
357
|
+
}
|
|
358
|
+
ctx.formatter.print(`Removed browser profile ${profile}.`);
|
|
359
|
+
return EXIT_OK;
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/browser/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The interactive session's browser: one `BrowserHost` the tools are built
|
|
3
|
+
* over, whose profile the operator can switch without rebuilding them.
|
|
4
|
+
*
|
|
5
|
+
* `createBrowserTools(host)` reads `host` on every call, so the host handed
|
|
6
|
+
* to it here is a delegate over the real `PlaywrightBrowserHost`. Switching
|
|
7
|
+
* profile (`/browser profile <name>`) disposes the current host (which
|
|
8
|
+
* closes its browser, unless `keepOpen`) and builds the next one; neither
|
|
9
|
+
* launches anything until the model's first browser call.
|
|
10
|
+
*
|
|
11
|
+
* Constructing a `PlaywrightBrowserHost` detects the engine (file probes and
|
|
12
|
+
* `wslinfo`, a few milliseconds) and starts nothing, which is why the
|
|
13
|
+
* session can build one at boot.
|
|
14
|
+
*/
|
|
15
|
+
import type { BrowserEngineSetting, BrowserHeadlessSetting, BrowserRunMode, PlaywrightBrowserHost, PlaywrightBrowserHostOptions } from '@namzu/browser';
|
|
16
|
+
import type { BrowserHost } from '@namzu/sdk';
|
|
17
|
+
import type { BrowserSitesConfig } from '../permissions/browser-sites.js';
|
|
18
|
+
/** `@namzu/browser` profile names, restated so this file needs no runtime import to check one. */
|
|
19
|
+
export declare const BROWSER_PROFILE_NAME_PATTERN: RegExp;
|
|
20
|
+
export declare function isBrowserProfileName(name: string): boolean;
|
|
21
|
+
/** What the TUI asks the session for. */
|
|
22
|
+
export interface BrowserSessionOptions {
|
|
23
|
+
/** Default `default`. */
|
|
24
|
+
readonly profile?: string;
|
|
25
|
+
readonly engine?: BrowserEngineSetting;
|
|
26
|
+
readonly headless?: BrowserHeadlessSetting;
|
|
27
|
+
/** Canonical site rules, `*` included; the host checks landings against them. */
|
|
28
|
+
readonly sites?: BrowserSitesConfig;
|
|
29
|
+
readonly keepOpen?: boolean;
|
|
30
|
+
/** `NAMZU_HOME`. */
|
|
31
|
+
readonly home?: string;
|
|
32
|
+
/** `unattended` for a scheduled run: nobody at the window. Default `interactive`. */
|
|
33
|
+
readonly mode?: BrowserRunMode;
|
|
34
|
+
}
|
|
35
|
+
/** What `/browser` shows, and what the handoff notice needs. */
|
|
36
|
+
export interface BrowserStatus {
|
|
37
|
+
readonly profile: string;
|
|
38
|
+
/** `windows-cdp`, `local-chrome`, `local-chromium`, … */
|
|
39
|
+
readonly engine: string;
|
|
40
|
+
/** `chrome`, `msedge` or `chromium`. */
|
|
41
|
+
readonly browser: string;
|
|
42
|
+
readonly headless: boolean;
|
|
43
|
+
readonly running: boolean;
|
|
44
|
+
readonly unavailableReason?: string;
|
|
45
|
+
readonly warnings: readonly string[];
|
|
46
|
+
readonly sites: BrowserSitesConfig;
|
|
47
|
+
readonly keepOpen: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface BrowserControl {
|
|
50
|
+
/** The host the tools are built over. */
|
|
51
|
+
readonly host: BrowserHost;
|
|
52
|
+
status(): BrowserStatus;
|
|
53
|
+
/** Run under another profile from the next browser call on. Closes the current browser. */
|
|
54
|
+
switchProfile(name: string): Promise<BrowserStatus>;
|
|
55
|
+
/**
|
|
56
|
+
* Close the browser and release the profile, keeping everything else; the
|
|
57
|
+
* next call starts it again. For a sign-in in another process
|
|
58
|
+
* (`namzu browser login`) while this session waits.
|
|
59
|
+
*/
|
|
60
|
+
release(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Run under `profile` and `sites` from the next browser call on, until
|
|
63
|
+
* the returned function puts the session's own profile and sites back.
|
|
64
|
+
* For a parked scheduled run continued in this session: its turn drives
|
|
65
|
+
* the job's profile, and the host holds it to the job's sites. Closes the
|
|
66
|
+
* current browser, both ways.
|
|
67
|
+
*/
|
|
68
|
+
runAs(options: {
|
|
69
|
+
readonly profile: string;
|
|
70
|
+
readonly sites: BrowserSitesConfig;
|
|
71
|
+
}): Promise<() => Promise<void>>;
|
|
72
|
+
dispose(): Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
type HostConstructor = new (options: PlaywrightBrowserHostOptions) => PlaywrightBrowserHost;
|
|
75
|
+
export declare function createBrowserControl(Host: HostConstructor, options: BrowserSessionOptions): BrowserControl;
|
|
76
|
+
/** The status as `/browser` prints it. */
|
|
77
|
+
export declare function describeBrowserStatus(status: BrowserStatus): string;
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/browser/control.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACX,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,4BAA4B,EAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAIX,WAAW,EAKX,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAEzE,kGAAkG;AAClG,eAAO,MAAM,4BAA4B,QAA+B,CAAA;AAExE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,yCAAyC;AACzC,MAAM,WAAW,qBAAqB;IACrC,yBAAyB;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAA;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAA;IAC1C,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,oBAAoB;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,qFAAqF;IACrF,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAA;CAC9B;AAED,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,wCAAwC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,MAAM,IAAI,aAAa,CAAA;IACvB,2FAA2F;IAC3F,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IACnD;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,EAAE;QACd,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAA;KAClC,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB;AAED,KAAK,eAAe,GAAG,KAAK,OAAO,EAAE,4BAA4B,KAAK,qBAAqB,CAAA;AAE3F,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,qBAAqB,GAC5B,cAAc,CA2GhB;AAED,0CAA0C;AAC1C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAanE"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The interactive session's browser: one `BrowserHost` the tools are built
|
|
3
|
+
* over, whose profile the operator can switch without rebuilding them.
|
|
4
|
+
*
|
|
5
|
+
* `createBrowserTools(host)` reads `host` on every call, so the host handed
|
|
6
|
+
* to it here is a delegate over the real `PlaywrightBrowserHost`. Switching
|
|
7
|
+
* profile (`/browser profile <name>`) disposes the current host (which
|
|
8
|
+
* closes its browser, unless `keepOpen`) and builds the next one; neither
|
|
9
|
+
* launches anything until the model's first browser call.
|
|
10
|
+
*
|
|
11
|
+
* Constructing a `PlaywrightBrowserHost` detects the engine (file probes and
|
|
12
|
+
* `wslinfo`, a few milliseconds) and starts nothing, which is why the
|
|
13
|
+
* session can build one at boot.
|
|
14
|
+
*/
|
|
15
|
+
/** `@namzu/browser` profile names, restated so this file needs no runtime import to check one. */
|
|
16
|
+
export const BROWSER_PROFILE_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
17
|
+
export function isBrowserProfileName(name) {
|
|
18
|
+
return name.length <= 64 && BROWSER_PROFILE_NAME_PATTERN.test(name);
|
|
19
|
+
}
|
|
20
|
+
export function createBrowserControl(Host, options) {
|
|
21
|
+
const ownSites = options.sites ?? { '*': 'ask' };
|
|
22
|
+
let sites = ownSites;
|
|
23
|
+
const build = (profile) => new Host({
|
|
24
|
+
profile,
|
|
25
|
+
mode: options.mode ?? 'interactive',
|
|
26
|
+
sites,
|
|
27
|
+
...(options.engine ? { engine: options.engine } : {}),
|
|
28
|
+
...(options.headless ? { headless: options.headless } : {}),
|
|
29
|
+
...(options.keepOpen ? { keepOpen: true } : {}),
|
|
30
|
+
...(options.home ? { home: options.home } : {}),
|
|
31
|
+
});
|
|
32
|
+
let current = build(options.profile ?? 'default');
|
|
33
|
+
let disposed = false;
|
|
34
|
+
const host = {
|
|
35
|
+
id: 'namzu-browser',
|
|
36
|
+
get capabilities() {
|
|
37
|
+
return current.capabilities;
|
|
38
|
+
},
|
|
39
|
+
observe(action, callOptions) {
|
|
40
|
+
return current.observe(action, callOptions);
|
|
41
|
+
},
|
|
42
|
+
act(action, callOptions) {
|
|
43
|
+
return current.act(action, callOptions);
|
|
44
|
+
},
|
|
45
|
+
describeRef(ref) {
|
|
46
|
+
return current.describeRef(ref);
|
|
47
|
+
},
|
|
48
|
+
session() {
|
|
49
|
+
return current.session();
|
|
50
|
+
},
|
|
51
|
+
async initialize() {
|
|
52
|
+
// Nothing: the browser starts on the first call that needs it.
|
|
53
|
+
},
|
|
54
|
+
async dispose() {
|
|
55
|
+
await control.dispose();
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
const control = {
|
|
59
|
+
host,
|
|
60
|
+
status() {
|
|
61
|
+
const plan = current.plan;
|
|
62
|
+
return {
|
|
63
|
+
profile: current.profile,
|
|
64
|
+
engine: current.capabilities.engine,
|
|
65
|
+
browser: plan.browser,
|
|
66
|
+
headless: current.capabilities.headless,
|
|
67
|
+
running: current.running,
|
|
68
|
+
...(current.capabilities.unavailableReason !== undefined
|
|
69
|
+
? { unavailableReason: current.capabilities.unavailableReason }
|
|
70
|
+
: {}),
|
|
71
|
+
warnings: current.warnings,
|
|
72
|
+
sites,
|
|
73
|
+
keepOpen: options.keepOpen === true,
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
async switchProfile(name) {
|
|
77
|
+
if (!isBrowserProfileName(name)) {
|
|
78
|
+
throw new Error(`"${name}" is not a profile name: use lowercase letters, digits and single hyphens, at most 64 characters.`);
|
|
79
|
+
}
|
|
80
|
+
if (disposed)
|
|
81
|
+
throw new Error('The browser of this session is closed.');
|
|
82
|
+
const previous = current;
|
|
83
|
+
current = build(name);
|
|
84
|
+
await previous.dispose();
|
|
85
|
+
return control.status();
|
|
86
|
+
},
|
|
87
|
+
async release() {
|
|
88
|
+
if (disposed)
|
|
89
|
+
return;
|
|
90
|
+
const previous = current;
|
|
91
|
+
current = build(previous.profile);
|
|
92
|
+
await previous.dispose();
|
|
93
|
+
},
|
|
94
|
+
async runAs(run) {
|
|
95
|
+
if (!isBrowserProfileName(run.profile)) {
|
|
96
|
+
throw new Error(`"${run.profile}" is not a profile name.`);
|
|
97
|
+
}
|
|
98
|
+
if (disposed)
|
|
99
|
+
throw new Error('The browser of this session is closed.');
|
|
100
|
+
const previous = current;
|
|
101
|
+
const ownProfile = previous.profile;
|
|
102
|
+
sites = run.sites;
|
|
103
|
+
current = build(run.profile);
|
|
104
|
+
await previous.dispose();
|
|
105
|
+
let restored = false;
|
|
106
|
+
return async () => {
|
|
107
|
+
if (restored || disposed)
|
|
108
|
+
return;
|
|
109
|
+
restored = true;
|
|
110
|
+
const used = current;
|
|
111
|
+
sites = ownSites;
|
|
112
|
+
current = build(ownProfile);
|
|
113
|
+
await used.dispose();
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
async dispose() {
|
|
117
|
+
if (disposed)
|
|
118
|
+
return;
|
|
119
|
+
disposed = true;
|
|
120
|
+
await current.dispose();
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
return control;
|
|
124
|
+
}
|
|
125
|
+
/** The status as `/browser` prints it. */
|
|
126
|
+
export function describeBrowserStatus(status) {
|
|
127
|
+
const sites = Object.entries(status.sites)
|
|
128
|
+
.map(([site, level]) => `${site} ${level}`)
|
|
129
|
+
.join(' · ');
|
|
130
|
+
const rows = [
|
|
131
|
+
`Browser: ${status.engine} (${status.browser}) · ${status.headless ? 'no window' : 'visible window'} · ${status.running ? 'running' : 'not started'}`,
|
|
132
|
+
`Profile: ${status.profile}${status.keepOpen ? ' · stays open after the session' : ''}`,
|
|
133
|
+
`Sites: ${sites}`,
|
|
134
|
+
...(status.unavailableReason ? [`Unavailable: ${status.unavailableReason}`] : []),
|
|
135
|
+
...status.warnings.map((warning) => `Note: ${warning}`),
|
|
136
|
+
'Sign in once with `namzu browser login <profile> <url>`; switch with /browser profile <name>.',
|
|
137
|
+
];
|
|
138
|
+
return rows.join('\n');
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/browser/control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An engine plan in words, for `namzu doctor`, `namzu browser status` and
|
|
3
|
+
* `/browser`. Types only from `@namzu/browser`: describing a plan must not
|
|
4
|
+
* load Playwright.
|
|
5
|
+
*/
|
|
6
|
+
import type { BrowserEnginePlan } from '@namzu/browser';
|
|
7
|
+
export declare function browserName(browser: string): string;
|
|
8
|
+
/** `windows-cdp`, `local-chrome`, …: the engine as the tools and the logs name it. */
|
|
9
|
+
export declare function engineLabel(plan: BrowserEnginePlan): string;
|
|
10
|
+
/** One line: which browser, where, and whether it shows a window. */
|
|
11
|
+
export declare function describeBrowserPlan(plan: BrowserEnginePlan): string;
|
|
12
|
+
//# sourceMappingURL=describe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../../src/browser/describe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAQvD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAE3D;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAOnE"}
|