@wjarka/cezarion 0.10.0-pr30.54
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/LICENSE +21 -0
- package/README.md +838 -0
- package/dist/agent-config/account-identity.d.ts +44 -0
- package/dist/agent-config/account-identity.js +128 -0
- package/dist/agent-config/account-identity.js.map +1 -0
- package/dist/agent-config/catalog.d.ts +72 -0
- package/dist/agent-config/catalog.js +223 -0
- package/dist/agent-config/catalog.js.map +1 -0
- package/dist/agent-config/files.d.ts +46 -0
- package/dist/agent-config/files.js +119 -0
- package/dist/agent-config/files.js.map +1 -0
- package/dist/agent-config/model-settings/claude.d.ts +2 -0
- package/dist/agent-config/model-settings/claude.js +11 -0
- package/dist/agent-config/model-settings/claude.js.map +1 -0
- package/dist/agent-config/model-settings/codex.d.ts +2 -0
- package/dist/agent-config/model-settings/codex.js +16 -0
- package/dist/agent-config/model-settings/codex.js.map +1 -0
- package/dist/agent-config/model-settings/opencode.d.ts +2 -0
- package/dist/agent-config/model-settings/opencode.js +8 -0
- package/dist/agent-config/model-settings/opencode.js.map +1 -0
- package/dist/agent-config/model-settings/pi.d.ts +12 -0
- package/dist/agent-config/model-settings/pi.js +18 -0
- package/dist/agent-config/model-settings/pi.js.map +1 -0
- package/dist/agent-config/model-settings/shared.d.ts +9 -0
- package/dist/agent-config/model-settings/shared.js +93 -0
- package/dist/agent-config/model-settings/shared.js.map +1 -0
- package/dist/agent-config/model-settings/types.d.ts +9 -0
- package/dist/agent-config/model-settings/types.js +2 -0
- package/dist/agent-config/model-settings/types.js.map +1 -0
- package/dist/agent-config/models.d.ts +9 -0
- package/dist/agent-config/models.js +32 -0
- package/dist/agent-config/models.js.map +1 -0
- package/dist/agent-config/seed.d.ts +7 -0
- package/dist/agent-config/seed.js +90 -0
- package/dist/agent-config/seed.js.map +1 -0
- package/dist/agent-config/service.d.ts +44 -0
- package/dist/agent-config/service.js +71 -0
- package/dist/agent-config/service.js.map +1 -0
- package/dist/agent-config/validate.d.ts +21 -0
- package/dist/agent-config/validate.js +76 -0
- package/dist/agent-config/validate.js.map +1 -0
- package/dist/automations/coordinator.d.ts +26 -0
- package/dist/automations/coordinator.js +66 -0
- package/dist/automations/coordinator.js.map +1 -0
- package/dist/automations/github-poller.d.ts +74 -0
- package/dist/automations/github-poller.js +234 -0
- package/dist/automations/github-poller.js.map +1 -0
- package/dist/automations/scheduler.d.ts +42 -0
- package/dist/automations/scheduler.js +192 -0
- package/dist/automations/scheduler.js.map +1 -0
- package/dist/automations/store.d.ts +65 -0
- package/dist/automations/store.js +298 -0
- package/dist/automations/store.js.map +1 -0
- package/dist/automations/task-template.d.ts +18 -0
- package/dist/automations/task-template.js +95 -0
- package/dist/automations/task-template.js.map +1 -0
- package/dist/automations/types.d.ts +255 -0
- package/dist/automations/types.js +159 -0
- package/dist/automations/types.js.map +1 -0
- package/dist/config.d.ts +77 -0
- package/dist/config.js +242 -0
- package/dist/config.js.map +1 -0
- package/dist/contract/agent-config.d.ts +153 -0
- package/dist/contract/agent-profiles.d.ts +347 -0
- package/dist/contract/automations.d.ts +935 -0
- package/dist/contract/events.d.ts +104 -0
- package/dist/contract/github.d.ts +556 -0
- package/dist/contract/health.d.ts +102 -0
- package/dist/contract/index.d.ts +16 -0
- package/dist/contract/index.js +1895 -0
- package/dist/contract/projects.d.ts +210 -0
- package/dist/contract/repo.d.ts +234 -0
- package/dist/contract/runs.d.ts +1473 -0
- package/dist/contract/skills.d.ts +232 -0
- package/dist/contract/workflows.d.ts +218 -0
- package/dist/contract/workspace.d.ts +579 -0
- package/dist/core/agent-env.d.ts +31 -0
- package/dist/core/agent-env.js +371 -0
- package/dist/core/agent-env.js.map +1 -0
- package/dist/core/agent-model-policy.d.ts +10 -0
- package/dist/core/agent-model-policy.js +36 -0
- package/dist/core/agent-model-policy.js.map +1 -0
- package/dist/core/agent-profiles.d.ts +62 -0
- package/dist/core/agent-profiles.js +90 -0
- package/dist/core/agent-profiles.js.map +1 -0
- package/dist/core/agent-runner.d.ts +211 -0
- package/dist/core/agent-runner.js +68 -0
- package/dist/core/agent-runner.js.map +1 -0
- package/dist/core/ask.d.ts +105 -0
- package/dist/core/ask.js +187 -0
- package/dist/core/ask.js.map +1 -0
- package/dist/core/backend-detect.d.ts +16 -0
- package/dist/core/backend-detect.js +155 -0
- package/dist/core/backend-detect.js.map +1 -0
- package/dist/core/claude-cli-runner.d.ts +59 -0
- package/dist/core/claude-cli-runner.js +483 -0
- package/dist/core/claude-cli-runner.js.map +1 -0
- package/dist/core/claude-ui-mapper.d.ts +80 -0
- package/dist/core/claude-ui-mapper.js +598 -0
- package/dist/core/claude-ui-mapper.js.map +1 -0
- package/dist/core/codex-app-server-runner.d.ts +41 -0
- package/dist/core/codex-app-server-runner.js +584 -0
- package/dist/core/codex-app-server-runner.js.map +1 -0
- package/dist/core/codex-app-server-transport.d.ts +35 -0
- package/dist/core/codex-app-server-transport.js +150 -0
- package/dist/core/codex-app-server-transport.js.map +1 -0
- package/dist/core/codex-model-catalog.d.ts +10 -0
- package/dist/core/codex-model-catalog.js +110 -0
- package/dist/core/codex-model-catalog.js.map +1 -0
- package/dist/core/codex-ui-mapper.d.ts +112 -0
- package/dist/core/codex-ui-mapper.js +766 -0
- package/dist/core/codex-ui-mapper.js.map +1 -0
- package/dist/core/model-identity.d.ts +125 -0
- package/dist/core/model-identity.js +132 -0
- package/dist/core/model-identity.js.map +1 -0
- package/dist/core/model-presets.d.ts +21 -0
- package/dist/core/model-presets.js +81 -0
- package/dist/core/model-presets.js.map +1 -0
- package/dist/core/ndjson.d.ts +6 -0
- package/dist/core/ndjson.js +23 -0
- package/dist/core/ndjson.js.map +1 -0
- package/dist/core/opencode-model-catalog.d.ts +32 -0
- package/dist/core/opencode-model-catalog.js +153 -0
- package/dist/core/opencode-model-catalog.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +32 -0
- package/dist/core/opencode-server-runner.js +882 -0
- package/dist/core/opencode-server-runner.js.map +1 -0
- package/dist/core/opencode-ui-mapper.d.ts +137 -0
- package/dist/core/opencode-ui-mapper.js +800 -0
- package/dist/core/opencode-ui-mapper.js.map +1 -0
- package/dist/core/pi-model-catalog.d.ts +31 -0
- package/dist/core/pi-model-catalog.js +152 -0
- package/dist/core/pi-model-catalog.js.map +1 -0
- package/dist/core/pi-runner.d.ts +24 -0
- package/dist/core/pi-runner.js +403 -0
- package/dist/core/pi-runner.js.map +1 -0
- package/dist/core/pi-ui-mapper.d.ts +36 -0
- package/dist/core/pi-ui-mapper.js +304 -0
- package/dist/core/pi-ui-mapper.js.map +1 -0
- package/dist/core/process-usage.d.ts +66 -0
- package/dist/core/process-usage.js +193 -0
- package/dist/core/process-usage.js.map +1 -0
- package/dist/core/provider-auth.d.ts +154 -0
- package/dist/core/provider-auth.js +509 -0
- package/dist/core/provider-auth.js.map +1 -0
- package/dist/core/provider-availability.d.ts +3 -0
- package/dist/core/provider-availability.js +14 -0
- package/dist/core/provider-availability.js.map +1 -0
- package/dist/core/runner-factory.d.ts +8 -0
- package/dist/core/runner-factory.js +25 -0
- package/dist/core/runner-factory.js.map +1 -0
- package/dist/core/runner-model-catalog.d.ts +29 -0
- package/dist/core/runner-model-catalog.js +78 -0
- package/dist/core/runner-model-catalog.js.map +1 -0
- package/dist/core/secret-redaction.d.ts +37 -0
- package/dist/core/secret-redaction.js +115 -0
- package/dist/core/secret-redaction.js.map +1 -0
- package/dist/core/shell-env.d.ts +28 -0
- package/dist/core/shell-env.js +56 -0
- package/dist/core/shell-env.js.map +1 -0
- package/dist/core/tool-display.d.ts +31 -0
- package/dist/core/tool-display.js +179 -0
- package/dist/core/tool-display.js.map +1 -0
- package/dist/core/ui-events.d.ts +335 -0
- package/dist/core/ui-events.js +25 -0
- package/dist/core/ui-events.js.map +1 -0
- package/dist/core/usage-limit.d.ts +42 -0
- package/dist/core/usage-limit.js +209 -0
- package/dist/core/usage-limit.js.map +1 -0
- package/dist/core/usage.d.ts +11 -0
- package/dist/core/usage.js +15 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/core/v1-text-coalescer.d.ts +36 -0
- package/dist/core/v1-text-coalescer.js +72 -0
- package/dist/core/v1-text-coalescer.js.map +1 -0
- package/dist/git-diff-base.d.ts +85 -0
- package/dist/git-diff-base.js +180 -0
- package/dist/git-diff-base.js.map +1 -0
- package/dist/git-refs.d.ts +11 -0
- package/dist/git-refs.js +14 -0
- package/dist/git-refs.js.map +1 -0
- package/dist/git-worktree.d.ts +161 -0
- package/dist/git-worktree.js +508 -0
- package/dist/git-worktree.js.map +1 -0
- package/dist/handoff.d.ts +62 -0
- package/dist/handoff.js +154 -0
- package/dist/handoff.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +680 -0
- package/dist/index.js.map +1 -0
- package/dist/install-as-command.d.ts +40 -0
- package/dist/install-as-command.js +52 -0
- package/dist/install-as-command.js.map +1 -0
- package/dist/pack-check.d.ts +17 -0
- package/dist/pack-check.js +27 -0
- package/dist/pack-check.js.map +1 -0
- package/dist/paths.d.ts +140 -0
- package/dist/paths.js +192 -0
- package/dist/paths.js.map +1 -0
- package/dist/planner.d.ts +27 -0
- package/dist/planner.js +268 -0
- package/dist/planner.js.map +1 -0
- package/dist/release/manifests.d.ts +81 -0
- package/dist/release/manifests.js +74 -0
- package/dist/release/manifests.js.map +1 -0
- package/dist/release/snapshot.d.ts +67 -0
- package/dist/release/snapshot.js +97 -0
- package/dist/release/snapshot.js.map +1 -0
- package/dist/release/stable.d.ts +38 -0
- package/dist/release/stable.js +55 -0
- package/dist/release/stable.js.map +1 -0
- package/dist/runs/agent-tmpdir.d.ts +41 -0
- package/dist/runs/agent-tmpdir.js +183 -0
- package/dist/runs/agent-tmpdir.js.map +1 -0
- package/dist/runs/auto-name.d.ts +75 -0
- package/dist/runs/auto-name.js +179 -0
- package/dist/runs/auto-name.js.map +1 -0
- package/dist/runs/event-history.d.ts +50 -0
- package/dist/runs/event-history.js +613 -0
- package/dist/runs/event-history.js.map +1 -0
- package/dist/runs/retention.d.ts +60 -0
- package/dist/runs/retention.js +86 -0
- package/dist/runs/retention.js.map +1 -0
- package/dist/runs/review-gate.d.ts +18 -0
- package/dist/runs/review-gate.js +21 -0
- package/dist/runs/review-gate.js.map +1 -0
- package/dist/runs/run-index.d.ts +19 -0
- package/dist/runs/run-index.js +43 -0
- package/dist/runs/run-index.js.map +1 -0
- package/dist/runs/store.d.ts +446 -0
- package/dist/runs/store.js +1118 -0
- package/dist/runs/store.js.map +1 -0
- package/dist/runs/task-markers.d.ts +28 -0
- package/dist/runs/task-markers.js +74 -0
- package/dist/runs/task-markers.js.map +1 -0
- package/dist/runs/task-refs.d.ts +25 -0
- package/dist/runs/task-refs.js +74 -0
- package/dist/runs/task-refs.js.map +1 -0
- package/dist/runs/ui-event-sink.d.ts +81 -0
- package/dist/runs/ui-event-sink.js +210 -0
- package/dist/runs/ui-event-sink.js.map +1 -0
- package/dist/server/app-type.d.ts +21 -0
- package/dist/server/app-type.js +2 -0
- package/dist/server/app-type.js.map +1 -0
- package/dist/server/capabilities.d.ts +70 -0
- package/dist/server/capabilities.js +152 -0
- package/dist/server/capabilities.js.map +1 -0
- package/dist/server/checkout.d.ts +128 -0
- package/dist/server/checkout.js +296 -0
- package/dist/server/checkout.js.map +1 -0
- package/dist/server/forge/github.d.ts +513 -0
- package/dist/server/forge/github.js +2364 -0
- package/dist/server/forge/github.js.map +1 -0
- package/dist/server/forge/index.d.ts +40 -0
- package/dist/server/forge/index.js +72 -0
- package/dist/server/forge/index.js.map +1 -0
- package/dist/server/forge/types.d.ts +242 -0
- package/dist/server/forge/types.js +2 -0
- package/dist/server/forge/types.js.map +1 -0
- package/dist/server/fs-browse.d.ts +105 -0
- package/dist/server/fs-browse.js +182 -0
- package/dist/server/fs-browse.js.map +1 -0
- package/dist/server/git-changes.d.ts +213 -0
- package/dist/server/git-changes.js +555 -0
- package/dist/server/git-changes.js.map +1 -0
- package/dist/server/git.d.ts +28 -0
- package/dist/server/git.js +112 -0
- package/dist/server/git.js.map +1 -0
- package/dist/server/github.d.ts +9 -0
- package/dist/server/github.js +8 -0
- package/dist/server/github.js.map +1 -0
- package/dist/server/launch-key.d.ts +7 -0
- package/dist/server/launch-key.js +33 -0
- package/dist/server/launch-key.js.map +1 -0
- package/dist/server/open-in-app.d.ts +66 -0
- package/dist/server/open-in-app.js +211 -0
- package/dist/server/open-in-app.js.map +1 -0
- package/dist/server/open-in-terminal.d.ts +70 -0
- package/dist/server/open-in-terminal.js +179 -0
- package/dist/server/open-in-terminal.js.map +1 -0
- package/dist/server/pr.d.ts +7 -0
- package/dist/server/pr.js +7 -0
- package/dist/server/pr.js.map +1 -0
- package/dist/server/project-context.d.ts +120 -0
- package/dist/server/project-context.js +182 -0
- package/dist/server/project-context.js.map +1 -0
- package/dist/server/provider-action-gate.d.ts +8 -0
- package/dist/server/provider-action-gate.js +56 -0
- package/dist/server/provider-action-gate.js.map +1 -0
- package/dist/server/provider-auth-runtime.d.ts +21 -0
- package/dist/server/provider-auth-runtime.js +66 -0
- package/dist/server/provider-auth-runtime.js.map +1 -0
- package/dist/server/server.d.ts +13138 -0
- package/dist/server/server.js +5263 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/static-ui.d.ts +49 -0
- package/dist/server/static-ui.js +92 -0
- package/dist/server/static-ui.js.map +1 -0
- package/dist/server/validators.d.ts +97 -0
- package/dist/server/validators.js +86 -0
- package/dist/server/validators.js.map +1 -0
- package/dist/server/ws.d.ts +85 -0
- package/dist/server/ws.js +218 -0
- package/dist/server/ws.js.map +1 -0
- package/dist/server/wsl.d.ts +25 -0
- package/dist/server/wsl.js +92 -0
- package/dist/server/wsl.js.map +1 -0
- package/dist/server-install/engine.d.ts +50 -0
- package/dist/server-install/engine.js +324 -0
- package/dist/server-install/engine.js.map +1 -0
- package/dist/server-install/platforms/macosx-ngrok.d.ts +6 -0
- package/dist/server-install/platforms/macosx-ngrok.js +345 -0
- package/dist/server-install/platforms/macosx-ngrok.js.map +1 -0
- package/dist/server-install/platforms/ubuntu-vps.d.ts +78 -0
- package/dist/server-install/platforms/ubuntu-vps.js +1016 -0
- package/dist/server-install/platforms/ubuntu-vps.js.map +1 -0
- package/dist/server-install/state.d.ts +52 -0
- package/dist/server-install/state.js +182 -0
- package/dist/server-install/state.js.map +1 -0
- package/dist/server-install/steps.d.ts +109 -0
- package/dist/server-install/steps.js +334 -0
- package/dist/server-install/steps.js.map +1 -0
- package/dist/server-install/strategies.d.ts +4 -0
- package/dist/server-install/strategies.js +20 -0
- package/dist/server-install/strategies.js.map +1 -0
- package/dist/server-install/types.d.ts +287 -0
- package/dist/server-install/types.js +121 -0
- package/dist/server-install/types.js.map +1 -0
- package/dist/server-install/ui.d.ts +42 -0
- package/dist/server-install/ui.js +130 -0
- package/dist/server-install/ui.js.map +1 -0
- package/dist/skills-banner.d.ts +22 -0
- package/dist/skills-banner.js +41 -0
- package/dist/skills-banner.js.map +1 -0
- package/dist/skills-remote.d.ts +84 -0
- package/dist/skills-remote.js +468 -0
- package/dist/skills-remote.js.map +1 -0
- package/dist/skills-update.d.ts +88 -0
- package/dist/skills-update.js +392 -0
- package/dist/skills-update.js.map +1 -0
- package/dist/skills.d.ts +82 -0
- package/dist/skills.js +251 -0
- package/dist/skills.js.map +1 -0
- package/dist/todos.d.ts +48 -0
- package/dist/todos.js +201 -0
- package/dist/todos.js.map +1 -0
- package/dist/ui-state.d.ts +26 -0
- package/dist/ui-state.js +38 -0
- package/dist/ui-state.js.map +1 -0
- package/dist/update-check.d.ts +12 -0
- package/dist/update-check.js +41 -0
- package/dist/update-check.js.map +1 -0
- package/dist/workflows/load.d.ts +15 -0
- package/dist/workflows/load.js +56 -0
- package/dist/workflows/load.js.map +1 -0
- package/dist/workflows/run.d.ts +758 -0
- package/dist/workflows/run.js +3389 -0
- package/dist/workflows/run.js.map +1 -0
- package/dist/workflows/types.d.ts +153 -0
- package/dist/workflows/types.js +212 -0
- package/dist/workflows/types.js.map +1 -0
- package/dist/workspace/agent-accounts.d.ts +153 -0
- package/dist/workspace/agent-accounts.js +304 -0
- package/dist/workspace/agent-accounts.js.map +1 -0
- package/dist/workspace/agent-profiles.d.ts +78 -0
- package/dist/workspace/agent-profiles.js +115 -0
- package/dist/workspace/agent-profiles.js.map +1 -0
- package/dist/workspace/config.d.ts +169 -0
- package/dist/workspace/config.js +379 -0
- package/dist/workspace/config.js.map +1 -0
- package/dist/workspace/migrations.d.ts +45 -0
- package/dist/workspace/migrations.js +147 -0
- package/dist/workspace/migrations.js.map +1 -0
- package/dist/workspace/projects-cli.d.ts +25 -0
- package/dist/workspace/projects-cli.js +172 -0
- package/dist/workspace/projects-cli.js.map +1 -0
- package/dist/workspace/projects.d.ts +109 -0
- package/dist/workspace/projects.js +250 -0
- package/dist/workspace/projects.js.map +1 -0
- package/dist/workspace/semaphore.d.ts +179 -0
- package/dist/workspace/semaphore.js +195 -0
- package/dist/workspace/semaphore.js.map +1 -0
- package/dist/workspace/ui-state.d.ts +34 -0
- package/dist/workspace/ui-state.js +53 -0
- package/dist/workspace/ui-state.js.map +1 -0
- package/package.json +70 -0
- package/scripts/check-pack.mjs +46 -0
- package/scripts/inline-contract.mjs +112 -0
- package/scripts/install-as-command.mjs +120 -0
- package/scripts/mock-claude.mjs +520 -0
- package/scripts/mock-pi-rpc.mjs +83 -0
- package/scripts/sync-readme.mjs +20 -0
- package/scripts/test-process-usage.mjs +47 -0
- package/web/dist/assets/alert-dialog-B4Ofsgv7.js +1 -0
- package/web/dist/assets/arrow-down-Dy8dup7j.js +1 -0
- package/web/dist/assets/arrow-left-BJaucbhn.js +1 -0
- package/web/dist/assets/bundle-mjs-BT31bpU6.js +1 -0
- package/web/dist/assets/centered-state-duPW0phQ.js +43 -0
- package/web/dist/assets/chevron-right-Be4A5TCS.js +1 -0
- package/web/dist/assets/chunk-BO2N2NFS-DE6qKn3r.js +131 -0
- package/web/dist/assets/collapsible-DdcNBdSk.js +1 -0
- package/web/dist/assets/commit-list-CgvN9vec.js +1 -0
- package/web/dist/assets/compare-variants-CQA2nd65.js +1 -0
- package/web/dist/assets/core-BCsw8oQw.js +12 -0
- package/web/dist/assets/css-BsVw1vtW.js +1 -0
- package/web/dist/assets/diff-B6Agp5Hl.js +3 -0
- package/web/dist/assets/diff-stat-BoXuGkgq.js +1 -0
- package/web/dist/assets/diff-view-CD8XI-fj.js +6 -0
- package/web/dist/assets/diff-woXpYk--.js +1 -0
- package/web/dist/assets/dropdown-menu-B3SYw-k5.js +1 -0
- package/web/dist/assets/editable-title-B-hjp5wl.js +1 -0
- package/web/dist/assets/ellipsis-vertical-BYwzw0xl.js +1 -0
- package/web/dist/assets/engine-javascript-FQvzRocB.js +141 -0
- package/web/dist/assets/file-BRj5eISx.js +1 -0
- package/web/dist/assets/folder-z4oT5981.js +1 -0
- package/web/dist/assets/git-toolbar-owSEkYld.js +1 -0
- package/web/dist/assets/github-Bz2VgRX3.js +1 -0
- package/web/dist/assets/go-rLFTqkRN.js +1 -0
- package/web/dist/assets/highlighted-body-OFNGDK62-BL-MfFgl.js +1 -0
- package/web/dist/assets/highlighter-CdHqIwFr.js +3 -0
- package/web/dist/assets/html-BY76lXLH.js +1 -0
- package/web/dist/assets/image-preview-h3WFluuy.js +1 -0
- package/web/dist/assets/index-BbcQNT92.css +2 -0
- package/web/dist/assets/index-EtQQQ6Kj.js +7 -0
- package/web/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/web/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/web/dist/assets/javascript-BgS3c2Ky.js +1 -0
- package/web/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/web/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/web/dist/assets/json-qhed-kSA.js +1 -0
- package/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
- package/web/dist/assets/jsx-Bz0zcwM4.js +1 -0
- package/web/dist/assets/lib-BQXq3kEf.js +1 -0
- package/web/dist/assets/lib-BxQXEXDF.js +1 -0
- package/web/dist/assets/markdown-BYOwaDjH.js +1 -0
- package/web/dist/assets/markdown-DqBKYPiB.js +2 -0
- package/web/dist/assets/mermaid-GHXKKRXX-C4jxqUUb.js +1 -0
- package/web/dist/assets/new-task-form-BdJKRBJX.js +1 -0
- package/web/dist/assets/pill-BQfmfpYp.js +1 -0
- package/web/dist/assets/project-router-DxgFZY1l.js +1 -0
- package/web/dist/assets/prompt-templates-B6m16gq-.js +15 -0
- package/web/dist/assets/python-gzcpVVnB.js +1 -0
- package/web/dist/assets/react-runtime-CCIEwYL0.js +9 -0
- package/web/dist/assets/refresh-cw-mhSpxf2a.js +1 -0
- package/web/dist/assets/repo-git-CUNRxR3_.js +1 -0
- package/web/dist/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/dist/assets/run-diff-DsmmDVfx.js +3 -0
- package/web/dist/assets/run-header-BkhrseLJ.js +1 -0
- package/web/dist/assets/rust-Cfkwpbl8.js +1 -0
- package/web/dist/assets/search-x-BqDMB2g8.js +1 -0
- package/web/dist/assets/shellscript-CLZ0U2zV.js +1 -0
- package/web/dist/assets/skill-empty-hint-BWEvTggc.js +1 -0
- package/web/dist/assets/skills-9oR_oHse.js +1 -0
- package/web/dist/assets/skills-DwIxnnWO.js +1 -0
- package/web/dist/assets/sparkles-DIoTQpyx.js +1 -0
- package/web/dist/assets/sql-BsFa4tDR.js +1 -0
- package/web/dist/assets/square-terminal-Cc7CuQxc.js +1 -0
- package/web/dist/assets/tab-link-D1fQgpmO.js +1 -0
- package/web/dist/assets/task-changes-BKeLlDpK.js +1 -0
- package/web/dist/assets/task-commits-gcEFZIa5.js +1 -0
- package/web/dist/assets/task-files-BGAqoXTW.js +2 -0
- package/web/dist/assets/task-thread-DT8aUYTS.js +9 -0
- package/web/dist/assets/textarea-BOVbfy5C.js +1 -0
- package/web/dist/assets/thread-loading-CypW73KD.js +1 -0
- package/web/dist/assets/toml-CcmNWLt0.js +1 -0
- package/web/dist/assets/trash-2-CJq6LHWn.js +1 -0
- package/web/dist/assets/triangle-alert-CjDFvU27.js +1 -0
- package/web/dist/assets/tsx-udAQXfEw.js +1 -0
- package/web/dist/assets/typescript-bsJCZSQ-.js +1 -0
- package/web/dist/assets/upload-CPDZlJeK.js +1 -0
- package/web/dist/assets/use-desktop-5JsLmi0a.js +1 -0
- package/web/dist/assets/use-submit-shortcut-CHVFevty.js +1 -0
- package/web/dist/assets/utils-DiO6zyJd.js +64 -0
- package/web/dist/assets/workflows-rQDFzWRt.js +11 -0
- package/web/dist/assets/yaml-rwi0_p6S.js +1 -0
- package/web/dist/assets/zoomable-image-COWqb11v.js +1 -0
- package/web/dist/index.html +80 -0
- package/web/dist/open-mercato.svg +11 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { randomInt } from 'node:crypto';
|
|
3
|
+
import { isRunnerId } from '../core/agent-runner.js';
|
|
4
|
+
import { detectEnvironment } from '../core/backend-detect.js';
|
|
5
|
+
import { CANCEL, } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Platform-agnostic step helpers. The star is `sudoStep`: the wizard runs as a
|
|
8
|
+
* normal account and never escalates silently. It prints the exact command,
|
|
9
|
+
* lets the operator run it via `sudo` or run it themselves, then proves the box
|
|
10
|
+
* is actually in the expected state with `verify()` before advancing — and
|
|
11
|
+
* offers a redo when verification fails.
|
|
12
|
+
*/
|
|
13
|
+
/** Real command runner (Node child_process). */
|
|
14
|
+
export const defaultRunner = {
|
|
15
|
+
capture(program, args, opts) {
|
|
16
|
+
// spawn (not execFile) so a secret can be fed via stdin instead of argv.
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const child = spawn(program, args, { stdio: ['pipe', 'pipe', 'pipe'] });
|
|
19
|
+
let stdout = '';
|
|
20
|
+
let stderr = '';
|
|
21
|
+
child.stdout?.on('data', (d) => (stdout += String(d)));
|
|
22
|
+
child.stderr?.on('data', (d) => (stderr += String(d)));
|
|
23
|
+
child.on('error', () => resolve({ code: 127, stdout, stderr }));
|
|
24
|
+
child.on('close', (code) => resolve({ code: code ?? 0, stdout, stderr }));
|
|
25
|
+
// A child that exits before draining stdin makes the write emit EPIPE;
|
|
26
|
+
// swallow it so `capture` never crashes the CLI.
|
|
27
|
+
child.stdin?.on('error', () => { });
|
|
28
|
+
if (opts?.input != null)
|
|
29
|
+
child.stdin?.end(opts.input);
|
|
30
|
+
else
|
|
31
|
+
child.stdin?.end();
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
interactive(program, args, opts) {
|
|
35
|
+
return new Promise((resolve) => {
|
|
36
|
+
// With `input`, stdin is piped (sudo still prompts on /dev/tty, not stdin).
|
|
37
|
+
// `env` adds variables for in-child `$VAR` expansion — the other secret
|
|
38
|
+
// channel besides stdin that keeps values out of argv.
|
|
39
|
+
const child = spawn(program, args, {
|
|
40
|
+
stdio: [opts?.input != null ? 'pipe' : 'inherit', 'inherit', 'inherit'],
|
|
41
|
+
env: opts?.env ? { ...process.env, ...opts.env } : undefined,
|
|
42
|
+
});
|
|
43
|
+
child.on('error', () => resolve(127));
|
|
44
|
+
child.on('close', (code) => resolve(code ?? 0));
|
|
45
|
+
if (opts?.input != null) {
|
|
46
|
+
child.stdin?.on('error', () => { }); // EPIPE if the child exits early
|
|
47
|
+
child.stdin?.end(opts.input);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
/** Run a probe and assert its result. Returns false in dry-run (nothing is verifiably present). */
|
|
53
|
+
export async function verifyCommand(ctx, program, args, matcher = (r) => r.code === 0) {
|
|
54
|
+
if (ctx.dryRun)
|
|
55
|
+
return false;
|
|
56
|
+
return matcher(await ctx.runner.capture(program, args));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* True when `sudo -n true` succeeds — the box grants passwordless sudo, OR a
|
|
60
|
+
* sudo timestamp from an earlier command in this session is still cached.
|
|
61
|
+
* Both mean "sudo will run right now without prompting", which is exactly the
|
|
62
|
+
* question `--yes` mode needs answered before choosing sudo over delegate.
|
|
63
|
+
*/
|
|
64
|
+
export async function hasPasswordlessSudo(ctx) {
|
|
65
|
+
if (ctx.dryRun)
|
|
66
|
+
return false;
|
|
67
|
+
return (await ctx.runner.capture('sudo', ['-n', 'true'])).code === 0;
|
|
68
|
+
}
|
|
69
|
+
/** A bare DNS hostname — no scheme, no path, no shell/nginx metacharacters. */
|
|
70
|
+
export const HOSTNAME_RE = /^(?=.{1,253}$)([a-z0-9](-?[a-z0-9])*\.)+[a-z]{2,}$/i;
|
|
71
|
+
export class StepCancelled extends Error {
|
|
72
|
+
}
|
|
73
|
+
export class StepAborted extends Error {
|
|
74
|
+
}
|
|
75
|
+
/** Thrown from an optional step's `run()` to record it as `skipped` (e.g. certbot DNS not ready). */
|
|
76
|
+
export class StepSkipped extends Error {
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* A strong random cockpit password: guaranteed to mix lower/upper letters, a
|
|
80
|
+
* digit and a symbol, drawn from a crypto RNG, with visually-ambiguous glyphs
|
|
81
|
+
* (0/O/1/l/I) removed. Offered by the identity step so operators don't fall back
|
|
82
|
+
* to a weak hand-picked password.
|
|
83
|
+
*/
|
|
84
|
+
export function generatePassword(length = 16) {
|
|
85
|
+
const lower = 'abcdefghijkmnpqrstuvwxyz'; // no l
|
|
86
|
+
const upper = 'ABCDEFGHJKLMNPQRSTUVWXYZ'; // no I, O
|
|
87
|
+
const digits = '23456789'; // no 0, 1
|
|
88
|
+
const symbols = '!@#$%^&*-_=+';
|
|
89
|
+
const all = lower + upper + digits + symbols;
|
|
90
|
+
const pick = (set) => set.charAt(randomInt(set.length));
|
|
91
|
+
const chars = [pick(lower), pick(upper), pick(digits), pick(symbols)];
|
|
92
|
+
while (chars.length < Math.max(length, 8))
|
|
93
|
+
chars.push(pick(all));
|
|
94
|
+
// Fisher–Yates shuffle so the guaranteed-class chars aren't always in front.
|
|
95
|
+
for (let i = chars.length - 1; i > 0; i--) {
|
|
96
|
+
const j = randomInt(i + 1);
|
|
97
|
+
const tmp = chars[i];
|
|
98
|
+
chars[i] = chars[j];
|
|
99
|
+
chars[j] = tmp;
|
|
100
|
+
}
|
|
101
|
+
return chars.join('');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Execute one privileged command with the operator in the loop:
|
|
105
|
+
* print → run-via-sudo OR delegate → verify → redo-on-mismatch.
|
|
106
|
+
*
|
|
107
|
+
* - Dry-run: prints the intended command and returns (no exec, no verify).
|
|
108
|
+
* - `--yes` with passwordless sudo: runs non-interactively.
|
|
109
|
+
* - `--yes` without passwordless sudo: falls back to delegate (never blocks on a hidden prompt).
|
|
110
|
+
*
|
|
111
|
+
* Throws `StepCancelled` if the user cancels, `StepAborted` if they give up after a failed verify.
|
|
112
|
+
*/
|
|
113
|
+
/** Single-quote a shell string so a copy-paste of `display` runs exactly what we run. */
|
|
114
|
+
export function shquote(s) {
|
|
115
|
+
return `'${s.replace(/'/g, `'\\''`)}'`;
|
|
116
|
+
}
|
|
117
|
+
export async function sudoStep(ctx, opts) {
|
|
118
|
+
const { ui } = ctx;
|
|
119
|
+
// What we actually run — and what the operator copy-pastes in the delegate path.
|
|
120
|
+
const display = `sudo bash -lc ${shquote(opts.command)}`;
|
|
121
|
+
if (ctx.dryRun) {
|
|
122
|
+
ui.info(opts.input != null
|
|
123
|
+
? `DRY RUN — would run: ${display} (with the ${opts.inputLabel ?? 'payload'} on stdin)`
|
|
124
|
+
: `DRY RUN — would run: ${display}`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const passwordless = await hasPasswordlessSudo(ctx);
|
|
128
|
+
for (;;) {
|
|
129
|
+
ui.info(opts.description);
|
|
130
|
+
if (opts.note)
|
|
131
|
+
ui.message(opts.note);
|
|
132
|
+
ui.message(display);
|
|
133
|
+
let mode;
|
|
134
|
+
if (ctx.assumeYes) {
|
|
135
|
+
mode = passwordless ? 'sudo' : 'delegate';
|
|
136
|
+
}
|
|
137
|
+
else if (ctx.prefs.sudoMode) {
|
|
138
|
+
// Remembered from an earlier answer — don't ask again this run (issue #6).
|
|
139
|
+
mode = ctx.prefs.sudoMode;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Default to "I'll run it myself as root" — the safe, no-surprise choice
|
|
143
|
+
// for operators who prefer to paste privileged commands into a root shell.
|
|
144
|
+
const choice = await ui.select({
|
|
145
|
+
message: 'How should this privileged command run?',
|
|
146
|
+
options: [
|
|
147
|
+
{ value: 'delegate', label: "I'll run it myself as root", hint: 'paste & run as root, then confirm' },
|
|
148
|
+
{ value: 'sudo', label: 'Run it now via sudo', hint: 'streams output here' },
|
|
149
|
+
],
|
|
150
|
+
initialValue: 'delegate',
|
|
151
|
+
});
|
|
152
|
+
if (choice === CANCEL)
|
|
153
|
+
throw new StepCancelled();
|
|
154
|
+
mode = choice;
|
|
155
|
+
ctx.prefs.sudoMode = choice; // reuse this choice for every later privileged command
|
|
156
|
+
}
|
|
157
|
+
if (mode === 'sudo') {
|
|
158
|
+
const code = await ctx.runner.interactive('sudo', ['bash', '-lc', opts.command], opts.input != null ? { input: opts.input } : undefined);
|
|
159
|
+
if (code !== 0)
|
|
160
|
+
ui.warn(`command exited with code ${code}`);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
ui.info('Copy the command above and run it as root on the server (paste into a root shell, or prefix with sudo), then confirm below.');
|
|
164
|
+
if (opts.input != null) {
|
|
165
|
+
// Screen-only: pasted as stdin it stays out of argv AND shell history.
|
|
166
|
+
ui.info(`The command reads from stdin — after starting it, paste this ${opts.inputLabel ?? 'line'} and press Ctrl-D:`);
|
|
167
|
+
ui.message(opts.input);
|
|
168
|
+
}
|
|
169
|
+
if (!ctx.assumeYes) {
|
|
170
|
+
const done = await ui.confirm({ message: 'Have you run it as root?', initialValue: true });
|
|
171
|
+
if (done === CANCEL)
|
|
172
|
+
throw new StepCancelled();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (await opts.verify(ctx)) {
|
|
176
|
+
ui.success('Verified.');
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
ui.error('That did not take effect — the verification check still fails.');
|
|
180
|
+
if (ctx.assumeYes) {
|
|
181
|
+
throw opts.skippable
|
|
182
|
+
? new StepSkipped(`verification failed for: ${opts.command}`)
|
|
183
|
+
: new StepAborted(`verification failed for: ${opts.command}`);
|
|
184
|
+
}
|
|
185
|
+
if (opts.skippable) {
|
|
186
|
+
const next = await ui.select({
|
|
187
|
+
message: 'That did not verify. What now?',
|
|
188
|
+
options: [
|
|
189
|
+
{ value: 'retry', label: 'Try again' },
|
|
190
|
+
{ value: 'skip', label: 'Skip this step', hint: opts.skipHint },
|
|
191
|
+
],
|
|
192
|
+
initialValue: 'retry',
|
|
193
|
+
});
|
|
194
|
+
if (next === CANCEL)
|
|
195
|
+
throw new StepCancelled();
|
|
196
|
+
if (next === 'skip')
|
|
197
|
+
throw new StepSkipped(`skipped: ${opts.command}`);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const redo = await ui.confirm({ message: 'Try again?', initialValue: true });
|
|
201
|
+
if (redo === CANCEL || redo === false)
|
|
202
|
+
throw new StepAborted(`gave up on: ${opts.command}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/** Convenience: an `owned` file/service/etc. artifact. */
|
|
206
|
+
export function owned(type, fields) {
|
|
207
|
+
return { kind: 'owned', type, ...fields };
|
|
208
|
+
}
|
|
209
|
+
/** Convenience: a `shared` artifact (listed, not removed, on uninstall). */
|
|
210
|
+
export function shared(type, fields) {
|
|
211
|
+
return { kind: 'shared', type, ...fields };
|
|
212
|
+
}
|
|
213
|
+
export function depCheckStep(opts = {}) {
|
|
214
|
+
const detect = opts.detect ?? detectEnvironment;
|
|
215
|
+
const install = opts.installTool ?? aptInstallTool;
|
|
216
|
+
const hintFor = opts.removeHint ?? removeHintFor;
|
|
217
|
+
return {
|
|
218
|
+
id: 'deps',
|
|
219
|
+
title: 'Dependencies (agent CLIs + gh)',
|
|
220
|
+
async check(ctx) {
|
|
221
|
+
if (ctx.dryRun)
|
|
222
|
+
return false;
|
|
223
|
+
const checks = await detect();
|
|
224
|
+
// Satisfied when at least one agent CLI is present and authed. Derived from RUNNER_IDS,
|
|
225
|
+
// never a literal list: `BackendCheck['name']` also carries the non-agent tools (`gh`,
|
|
226
|
+
// `git`), so the gate has to filter — and a hand-written array silently under-counts the
|
|
227
|
+
// moment a runner is added (a pi-only host reporting "no agent CLI", #387 review).
|
|
228
|
+
return checks.some((c) => isRunnerId(c.name) && c.available);
|
|
229
|
+
},
|
|
230
|
+
async run(ctx) {
|
|
231
|
+
const checks = await detect();
|
|
232
|
+
const missing = checks.filter((c) => !c.available && c.name !== 'git');
|
|
233
|
+
if (missing.length === 0) {
|
|
234
|
+
ctx.ui.success('All dependencies present.');
|
|
235
|
+
return { artifacts: [] };
|
|
236
|
+
}
|
|
237
|
+
const pick = await ctx.ui.multiselect({
|
|
238
|
+
message: 'Missing tools — select the ones to install',
|
|
239
|
+
options: missing.map((c) => ({ value: c.name, label: c.name, hint: c.hint })),
|
|
240
|
+
required: false,
|
|
241
|
+
});
|
|
242
|
+
if (pick === CANCEL)
|
|
243
|
+
throw new StepCancelled();
|
|
244
|
+
const installed = [];
|
|
245
|
+
for (const name of pick) {
|
|
246
|
+
const check = missing.find((c) => c.name === name);
|
|
247
|
+
await install(ctx, name);
|
|
248
|
+
installed.push(shared('package', { name, removeHint: hintFor(name) }));
|
|
249
|
+
if (check?.hint)
|
|
250
|
+
ctx.ui.note(check.hint, `Authorize ${name}`);
|
|
251
|
+
}
|
|
252
|
+
return { artifacts: installed };
|
|
253
|
+
},
|
|
254
|
+
async undo(ctx, created) {
|
|
255
|
+
// Dependencies are `shared` — never auto-removed. List them for the operator.
|
|
256
|
+
const pkgs = created?.artifacts ?? [];
|
|
257
|
+
if (pkgs.length === 0)
|
|
258
|
+
return;
|
|
259
|
+
ctx.ui.note(pkgs.map((a) => a.removeHint ?? a.name ?? '').filter(Boolean).join('\n'), 'These tools were installed for cezar but may be used elsewhere — remove manually if you want them gone');
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const NPM_GLOBAL = {
|
|
264
|
+
claude: '@anthropic-ai/claude-code',
|
|
265
|
+
codex: '@openai/codex',
|
|
266
|
+
};
|
|
267
|
+
/** Ubuntu/Debian installer: apt for gh, sudo npm -g for the agent CLIs (system node). */
|
|
268
|
+
export const aptInstallTool = async (ctx, name) => {
|
|
269
|
+
if (name === 'gh') {
|
|
270
|
+
await sudoStep(ctx, {
|
|
271
|
+
description: 'Install the GitHub CLI (only needed for PR creation).',
|
|
272
|
+
command: 'apt-get update && apt-get install -y gh',
|
|
273
|
+
verify: (c) => verifyCommand(c, 'gh', ['--version']),
|
|
274
|
+
});
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
await installViaNpmOrNote(ctx, name, true);
|
|
278
|
+
};
|
|
279
|
+
/** macOS installer: brew (no sudo) for gh, npm -g for the agent CLIs. */
|
|
280
|
+
export const brewInstallTool = async (ctx, name) => {
|
|
281
|
+
if (name === 'gh') {
|
|
282
|
+
if (ctx.dryRun) {
|
|
283
|
+
ctx.ui.info('DRY RUN — would run: brew install gh');
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
await ctx.runner.interactive('brew', ['install', 'gh']);
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
await installViaNpmOrNote(ctx, name, false);
|
|
290
|
+
};
|
|
291
|
+
async function installViaNpmOrNote(ctx, name, sudo) {
|
|
292
|
+
if (name === 'opencode') {
|
|
293
|
+
ctx.ui.note('Install OpenCode from https://opencode.ai, then re-run.', 'opencode');
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const pkg = NPM_GLOBAL[name];
|
|
297
|
+
if (!pkg) {
|
|
298
|
+
ctx.ui.warn(`no known installer for ${name} — install it manually`);
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
if (sudo) {
|
|
302
|
+
await sudoStep(ctx, {
|
|
303
|
+
description: `Install ${name} globally via npm.`,
|
|
304
|
+
command: `npm install -g ${pkg}`,
|
|
305
|
+
verify: (c) => verifyCommand(c, name, ['--version']),
|
|
306
|
+
});
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (ctx.dryRun) {
|
|
310
|
+
ctx.ui.info(`DRY RUN — would run: npm install -g ${pkg}`);
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
await ctx.runner.interactive('npm', ['install', '-g', pkg]);
|
|
314
|
+
}
|
|
315
|
+
function removeHintFor(name) {
|
|
316
|
+
const npm = {
|
|
317
|
+
claude: 'npm rm -g @anthropic-ai/claude-code',
|
|
318
|
+
codex: 'npm rm -g @openai/codex',
|
|
319
|
+
};
|
|
320
|
+
if (name === 'gh')
|
|
321
|
+
return 'sudo apt-get remove -y gh';
|
|
322
|
+
return npm[name] ?? `# remove ${name} manually`;
|
|
323
|
+
}
|
|
324
|
+
/** macOS-flavored removal hints (brew instead of apt). */
|
|
325
|
+
export function brewRemoveHint(name) {
|
|
326
|
+
const npm = {
|
|
327
|
+
claude: 'npm rm -g @anthropic-ai/claude-code',
|
|
328
|
+
codex: 'npm rm -g @openai/codex',
|
|
329
|
+
};
|
|
330
|
+
if (name === 'gh')
|
|
331
|
+
return 'brew uninstall gh';
|
|
332
|
+
return npm[name] ?? `# remove ${name} manually`;
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/server-install/steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type PlatformId, type PlatformStrategy } from './types.ts';
|
|
2
|
+
export declare function getStrategy(id: string): PlatformStrategy | undefined;
|
|
3
|
+
/** Ids that actually have a registered strategy (a subset of PLATFORM_IDS while phased). */
|
|
4
|
+
export declare function availablePlatformIds(): PlatformId[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { macosxNgrok } from './platforms/macosx-ngrok.js';
|
|
2
|
+
import { ubuntuVps } from './platforms/ubuntu-vps.js';
|
|
3
|
+
import { PLATFORM_IDS } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Platform registry. `--platform <id>` is validated against these keys; an
|
|
6
|
+
* unknown id lists the valid ones and exits 1. Add a strategy here to teach the
|
|
7
|
+
* wizard a new platform — the engine and helpers are untouched.
|
|
8
|
+
*/
|
|
9
|
+
const REGISTRY = {
|
|
10
|
+
'ubuntu-vps': ubuntuVps,
|
|
11
|
+
'macosx-ngrok': macosxNgrok,
|
|
12
|
+
};
|
|
13
|
+
export function getStrategy(id) {
|
|
14
|
+
return REGISTRY[id];
|
|
15
|
+
}
|
|
16
|
+
/** Ids that actually have a registered strategy (a subset of PLATFORM_IDS while phased). */
|
|
17
|
+
export function availablePlatformIds() {
|
|
18
|
+
return PLATFORM_IDS.filter((id) => REGISTRY[id] !== undefined);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=strategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/server-install/strategies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,YAAY,EAA0C,MAAM,YAAY,CAAC;AAElF;;;;GAIG;AACH,MAAM,QAAQ,GAAkD;IAC9D,YAAY,EAAE,SAAS;IACvB,cAAc,EAAE,WAAW;CAC5B,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,QAAQ,CAAC,EAAgB,CAAC,CAAC;AACpC,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Contracts for the server installer (spec 2026-07-16-server-installer).
|
|
4
|
+
* The engine closes over `InstallStep` / `PlatformStrategy` and never learns
|
|
5
|
+
* what a step *does* — only `check` / `run` / `undo`. That seam is what makes
|
|
6
|
+
* "use ubuntu as a selector and run it that way" a registry lookup, and what
|
|
7
|
+
* makes the interactive helpers reusable across every future platform.
|
|
8
|
+
*/
|
|
9
|
+
/** The platforms the registry knows. Extend here + add a strategy file. */
|
|
10
|
+
export declare const PLATFORM_IDS: readonly ['ubuntu-vps', 'macosx-ngrok'];
|
|
11
|
+
export type PlatformId = (typeof PLATFORM_IDS)[number];
|
|
12
|
+
/** Per-step lifecycle. `failed` resumes identically to `pending`. */
|
|
13
|
+
export declare const STEP_STATUSES: readonly ['pending', 'done', 'skipped', 'failed'];
|
|
14
|
+
export type StepStatus = (typeof STEP_STATUSES)[number];
|
|
15
|
+
/**
|
|
16
|
+
* One thing a step created, tagged by who owns its removal:
|
|
17
|
+
* - `owned` — cezar authored it and nothing else uses it → uninstall removes it.
|
|
18
|
+
* - `shared` — a system tool the operator may now depend on (gh, agent CLIs,
|
|
19
|
+
* certbot + its renewal timer, the cert itself) → uninstall lists it with a
|
|
20
|
+
* manual removal hint instead of yanking it.
|
|
21
|
+
*/
|
|
22
|
+
export declare const stepArtifactSchema: z.ZodObject<{
|
|
23
|
+
kind: z.ZodEnum<{
|
|
24
|
+
owned: "owned";
|
|
25
|
+
shared: "shared";
|
|
26
|
+
}>;
|
|
27
|
+
type: z.ZodString;
|
|
28
|
+
path: z.ZodOptional<z.ZodString>;
|
|
29
|
+
name: z.ZodOptional<z.ZodString>;
|
|
30
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
31
|
+
removeHint: z.ZodOptional<z.ZodString>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export type StepArtifact = z.infer<typeof stepArtifactSchema>;
|
|
34
|
+
/** What a step returns from `run()`; `undo()` receives it back verbatim. */
|
|
35
|
+
export declare const stepCreatedSchema: z.ZodNullable<z.ZodObject<{
|
|
36
|
+
artifacts: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
37
|
+
kind: z.ZodEnum<{
|
|
38
|
+
owned: "owned";
|
|
39
|
+
shared: "shared";
|
|
40
|
+
}>;
|
|
41
|
+
type: z.ZodString;
|
|
42
|
+
path: z.ZodOptional<z.ZodString>;
|
|
43
|
+
name: z.ZodOptional<z.ZodString>;
|
|
44
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
45
|
+
removeHint: z.ZodOptional<z.ZodString>;
|
|
46
|
+
}, z.core.$strip>>>;
|
|
47
|
+
}, z.core.$strip>>;
|
|
48
|
+
export type StepCreated = z.infer<typeof stepCreatedSchema>;
|
|
49
|
+
/**
|
|
50
|
+
* Persisted per-step outcome — the `steps` map in `server.json`. A status this
|
|
51
|
+
* version doesn't know (written by a newer cezar) degrades to `failed`, which
|
|
52
|
+
* keeps the record AND keeps it on uninstall's undo path — never to a parse
|
|
53
|
+
* failure that would discard the whole ledger.
|
|
54
|
+
*/
|
|
55
|
+
export declare const stepOutcomeSchema: z.ZodObject<{
|
|
56
|
+
status: z.ZodCatch<z.ZodEnum<{
|
|
57
|
+
done: "done";
|
|
58
|
+
failed: "failed";
|
|
59
|
+
pending: "pending";
|
|
60
|
+
skipped: "skipped";
|
|
61
|
+
}>>;
|
|
62
|
+
created: z.ZodCatch<z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
63
|
+
artifacts: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
64
|
+
kind: z.ZodEnum<{
|
|
65
|
+
owned: "owned";
|
|
66
|
+
shared: "shared";
|
|
67
|
+
}>;
|
|
68
|
+
type: z.ZodString;
|
|
69
|
+
path: z.ZodOptional<z.ZodString>;
|
|
70
|
+
name: z.ZodOptional<z.ZodString>;
|
|
71
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
72
|
+
removeHint: z.ZodOptional<z.ZodString>;
|
|
73
|
+
}, z.core.$strip>>>;
|
|
74
|
+
}, z.core.$strip>>>>;
|
|
75
|
+
}, z.core.$strip>;
|
|
76
|
+
export type StepOutcome = z.infer<typeof stepOutcomeSchema>;
|
|
77
|
+
/**
|
|
78
|
+
* `~/.cezar/server.json` — host-level, install-once. Additive-safe: every new
|
|
79
|
+
* field is optional / defaulted so an older cezar still parses a newer file
|
|
80
|
+
* (BACKWARD_COMPATIBILITY cross-version-state rule). No secrets live here.
|
|
81
|
+
*/
|
|
82
|
+
export declare const serverStateSchema: z.ZodObject<{
|
|
83
|
+
schema: z.ZodCatch<z.ZodLiteral<1>>;
|
|
84
|
+
platform: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
85
|
+
instance: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
86
|
+
domain: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
87
|
+
externalProxy: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
|
|
88
|
+
bindHost: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
89
|
+
installed: z.ZodCatch<z.ZodDefault<z.ZodBoolean>>;
|
|
90
|
+
dryRun: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
|
|
91
|
+
createdAt: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
92
|
+
updatedAt: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
93
|
+
primaryPort: z.ZodCatch<z.ZodDefault<z.ZodNumber>>;
|
|
94
|
+
publicUrl: z.ZodCatch<z.ZodOptional<z.ZodString>>;
|
|
95
|
+
ephemeral: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
|
|
96
|
+
steps: z.ZodCatch<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodCatch<z.ZodObject<{
|
|
97
|
+
status: z.ZodCatch<z.ZodEnum<{
|
|
98
|
+
done: "done";
|
|
99
|
+
failed: "failed";
|
|
100
|
+
pending: "pending";
|
|
101
|
+
skipped: "skipped";
|
|
102
|
+
}>>;
|
|
103
|
+
created: z.ZodCatch<z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
104
|
+
artifacts: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
105
|
+
kind: z.ZodEnum<{
|
|
106
|
+
owned: "owned";
|
|
107
|
+
shared: "shared";
|
|
108
|
+
}>;
|
|
109
|
+
type: z.ZodString;
|
|
110
|
+
path: z.ZodOptional<z.ZodString>;
|
|
111
|
+
name: z.ZodOptional<z.ZodString>;
|
|
112
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
113
|
+
removeHint: z.ZodOptional<z.ZodString>;
|
|
114
|
+
}, z.core.$strip>>>;
|
|
115
|
+
}, z.core.$strip>>>>;
|
|
116
|
+
}, z.core.$strip>>>>>;
|
|
117
|
+
}, z.core.$loose>;
|
|
118
|
+
export type ServerState = z.infer<typeof serverStateSchema>;
|
|
119
|
+
/** Freshly-initialized state (no install yet). */
|
|
120
|
+
export declare function freshServerState(): ServerState;
|
|
121
|
+
/**
|
|
122
|
+
* The interactive surface a step talks to. Implemented by `ui.ts` over
|
|
123
|
+
* `@clack/prompts`; declared here as a pure interface so `types.ts` (and the
|
|
124
|
+
* engine) never import the TUI library. Prompt methods resolve to the
|
|
125
|
+
* `CANCEL` sentinel instead of throwing when the user aborts.
|
|
126
|
+
*/
|
|
127
|
+
export declare const CANCEL: unique symbol;
|
|
128
|
+
export type Cancellable<T> = T | typeof CANCEL;
|
|
129
|
+
export interface SpinnerHandle {
|
|
130
|
+
start(message?: string): void;
|
|
131
|
+
stop(message?: string): void;
|
|
132
|
+
message(message: string): void;
|
|
133
|
+
}
|
|
134
|
+
export interface Ui {
|
|
135
|
+
intro(message: string): void;
|
|
136
|
+
outro(message: string): void;
|
|
137
|
+
note(message: string, title?: string): void;
|
|
138
|
+
/**
|
|
139
|
+
* Plain, un-boxed output — no border/table drawing. Use for shell commands and
|
|
140
|
+
* other content that a `note()` box would mangle when it wraps (long base64
|
|
141
|
+
* file-writes, certbot lines). Renders verbatim so it stays copy-pasteable.
|
|
142
|
+
*/
|
|
143
|
+
message(message: string): void;
|
|
144
|
+
info(message: string): void;
|
|
145
|
+
success(message: string): void;
|
|
146
|
+
warn(message: string): void;
|
|
147
|
+
error(message: string): void;
|
|
148
|
+
select<T>(opts: {
|
|
149
|
+
message: string;
|
|
150
|
+
options: Array<{
|
|
151
|
+
value: T;
|
|
152
|
+
label: string;
|
|
153
|
+
hint?: string;
|
|
154
|
+
}>;
|
|
155
|
+
initialValue?: T;
|
|
156
|
+
}): Promise<Cancellable<T>>;
|
|
157
|
+
multiselect<T>(opts: {
|
|
158
|
+
message: string;
|
|
159
|
+
options: Array<{
|
|
160
|
+
value: T;
|
|
161
|
+
label: string;
|
|
162
|
+
hint?: string;
|
|
163
|
+
}>;
|
|
164
|
+
required?: boolean;
|
|
165
|
+
}): Promise<Cancellable<T[]>>;
|
|
166
|
+
confirm(opts: {
|
|
167
|
+
message: string;
|
|
168
|
+
initialValue?: boolean;
|
|
169
|
+
}): Promise<Cancellable<boolean>>;
|
|
170
|
+
text(opts: {
|
|
171
|
+
message: string;
|
|
172
|
+
placeholder?: string;
|
|
173
|
+
initialValue?: string;
|
|
174
|
+
validate?: (v: string) => string | undefined;
|
|
175
|
+
}): Promise<Cancellable<string>>;
|
|
176
|
+
password(opts: {
|
|
177
|
+
message: string;
|
|
178
|
+
validate?: (v: string) => string | undefined;
|
|
179
|
+
}): Promise<Cancellable<string>>;
|
|
180
|
+
spinner(): SpinnerHandle;
|
|
181
|
+
}
|
|
182
|
+
/** Result of running a command with captured output. */
|
|
183
|
+
export interface CommandResult {
|
|
184
|
+
code: number;
|
|
185
|
+
stdout: string;
|
|
186
|
+
stderr: string;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Command execution seam. The engine supplies a real implementation; tests
|
|
190
|
+
* inject a fake so `sudoStep` / `verifyCommand` are exercised without touching
|
|
191
|
+
* the host. In `CEZ_DRY_RUN`, side-effecting runs are short-circuited by the
|
|
192
|
+
* step helpers, not the runner.
|
|
193
|
+
*/
|
|
194
|
+
export interface Runner {
|
|
195
|
+
/**
|
|
196
|
+
* Capture stdout/stderr; never throws on non-zero exit (returns the code).
|
|
197
|
+
* `opts.input` is written to the child's stdin — use it to pass secrets
|
|
198
|
+
* (passwords, tokens) so they never appear in the process's argv.
|
|
199
|
+
*/
|
|
200
|
+
capture(program: string, args: string[], opts?: {
|
|
201
|
+
input?: string;
|
|
202
|
+
}): Promise<CommandResult>;
|
|
203
|
+
/**
|
|
204
|
+
* Inherit stdio (streams live output). Resolves with the exit code.
|
|
205
|
+
* `opts.input` pipes the child's stdin instead of inheriting it — the
|
|
206
|
+
* secret-passing channel for privileged commands (`cat > file` style), so
|
|
207
|
+
* credentials never ride in argv where `ps` can read them.
|
|
208
|
+
*/
|
|
209
|
+
interactive(program: string, args: string[], opts?: {
|
|
210
|
+
input?: string;
|
|
211
|
+
env?: Record<string, string>;
|
|
212
|
+
}): Promise<number>;
|
|
213
|
+
}
|
|
214
|
+
/** Live install/uninstall context, threaded through every step. */
|
|
215
|
+
export interface InstallContext {
|
|
216
|
+
state: ServerState;
|
|
217
|
+
ui: Ui;
|
|
218
|
+
runner: Runner;
|
|
219
|
+
/**
|
|
220
|
+
* Instance id (slug) this run targets. `default` (the original single-cockpit
|
|
221
|
+
* flow) keeps every legacy path unchanged; a domain-derived slug suffixes the
|
|
222
|
+
* nginx site, htpasswd, and systemd unit so instances never collide on one
|
|
223
|
+
* host. Steps read this to build their instance-scoped paths.
|
|
224
|
+
*/
|
|
225
|
+
instance: string;
|
|
226
|
+
/** Atomically persist `state` to this instance's `~/.cezar` record. */
|
|
227
|
+
save(): Promise<void>;
|
|
228
|
+
/** CEZ_DRY_RUN — no real sudo, package installs, or network. */
|
|
229
|
+
dryRun: boolean;
|
|
230
|
+
/** `--yes`: auto-accept safe defaults; never invents a sudo password. */
|
|
231
|
+
assumeYes: boolean;
|
|
232
|
+
/** Step ids the user asked to force-rerun via `--reconfigure`. */
|
|
233
|
+
reconfigure: ReadonlySet<string>;
|
|
234
|
+
/** Repo root the autostart service should run `cezar serve` in. */
|
|
235
|
+
repoRoot: string;
|
|
236
|
+
/** ISO timestamp for this run (passed in — Date.now guard). */
|
|
237
|
+
now: string;
|
|
238
|
+
/**
|
|
239
|
+
* Choices remembered for the rest of the run so the wizard stops re-asking.
|
|
240
|
+
* `sudoMode` is set the first time the operator answers the sudo-vs-delegate
|
|
241
|
+
* prompt — once they pick "I'll run it myself as root", every later privileged
|
|
242
|
+
* command reuses that choice instead of prompting again.
|
|
243
|
+
*
|
|
244
|
+
* `cockpit` holds the credentials just set, IN MEMORY ONLY (never persisted to
|
|
245
|
+
* `server.json`), so the final verify step can make a real authenticated
|
|
246
|
+
* request through the proxy. Absent on a resume where the proxy step was
|
|
247
|
+
* already done — the verify step then falls back to structural checks.
|
|
248
|
+
*/
|
|
249
|
+
prefs: {
|
|
250
|
+
sudoMode?: 'sudo' | 'delegate';
|
|
251
|
+
cockpit?: {
|
|
252
|
+
user: string;
|
|
253
|
+
password: string;
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
export interface InstallStep {
|
|
258
|
+
/** Stable — the key in `server.json`. Never rename once it has landed. */
|
|
259
|
+
id: string;
|
|
260
|
+
title: string;
|
|
261
|
+
/** Optional steps (SSL, autostart) can be skipped without failing install. */
|
|
262
|
+
optional?: boolean;
|
|
263
|
+
/** True ⇒ already satisfied, engine skips (unless `--reconfigure` names it). */
|
|
264
|
+
check(ctx: InstallContext): Promise<boolean>;
|
|
265
|
+
/** Do it, interactively. Return what was created (or null). */
|
|
266
|
+
run(ctx: InstallContext): Promise<StepCreated>;
|
|
267
|
+
/** Reverse it, given back the recorded `created`. */
|
|
268
|
+
undo(ctx: InstallContext, created: StepCreated): Promise<void>;
|
|
269
|
+
}
|
|
270
|
+
export interface PlatformStrategy {
|
|
271
|
+
id: PlatformId;
|
|
272
|
+
label: string;
|
|
273
|
+
/** OS / arch / privilege sanity. Throw `PreflightError` to refuse politely. */
|
|
274
|
+
preflight(ctx: InstallContext): Promise<void>;
|
|
275
|
+
/** Ordered steps for this platform. */
|
|
276
|
+
steps(ctx: InstallContext): InstallStep[];
|
|
277
|
+
/**
|
|
278
|
+
* Reload the running cockpit to pick up a new cezar version (a fresh local
|
|
279
|
+
* build or a newly published `cezarion`) — the standardized `server-deploy`
|
|
280
|
+
* entry point. Typically: restart the service + re-verify. Throw `StepAborted`
|
|
281
|
+
* to report a failed deploy.
|
|
282
|
+
*/
|
|
283
|
+
redeploy?(ctx: InstallContext): Promise<void>;
|
|
284
|
+
}
|
|
285
|
+
/** Thrown by `preflight` to stop with a clean, user-facing reason (no stack). */
|
|
286
|
+
export declare class PreflightError extends Error {
|
|
287
|
+
}
|