@wjarka/cezarion 0.15.1 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -46
- package/dist/agent-config/catalog.d.ts +6 -2
- package/dist/agent-config/catalog.js +78 -3
- package/dist/agent-config/catalog.js.map +1 -1
- package/dist/agent-config/model-settings/shared.js +6 -3
- package/dist/agent-config/model-settings/shared.js.map +1 -1
- package/dist/agent-config/models.js +4 -0
- package/dist/agent-config/models.js.map +1 -1
- package/dist/agent-config/validate.js +6 -0
- package/dist/agent-config/validate.js.map +1 -1
- package/dist/artifacts/cli.js +10 -2
- package/dist/artifacts/cli.js.map +1 -1
- package/dist/automations/coordinator.d.ts +7 -0
- package/dist/automations/coordinator.js +22 -2
- package/dist/automations/coordinator.js.map +1 -1
- package/dist/automations/github-poller.d.ts +4 -4
- package/dist/automations/github-poller.js.map +1 -1
- package/dist/automations/schedule-runner.d.ts +130 -0
- package/dist/automations/schedule-runner.js +326 -0
- package/dist/automations/schedule-runner.js.map +1 -0
- package/dist/automations/scheduler.d.ts +38 -7
- package/dist/automations/scheduler.js +90 -22
- package/dist/automations/scheduler.js.map +1 -1
- package/dist/automations/store.d.ts +80 -3
- package/dist/automations/store.js +208 -16
- package/dist/automations/store.js.map +1 -1
- package/dist/automations/task-template.d.ts +42 -6
- package/dist/automations/task-template.js +152 -24
- package/dist/automations/task-template.js.map +1 -1
- package/dist/automations/types.d.ts +142 -6
- package/dist/automations/types.js +64 -6
- package/dist/automations/types.js.map +1 -1
- package/dist/autosave-holders.js +8 -12
- package/dist/autosave-holders.js.map +1 -1
- package/dist/ci-wait/client.d.ts +8 -1
- package/dist/ci-wait/client.js +43 -1
- package/dist/ci-wait/client.js.map +1 -1
- package/dist/ci-wait/controller.d.ts +83 -4
- package/dist/ci-wait/controller.js +76 -11
- package/dist/ci-wait/controller.js.map +1 -1
- package/dist/ci-wait/errors.d.ts +7 -1
- package/dist/ci-wait/errors.js +36 -0
- package/dist/ci-wait/errors.js.map +1 -1
- package/dist/ci-wait/github.d.ts +2 -0
- package/dist/ci-wait/github.js +3 -1
- package/dist/ci-wait/github.js.map +1 -1
- package/dist/ci-wait/mcp.d.ts +2 -98
- package/dist/ci-wait/mcp.js +11 -25
- package/dist/ci-wait/mcp.js.map +1 -1
- package/dist/ci-wait/supervisor.d.ts +2 -1
- package/dist/ci-wait/supervisor.js +2 -1
- package/dist/ci-wait/supervisor.js.map +1 -1
- package/dist/ci-wait/tools.d.ts +307 -0
- package/dist/ci-wait/tools.js +63 -0
- package/dist/ci-wait/tools.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +7 -0
- package/dist/config.js.map +1 -1
- package/dist/contract/agent-config.d.ts +5 -0
- package/dist/contract/agent-profiles.d.ts +15 -0
- package/dist/contract/automation-schedule.d.ts +60 -0
- package/dist/contract/automations.d.ts +208 -36
- package/dist/contract/delegation.d.ts +96 -0
- package/dist/contract/discovery.d.ts +7 -0
- package/dist/contract/github.d.ts +1 -0
- package/dist/contract/health.d.ts +6 -0
- package/dist/contract/index.d.ts +3 -0
- package/dist/contract/index.js +1445 -745
- package/dist/contract/preview.d.ts +508 -0
- package/dist/contract/runs.d.ts +716 -15
- package/dist/contract/skills.d.ts +39 -0
- package/dist/contract/workflows.d.ts +6 -0
- package/dist/contract/workspace.d.ts +65 -0
- package/dist/contract/zoned-time.d.ts +35 -0
- package/dist/core/agent-env.d.ts +11 -0
- package/dist/core/agent-env.js +27 -5
- package/dist/core/agent-env.js.map +1 -1
- package/dist/core/agent-profiles.js +7 -0
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-runner.d.ts +49 -1
- package/dist/core/agent-runner.js +2 -1
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/backend-detect.d.ts +3 -2
- package/dist/core/backend-detect.js +27 -1
- package/dist/core/backend-detect.js.map +1 -1
- package/dist/core/claude-cli-runner.d.ts +1 -0
- package/dist/core/claude-cli-runner.js +69 -19
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/codex-app-server-runner.d.ts +1 -0
- package/dist/core/codex-app-server-runner.js +200 -25
- package/dist/core/codex-app-server-runner.js.map +1 -1
- package/dist/core/codex-app-server-transport.d.ts +7 -3
- package/dist/core/codex-app-server-transport.js +11 -9
- package/dist/core/codex-app-server-transport.js.map +1 -1
- package/dist/core/cursor-acp-runner.d.ts +1 -0
- package/dist/core/cursor-acp-runner.js +24 -9
- package/dist/core/cursor-acp-runner.js.map +1 -1
- package/dist/core/host-model-catalog.js +2 -0
- package/dist/core/host-model-catalog.js.map +1 -1
- package/dist/core/managed-session.js +2 -0
- package/dist/core/managed-session.js.map +1 -1
- package/dist/core/model-identity.js +2 -0
- package/dist/core/model-identity.js.map +1 -1
- package/dist/core/model-presets.js +3 -0
- package/dist/core/model-presets.js.map +1 -1
- package/dist/core/omp-model-catalog.d.ts +43 -0
- package/dist/core/omp-model-catalog.js +205 -0
- package/dist/core/omp-model-catalog.js.map +1 -0
- package/dist/core/omp-runner.d.ts +73 -0
- package/dist/core/omp-runner.js +990 -0
- package/dist/core/omp-runner.js.map +1 -0
- package/dist/core/omp-ui-mapper.d.ts +106 -0
- package/dist/core/omp-ui-mapper.js +882 -0
- package/dist/core/omp-ui-mapper.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +18 -4
- package/dist/core/opencode-server-runner.js +337 -96
- package/dist/core/opencode-server-runner.js.map +1 -1
- package/dist/core/opencode-session-error.d.ts +11 -0
- package/dist/core/opencode-session-error.js +26 -0
- package/dist/core/opencode-session-error.js.map +1 -0
- package/dist/core/opencode-ui-mapper.js +4 -36
- package/dist/core/opencode-ui-mapper.js.map +1 -1
- package/dist/core/pi-runner.d.ts +1 -0
- package/dist/core/pi-runner.js +75 -12
- package/dist/core/pi-runner.js.map +1 -1
- package/dist/core/provider-auth.d.ts +9 -2
- package/dist/core/provider-auth.js +43 -6
- package/dist/core/provider-auth.js.map +1 -1
- package/dist/core/runner-factory.js +3 -0
- package/dist/core/runner-factory.js.map +1 -1
- package/dist/core/runner-model-catalog.js +1 -0
- package/dist/core/runner-model-catalog.js.map +1 -1
- package/dist/core/runner-stderr.d.ts +2 -0
- package/dist/core/runner-stderr.js +20 -0
- package/dist/core/runner-stderr.js.map +1 -0
- package/dist/core/session-process.d.ts +22 -0
- package/dist/core/session-process.js +202 -0
- package/dist/core/session-process.js.map +1 -0
- package/dist/core/ui-events.d.ts +1 -1
- package/dist/core/usage-limit.js +3 -60
- package/dist/core/usage-limit.js.map +1 -1
- package/dist/data-gitignore.d.ts +6 -0
- package/dist/data-gitignore.js +57 -0
- package/dist/data-gitignore.js.map +1 -0
- package/dist/delegation/capacity.d.ts +19 -0
- package/dist/delegation/capacity.js +34 -0
- package/dist/delegation/capacity.js.map +1 -0
- package/dist/delegation/cli.js +13 -4
- package/dist/delegation/cli.js.map +1 -1
- package/dist/delegation/conversations.d.ts +4 -2
- package/dist/delegation/conversations.js +8 -12
- package/dist/delegation/conversations.js.map +1 -1
- package/dist/delegation/credentials.d.ts +2 -0
- package/dist/delegation/credentials.js +10 -0
- package/dist/delegation/credentials.js.map +1 -1
- package/dist/delegation/destroy-observation.d.ts +42 -0
- package/dist/delegation/destroy-observation.js +115 -0
- package/dist/delegation/destroy-observation.js.map +1 -0
- package/dist/delegation/execution-identity.d.ts +6 -0
- package/dist/delegation/execution-identity.js +1 -1
- package/dist/delegation/execution-identity.js.map +1 -1
- package/dist/delegation/policy.d.ts +3 -2
- package/dist/delegation/policy.js +7 -5
- package/dist/delegation/policy.js.map +1 -1
- package/dist/delegation/process-liveness.d.ts +57 -20
- package/dist/delegation/process-liveness.js +114 -92
- package/dist/delegation/process-liveness.js.map +1 -1
- package/dist/delegation/provision.js +6 -6
- package/dist/delegation/provision.js.map +1 -1
- package/dist/delegation/results.js +4 -2
- package/dist/delegation/results.js.map +1 -1
- package/dist/delegation/retry-backoff.d.ts +23 -0
- package/dist/delegation/retry-backoff.js +18 -0
- package/dist/delegation/retry-backoff.js.map +1 -0
- package/dist/delegation/routes.d.ts +64 -58
- package/dist/delegation/scratch-cleanup.d.ts +29 -0
- package/dist/delegation/scratch-cleanup.js +143 -0
- package/dist/delegation/scratch-cleanup.js.map +1 -0
- package/dist/delegation/service.d.ts +20 -1
- package/dist/delegation/service.js +233 -70
- package/dist/delegation/service.js.map +1 -1
- package/dist/delegation/transport.d.ts +12 -6
- package/dist/delegation/workspace.d.ts +23 -4
- package/dist/delegation/workspace.js +147 -31
- package/dist/delegation/workspace.js.map +1 -1
- package/dist/git-worktree-lock-helper.js +8 -3
- package/dist/git-worktree-lock-helper.js.map +1 -1
- package/dist/git-worktree-lock.d.ts +6 -1
- package/dist/git-worktree-lock.js +10 -4
- package/dist/git-worktree-lock.js.map +1 -1
- package/dist/git-worktree-release.d.ts +20 -0
- package/dist/git-worktree-release.js +27 -0
- package/dist/git-worktree-release.js.map +1 -0
- package/dist/git-worktree.d.ts +8 -2
- package/dist/git-worktree.js +19 -2
- package/dist/git-worktree.js.map +1 -1
- package/dist/handoff.d.ts +2 -2
- package/dist/handoff.js +1 -1
- package/dist/index.js +109 -76
- package/dist/index.js.map +1 -1
- package/dist/paths.d.ts +1 -1
- package/dist/paths.js +5 -1
- package/dist/paths.js.map +1 -1
- package/dist/preview/cdp.d.ts +13 -0
- package/dist/preview/cdp.js +69 -0
- package/dist/preview/cdp.js.map +1 -0
- package/dist/preview/chromium.d.ts +75 -0
- package/dist/preview/chromium.js +394 -0
- package/dist/preview/chromium.js.map +1 -0
- package/dist/preview/dev-server.d.ts +68 -0
- package/dist/preview/dev-server.js +341 -0
- package/dist/preview/dev-server.js.map +1 -0
- package/dist/preview/host.d.ts +154 -0
- package/dist/preview/host.js +681 -0
- package/dist/preview/host.js.map +1 -0
- package/dist/preview/registration.d.ts +63 -0
- package/dist/preview/registration.js +109 -0
- package/dist/preview/registration.js.map +1 -0
- package/dist/preview/session.d.ts +73 -0
- package/dist/preview/session.js +347 -0
- package/dist/preview/session.js.map +1 -0
- package/dist/preview/url.d.ts +6 -0
- package/dist/preview/url.js +17 -0
- package/dist/preview/url.js.map +1 -0
- package/dist/runs/agent-tmpdir-removal.d.ts +15 -0
- package/dist/runs/agent-tmpdir-removal.js +60 -0
- package/dist/runs/agent-tmpdir-removal.js.map +1 -0
- package/dist/runs/agent-tmpdir.d.ts +12 -1
- package/dist/runs/agent-tmpdir.js +123 -34
- package/dist/runs/agent-tmpdir.js.map +1 -1
- package/dist/runs/delegation-state.d.ts +5 -1
- package/dist/runs/delegation-state.js +9 -0
- package/dist/runs/delegation-state.js.map +1 -1
- package/dist/runs/event-history.d.ts +4 -4
- package/dist/runs/event-history.js +97 -117
- package/dist/runs/event-history.js.map +1 -1
- package/dist/runs/history-compressor.d.ts +29 -0
- package/dist/runs/history-compressor.js +116 -0
- package/dist/runs/history-compressor.js.map +1 -0
- package/dist/runs/history-file.d.ts +36 -0
- package/dist/runs/history-file.js +463 -0
- package/dist/runs/history-file.js.map +1 -0
- package/dist/runs/human-ask-summary.js +18 -13
- package/dist/runs/human-ask-summary.js.map +1 -1
- package/dist/runs/legacy-index.d.ts +62 -0
- package/dist/runs/legacy-index.js +168 -0
- package/dist/runs/legacy-index.js.map +1 -0
- package/dist/runs/raw-record.d.ts +52 -0
- package/dist/runs/raw-record.js +145 -0
- package/dist/runs/raw-record.js.map +1 -0
- package/dist/runs/retention.d.ts +13 -6
- package/dist/runs/retention.js +42 -13
- package/dist/runs/retention.js.map +1 -1
- package/dist/runs/run-claims.d.ts +23 -0
- package/dist/runs/run-claims.js +24 -0
- package/dist/runs/run-claims.js.map +1 -0
- package/dist/runs/run-database.d.ts +385 -0
- package/dist/runs/run-database.js +930 -0
- package/dist/runs/run-database.js.map +1 -0
- package/dist/runs/run-index.d.ts +35 -9
- package/dist/runs/run-index.js +200 -25
- package/dist/runs/run-index.js.map +1 -1
- package/dist/runs/run-row.d.ts +44 -0
- package/dist/runs/run-row.js +84 -0
- package/dist/runs/run-row.js.map +1 -0
- package/dist/runs/run-search.d.ts +29 -0
- package/dist/runs/run-search.js +63 -0
- package/dist/runs/run-search.js.map +1 -0
- package/dist/runs/store-open-error.d.ts +24 -0
- package/dist/runs/store-open-error.js +61 -0
- package/dist/runs/store-open-error.js.map +1 -0
- package/dist/runs/store.d.ts +667 -32
- package/dist/runs/store.js +2153 -324
- package/dist/runs/store.js.map +1 -1
- package/dist/runs/transcript-facts.d.ts +77 -0
- package/dist/runs/transcript-facts.js +302 -0
- package/dist/runs/transcript-facts.js.map +1 -0
- package/dist/runs/webhook.js +5 -4
- package/dist/runs/webhook.js.map +1 -1
- package/dist/runs/worker-execution.d.ts +22 -0
- package/dist/runs/worker-execution.js +30 -0
- package/dist/runs/worker-execution.js.map +1 -0
- package/dist/server/capabilities.d.ts +1 -0
- package/dist/server/capabilities.js +2 -0
- package/dist/server/capabilities.js.map +1 -1
- package/dist/server/cockpit-ownership.d.ts +8 -0
- package/dist/server/cockpit-ownership.js +19 -0
- package/dist/server/cockpit-ownership.js.map +1 -1
- package/dist/server/forge/github.d.ts +1 -4
- package/dist/server/forge/github.js +47 -23
- package/dist/server/forge/github.js.map +1 -1
- package/dist/server/git.js +1 -1
- package/dist/server/git.js.map +1 -1
- package/dist/server/open-in-app.js +1 -0
- package/dist/server/open-in-app.js.map +1 -1
- package/dist/server/preview-socket.d.ts +36 -0
- package/dist/server/preview-socket.js +126 -0
- package/dist/server/preview-socket.js.map +1 -0
- package/dist/server/project-context.d.ts +31 -4
- package/dist/server/project-context.js +73 -9
- package/dist/server/project-context.js.map +1 -1
- package/dist/server/provider-action-gate.js +1 -0
- package/dist/server/provider-action-gate.js.map +1 -1
- package/dist/server/repo-branches.d.ts +4 -3
- package/dist/server/repo-branches.js +5 -4
- package/dist/server/repo-branches.js.map +1 -1
- package/dist/server/server.d.ts +4500 -2727
- package/dist/server/server.js +651 -202
- package/dist/server/server.js.map +1 -1
- package/dist/server/upgrade-router.d.ts +23 -0
- package/dist/server/upgrade-router.js +53 -0
- package/dist/server/upgrade-router.js.map +1 -0
- package/dist/server/validators.d.ts +6 -1
- package/dist/server/validators.js +4 -4
- package/dist/server/validators.js.map +1 -1
- package/dist/server/ws.d.ts +16 -16
- package/dist/server/ws.js +56 -54
- package/dist/server/ws.js.map +1 -1
- package/dist/skills-remote.d.ts +14 -0
- package/dist/skills-remote.js +91 -15
- package/dist/skills-remote.js.map +1 -1
- package/dist/task-cli/cli.js +40 -16
- package/dist/task-cli/cli.js.map +1 -1
- package/dist/task-cli/discovery.d.ts +4 -3
- package/dist/task-cli/discovery.js +4 -3
- package/dist/task-cli/discovery.js.map +1 -1
- package/dist/task-cli/http.d.ts +2 -0
- package/dist/task-cli/http.js +10 -4
- package/dist/task-cli/http.js.map +1 -1
- package/dist/task-cli/projections.d.ts +5 -2
- package/dist/task-cli/projections.js +13 -0
- package/dist/task-cli/projections.js.map +1 -1
- package/dist/task-cli/watch.d.ts +15 -2
- package/dist/task-cli/watch.js +31 -9
- package/dist/task-cli/watch.js.map +1 -1
- package/dist/ui-state.d.ts +4 -3
- package/dist/ui-state.js +8 -3
- package/dist/ui-state.js.map +1 -1
- package/dist/workflows/grouped-command.d.ts +31 -0
- package/dist/workflows/grouped-command.js +143 -0
- package/dist/workflows/grouped-command.js.map +1 -0
- package/dist/workflows/run.d.ts +223 -42
- package/dist/workflows/run.js +1316 -398
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +12 -0
- package/dist/workflows/types.js +20 -0
- package/dist/workflows/types.js.map +1 -1
- package/dist/workspace/agent-accounts.d.ts +5 -1
- package/dist/workspace/agent-accounts.js +1 -0
- package/dist/workspace/agent-accounts.js.map +1 -1
- package/dist/workspace/agent-profiles.js +1 -1
- package/dist/workspace/agent-profiles.js.map +1 -1
- package/dist/workspace/config.d.ts +3 -1
- package/dist/workspace/config.js +1 -0
- package/dist/workspace/config.js.map +1 -1
- package/dist/worktree-setup.d.ts +85 -0
- package/dist/worktree-setup.js +164 -0
- package/dist/worktree-setup.js.map +1 -0
- package/package.json +7 -5
- package/scripts/benchmark-run-store-fixture.ts +428 -0
- package/scripts/benchmark-run-store.ts +743 -0
- package/scripts/benchmark-stuck-destroys.ts +143 -0
- package/scripts/mock-autonomous.mjs +11 -0
- package/scripts/mock-ci-tool.mjs +20 -5
- package/scripts/mock-claude.mjs +110 -1
- package/scripts/mock-codex-app-server.mjs +117 -2
- package/scripts/mock-codex-coalesce-steer.mjs +59 -0
- package/scripts/mock-codex-reverse-steer.mjs +130 -0
- package/scripts/mock-cursor-acp.mjs +75 -1
- package/scripts/mock-omp-rpc.mjs +605 -0
- package/scripts/mock-opencode-serve.mjs +312 -22
- package/scripts/mock-pi-rpc.mjs +109 -3
- package/scripts/mock-runner-crash.mjs +42 -0
- package/scripts/mock-silent-tail.mjs +78 -0
- package/scripts/mock-turn-messages.mjs +5 -0
- package/scripts/omp-ci-wait.mjs +29 -0
- package/scripts/omp-restrict-delegation.yml +4 -0
- package/scripts/pi-ci-wait.mjs +12 -9
- package/scripts/seed-archive-profile.ts +3 -3
- package/web/dist/assets/agent-accounts-CFOBMVHc.js +1 -0
- package/web/dist/assets/alert-dialog-BrpNUwMt.js +1 -0
- package/web/dist/assets/app-window-CSHwDX9N.js +1 -0
- package/web/dist/assets/button-C_rd7CPp.js +43 -0
- package/web/dist/assets/compare-variants-D6WXhvXA.js +1 -0
- package/web/dist/assets/diff-DrEARXTV.js +3 -0
- package/web/dist/assets/diff-controls-B1-j7nFg.js +1 -0
- package/web/dist/assets/{diff-view-DPn6bQ5W.js → diff-view-DvGLjdTk.js} +3 -3
- package/web/dist/assets/dropdown-menu-BegOZFrj.js +1 -0
- package/web/dist/assets/format-DpNe3S0A.js +1 -0
- package/web/dist/assets/git-toolbar-Cw4ljmhB.js +1 -0
- package/web/dist/assets/github-CfV5sqL0.js +1 -0
- package/web/dist/assets/{image-preview-DJ8cgb1Z.js → image-preview-FOEfqpZP.js} +1 -1
- package/web/dist/assets/index-DgWWlOLy.js +13 -0
- package/web/dist/assets/index-fBFnuvxu.css +1 -0
- package/web/dist/assets/{nav-row-styles-3j64kH5s.js → nav-row-styles-vp2JbhuJ.js} +1 -1
- package/web/dist/assets/play-CmVAj_fu.js +1 -0
- package/web/dist/assets/popover-BohP6WTx.js +1 -0
- package/web/dist/assets/preview-pane-connected-qTA5KNoJ.js +3 -0
- package/web/dist/assets/preview-state-vuMviq6q.js +1 -0
- package/web/dist/assets/prompt-templates-Cubdut_C.js +15 -0
- package/web/dist/assets/repo-git-Cf4t5PD0.js +1 -0
- package/web/dist/assets/{run-diff-5-RRdcVz.js → run-diff-BpkUW37Z.js} +3 -3
- package/web/dist/assets/run-header-68WHf9wV.js +1 -0
- package/web/dist/assets/skills-DiVIgKeU.js +1 -0
- package/web/dist/assets/square-terminal-B6RYYieR.js +1 -0
- package/web/dist/assets/status-dot-CqTJHSP9.js +1 -0
- package/web/dist/assets/{tab-link-K0hjzEXR.js → tab-link-B07Hu4QX.js} +1 -1
- package/web/dist/assets/task-changes--lQF6EYf.js +1 -0
- package/web/dist/assets/task-commits-Cx0qy4DN.js +1 -0
- package/web/dist/assets/task-files-D50s-gKW.js +2 -0
- package/web/dist/assets/task-github-item-DaqmSwYT.js +1 -0
- package/web/dist/assets/task-thread-BPQ64lui.js +7 -0
- package/web/dist/assets/{task-thread-Bw_nQuTx.css → task-thread-zNE2Q9E-.css} +1 -1
- package/web/dist/assets/textarea-D20O4Pw0.js +1 -0
- package/web/dist/assets/thread-state-DWcFMrvb.js +4 -0
- package/web/dist/assets/use-hand-to-agent-state-BLIGmwbd.css +1 -0
- package/web/dist/assets/use-hand-to-agent-state-Cy9eyyfL.js +1 -0
- package/web/dist/assets/{utils-fzNfbPzA.js → utils-JsL3ZsJf.js} +1 -1
- package/web/dist/assets/workflows-jwG7uxqi.js +11 -0
- package/web/dist/assets/{zoomable-image-CDmZ_Rtl.js → zoomable-image-BJJ64KGc.js} +1 -1
- package/web/dist/cezarion-lockup-dark.svg +1 -13
- package/web/dist/cezarion-lockup-light.svg +1 -13
- package/web/dist/cezarion-mark-dark.svg +1 -12
- package/web/dist/cezarion-mark-light.svg +1 -12
- package/web/dist/index.html +16 -21
- package/web/dist/assets/agent-accounts-CU2ZDv24.js +0 -1
- package/web/dist/assets/alert-dialog-C-xYE_dg.js +0 -43
- package/web/dist/assets/chevron-right-BENZ-1ZN.js +0 -1
- package/web/dist/assets/collapsible-DD9J91Iv.js +0 -1
- package/web/dist/assets/compare-variants-5FmqpFSN.js +0 -1
- package/web/dist/assets/diff-controls-Bj0YrioE.js +0 -1
- package/web/dist/assets/diff-rE8rm75J2.js +0 -3
- package/web/dist/assets/diff-stat-BKDCSVfJ.js +0 -1
- package/web/dist/assets/dropdown-menu-Ch5BYQh_.js +0 -1
- package/web/dist/assets/format-dBiNDNVe.js +0 -1
- package/web/dist/assets/git-toolbar-ClVvf5iF.js +0 -1
- package/web/dist/assets/github-BkNOyour.css +0 -1
- package/web/dist/assets/github-DeZMeMwJ.js +0 -1
- package/web/dist/assets/github-item-detail-W5F6GVjF.js +0 -1
- package/web/dist/assets/github-sidebar-model-DcMu-IK2.js +0 -1
- package/web/dist/assets/highlighter-CdHqIwFr.js +0 -3
- package/web/dist/assets/index-CatemBEL.js +0 -8
- package/web/dist/assets/index-MvfD8bZJ.css +0 -1
- package/web/dist/assets/markdown-zdKeLIYA.js +0 -2
- package/web/dist/assets/mobile-run-bar-BCfmFi8V.js +0 -1
- package/web/dist/assets/prompt-templates-CBPp39IU.js +0 -15
- package/web/dist/assets/reference-chip-D6owncJT.js +0 -1
- package/web/dist/assets/repo-git-CtdkZFey.js +0 -1
- package/web/dist/assets/run-header-BcjoDi0W.js +0 -1
- package/web/dist/assets/sheet-ChnYVrp1.js +0 -1
- package/web/dist/assets/skills-C8YKp2vr.js +0 -1
- package/web/dist/assets/task-changes-BW8YdWG8.js +0 -1
- package/web/dist/assets/task-commits-q2kB2y6L.js +0 -1
- package/web/dist/assets/task-files-pPL6_3Cr.js +0 -2
- package/web/dist/assets/task-github-item-BXF5R52U.js +0 -1
- package/web/dist/assets/task-thread-DtkFL3EC.js +0 -10
- package/web/dist/assets/textarea-DxlkE-Yd.js +0 -1
- package/web/dist/assets/token-metrics-DIAjrPlM.js +0 -1
- package/web/dist/assets/use-desktop-CrDny2uG.js +0 -1
- package/web/dist/assets/use-submit-shortcut-KWJsC906.js +0 -1
- package/web/dist/assets/workflows-TmcPEj2K.js +0 -11
- /package/web/dist/assets/{lib-BQXq3kEf2.js → lib-BQXq3kEf.js} +0 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { IncomingMessage } from 'node:http';
|
|
2
|
+
import type { PreviewHost, RunContext } from '../preview/host.ts';
|
|
3
|
+
import { type UpgradeRoute } from './upgrade-router.ts';
|
|
4
|
+
import type { WsUpgradeVerdict } from './ws.ts';
|
|
5
|
+
/**
|
|
6
|
+
* The preview pane's WebSocket (#781, spec 2026-10-02-live-preview-v1 "WebSocket"):
|
|
7
|
+
* `/api/v1/p/:projectId/runs/:id/preview/ws` and the boot alias `/api/v1/runs/:id/preview/ws`.
|
|
8
|
+
* A named exception to the one-socket-per-cockpit rule of the subscription bus: one socket per
|
|
9
|
+
* open pane, carrying that viewer's JPEG frames down and the contract's input vocabulary up.
|
|
10
|
+
*
|
|
11
|
+
* Every refusal happens before the handshake: flag off → 404, the request-origin guard refuses or
|
|
12
|
+
* admits only as untrusted → 403 (a foreign page on another loopback port must never see a task's
|
|
13
|
+
* page), unknown project or run → 404. A run whose worktree is gone completes the handshake and is
|
|
14
|
+
* told so, because that is a state the pane renders (5.15), not an error.
|
|
15
|
+
*/
|
|
16
|
+
export declare const PREVIEW_WS_PATHS: string[];
|
|
17
|
+
export type PreviewSocketHost = Pick<PreviewHost, 'handle' | 'detach'>;
|
|
18
|
+
export type PreviewSocketProject = {
|
|
19
|
+
store: RunContext['store'];
|
|
20
|
+
dataDir: string;
|
|
21
|
+
};
|
|
22
|
+
export interface PreviewSocketDeps {
|
|
23
|
+
/** Absent when `CEZ_PREVIEW` was off at boot: the path answers 404. */
|
|
24
|
+
host?: PreviewSocketHost;
|
|
25
|
+
verify: (req: IncomingMessage) => WsUpgradeVerdict;
|
|
26
|
+
/** `undefined` is the boot project. An unknown or unusable project resolves to undefined. */
|
|
27
|
+
resolveProject: (projectId: string | undefined) => Promise<PreviewSocketProject | undefined>;
|
|
28
|
+
heartbeatMs?: number;
|
|
29
|
+
log?: (line: string) => void;
|
|
30
|
+
}
|
|
31
|
+
export interface PreviewSocket {
|
|
32
|
+
route: UpgradeRoute;
|
|
33
|
+
/** Terminates every open pane socket. Idempotent. */
|
|
34
|
+
close(): void;
|
|
35
|
+
}
|
|
36
|
+
export declare function createPreviewSocket(deps: PreviewSocketDeps): PreviewSocket;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { previewClientMessageSchema } from '../contract/index.js';
|
|
3
|
+
import { WebSocketServer } from 'ws';
|
|
4
|
+
import { previewToolEnabled } from '../ci-wait/tools.js';
|
|
5
|
+
import { PROJECT_ID_RE } from '../workspace/config.js';
|
|
6
|
+
import { matchPath } from './upgrade-router.js';
|
|
7
|
+
/**
|
|
8
|
+
* The preview pane's WebSocket (#781, spec 2026-10-02-live-preview-v1 "WebSocket"):
|
|
9
|
+
* `/api/v1/p/:projectId/runs/:id/preview/ws` and the boot alias `/api/v1/runs/:id/preview/ws`.
|
|
10
|
+
* A named exception to the one-socket-per-cockpit rule of the subscription bus: one socket per
|
|
11
|
+
* open pane, carrying that viewer's JPEG frames down and the contract's input vocabulary up.
|
|
12
|
+
*
|
|
13
|
+
* Every refusal happens before the handshake: flag off → 404, the request-origin guard refuses or
|
|
14
|
+
* admits only as untrusted → 403 (a foreign page on another loopback port must never see a task's
|
|
15
|
+
* page), unknown project or run → 404. A run whose worktree is gone completes the handshake and is
|
|
16
|
+
* told so, because that is a state the pane renders (5.15), not an error.
|
|
17
|
+
*/
|
|
18
|
+
export const PREVIEW_WS_PATHS = ['/api/v1/p/:projectId/runs/:id/preview/ws', '/api/v1/runs/:id/preview/ws'];
|
|
19
|
+
/** Same reaping cadence as the subscription hub. */
|
|
20
|
+
const HEARTBEAT_MS = 30_000;
|
|
21
|
+
/** Input frames are small; a paste through `insertText` is the largest legitimate one. */
|
|
22
|
+
const MAX_PAYLOAD_BYTES = 256 * 1024;
|
|
23
|
+
function reject(socket, status) {
|
|
24
|
+
socket.write(`HTTP/1.1 ${status} ${status === 403 ? 'Forbidden' : 'Not Found'}\r\nconnection: close\r\n\r\n`);
|
|
25
|
+
socket.destroy();
|
|
26
|
+
}
|
|
27
|
+
export function createPreviewSocket(deps) {
|
|
28
|
+
const heartbeatMs = deps.heartbeatMs ?? HEARTBEAT_MS;
|
|
29
|
+
const log = deps.log ?? ((line) => console.warn(line));
|
|
30
|
+
const wss = new WebSocketServer({ noServer: true, maxPayload: MAX_PAYLOAD_BYTES });
|
|
31
|
+
const open = new Set();
|
|
32
|
+
let closed = false;
|
|
33
|
+
const connected = (ws, req, ctx) => {
|
|
34
|
+
open.add(ws);
|
|
35
|
+
let alive = true;
|
|
36
|
+
let warned = false;
|
|
37
|
+
const send = (msg) => {
|
|
38
|
+
if (ws.readyState === 1)
|
|
39
|
+
ws.send(JSON.stringify(msg));
|
|
40
|
+
};
|
|
41
|
+
const viewer = {
|
|
42
|
+
userAgent: req.headers['user-agent'] ?? 'another tab',
|
|
43
|
+
send,
|
|
44
|
+
sendFrame: (buf) => {
|
|
45
|
+
if (ws.readyState === 1)
|
|
46
|
+
ws.send(buf, { binary: true });
|
|
47
|
+
},
|
|
48
|
+
close: (code, reason) => ws.close(code, reason),
|
|
49
|
+
};
|
|
50
|
+
const beat = setInterval(() => {
|
|
51
|
+
if (!alive)
|
|
52
|
+
return ws.terminate();
|
|
53
|
+
alive = false;
|
|
54
|
+
ws.ping();
|
|
55
|
+
}, heartbeatMs);
|
|
56
|
+
beat.unref?.();
|
|
57
|
+
ws.on('pong', () => {
|
|
58
|
+
alive = true;
|
|
59
|
+
});
|
|
60
|
+
ws.on('close', () => {
|
|
61
|
+
clearInterval(beat);
|
|
62
|
+
open.delete(ws);
|
|
63
|
+
if (ctx)
|
|
64
|
+
deps.host?.detach(ctx.runId, viewer);
|
|
65
|
+
});
|
|
66
|
+
// A socket error is followed by `close`; without a listener ws would throw it.
|
|
67
|
+
ws.on('error', () => undefined);
|
|
68
|
+
if (!ctx) {
|
|
69
|
+
send({ t: 'state', stage: 'worktree-removed' });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
ws.on('message', (raw, isBinary) => {
|
|
73
|
+
let parsed;
|
|
74
|
+
try {
|
|
75
|
+
parsed = isBinary ? undefined : JSON.parse(String(raw));
|
|
76
|
+
}
|
|
77
|
+
catch { /* not JSON: dropped below */ }
|
|
78
|
+
const msg = previewClientMessageSchema.safeParse(parsed);
|
|
79
|
+
if (!msg.success) {
|
|
80
|
+
if (!warned)
|
|
81
|
+
log(`preview ${ctx.runId}: dropped an invalid client message`);
|
|
82
|
+
warned = true;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
void deps.host?.handle(ctx, viewer, msg.data).catch(() => undefined);
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
const handle = async (req, socket, head, params) => {
|
|
89
|
+
// The socket may close while the project resolves; ws must not see an unhandled 'error'.
|
|
90
|
+
socket.on('error', () => socket.destroy());
|
|
91
|
+
const host = deps.host;
|
|
92
|
+
if (closed || !host || !previewToolEnabled())
|
|
93
|
+
return reject(socket, 404);
|
|
94
|
+
const verdict = deps.verify(req);
|
|
95
|
+
if (!verdict || !verdict.trusted)
|
|
96
|
+
return reject(socket, 403);
|
|
97
|
+
const { projectId, id } = params;
|
|
98
|
+
if (projectId !== undefined && !PROJECT_ID_RE.test(projectId))
|
|
99
|
+
return reject(socket, 404);
|
|
100
|
+
const project = await deps.resolveProject(projectId).catch(() => undefined);
|
|
101
|
+
const run = id === undefined ? undefined : project?.store.getRun(id);
|
|
102
|
+
if (!project || !run)
|
|
103
|
+
return reject(socket, 404);
|
|
104
|
+
if (socket.destroyed)
|
|
105
|
+
return;
|
|
106
|
+
const ctx = run.worktreePath && existsSync(run.worktreePath)
|
|
107
|
+
? { runId: run.id, title: run.title, worktreePath: run.worktreePath, dataDir: project.dataDir, store: project.store }
|
|
108
|
+
: undefined;
|
|
109
|
+
wss.handleUpgrade(req, socket, head, (ws) => connected(ws, req, ctx));
|
|
110
|
+
};
|
|
111
|
+
return {
|
|
112
|
+
route: {
|
|
113
|
+
match: matchPath(PREVIEW_WS_PATHS),
|
|
114
|
+
handle: (req, socket, head, params) => void handle(req, socket, head, params),
|
|
115
|
+
},
|
|
116
|
+
close() {
|
|
117
|
+
if (closed)
|
|
118
|
+
return;
|
|
119
|
+
closed = true;
|
|
120
|
+
for (const ws of [...open])
|
|
121
|
+
ws.terminate();
|
|
122
|
+
wss.close();
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=preview-socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-socket.js","sourceRoot":"","sources":["../../src/server/preview-socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { AutomationStore } from '../automations/store.ts';
|
|
2
|
+
import type { PreviewHost } from '../preview/host.ts';
|
|
2
3
|
import { RunStore } from '../runs/store.ts';
|
|
3
4
|
import { WorkspaceSemaphore } from '../workspace/semaphore.ts';
|
|
4
5
|
import { RunManager } from '../workflows/run.ts';
|
|
5
|
-
import type
|
|
6
|
+
import { type CockpitOwnership } from './cockpit-ownership.ts';
|
|
6
7
|
/**
|
|
7
8
|
* Per-project server context (spec 2026-07-20-multi-project-workspace,
|
|
8
9
|
* "Project contexts" + "Boot flow"): one `{store, manager, dataDir,
|
|
@@ -59,7 +60,31 @@ export interface ProjectContextDeps {
|
|
|
59
60
|
* When omitted, the map still shares one private instance across the
|
|
60
61
|
* managers it builds (workspace defaults, never refreshed). */
|
|
61
62
|
semaphore?: WorkspaceSemaphore;
|
|
63
|
+
/** The ONE workspace preview host (#781, present under `CEZ_PREVIEW=1`): every project's
|
|
64
|
+
* manager registers against it, because ports are host-global. */
|
|
65
|
+
preview?: PreviewHost;
|
|
66
|
+
/** The cockpit's listening port, for the preview tool's `cezar_port` refusal. */
|
|
67
|
+
cezarPort?: () => number | undefined;
|
|
62
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* A project's preview exits that the store drives (#781, spec 2026-10-02-live-preview-v1):
|
|
71
|
+
* dev servers and browsers a crashed cezar left behind are swept once per data dir per process
|
|
72
|
+
* (always, so turning the flag off after a crash still cleans up; a project removed and re-added
|
|
73
|
+
* is not swept again, and what the live host runs is spared either way), and a deleted run's
|
|
74
|
+
* preview is released with its profile.
|
|
75
|
+
*/
|
|
76
|
+
export declare function armPreview(store: RunStore, dataDir: string, host: PreviewHost | undefined): void;
|
|
77
|
+
/**
|
|
78
|
+
* Boot: the crash leftovers of every registered project, not only the boot project's, so a dev
|
|
79
|
+
* server left in a project nobody opens this session does not hold its port all session. A data
|
|
80
|
+
* dir another live cockpit owns holds that cockpit's servers, not a crash's: it is skipped and
|
|
81
|
+
* left unswept, so this process's own context build (which takes ownership first) sweeps it if
|
|
82
|
+
* that cockpit goes. Resolves with how many processes were killed.
|
|
83
|
+
*/
|
|
84
|
+
export declare function sweepRegisteredPreviewLeftovers(projects: ReadonlyArray<{
|
|
85
|
+
root: string;
|
|
86
|
+
status?: string;
|
|
87
|
+
}>, host: PreviewHost | undefined): Promise<number>;
|
|
63
88
|
export type ProjectContextFailure = 'unknown-project' | 'missing-root';
|
|
64
89
|
/** Typed failure so the route layer can map reasons to statuses (404/409)
|
|
65
90
|
* without string matching. */
|
|
@@ -118,11 +143,13 @@ export declare class ProjectContexts {
|
|
|
118
143
|
/**
|
|
119
144
|
* Tear down one project's context (project removal): the manager stops
|
|
120
145
|
* making moves on its own (`RunManager.dispose()` — usage-sampler
|
|
121
|
-
* unsubscribe, timers, queued state) and the store is closed —
|
|
122
|
-
*
|
|
146
|
+
* unsubscribe, timers, queued state) and the store is closed — pending
|
|
147
|
+
* rows written, its database released, every event-bus subscriber detached. Returns false when
|
|
123
148
|
* nothing was built for `projectId`.
|
|
124
149
|
*/
|
|
125
|
-
dispose(projectId: string
|
|
150
|
+
dispose(projectId: string, opts?: {
|
|
151
|
+
releasePreviews?: boolean;
|
|
152
|
+
}): boolean;
|
|
126
153
|
/** Tear down every built context (process shutdown). */
|
|
127
154
|
disposeAll(): void;
|
|
128
155
|
private build;
|
|
@@ -3,13 +3,59 @@ import { AutomationStore } from '../automations/store.js';
|
|
|
3
3
|
import { reconcileAutomationReceipts } from '../automations/task-template.js';
|
|
4
4
|
import { DEFAULT_WORKTREE_RETENTION, resolveWorktreeRetention } from '../config.js';
|
|
5
5
|
import { pruneOrphans } from '../git-worktree.js';
|
|
6
|
+
import { sweepPreviewLeftovers } from '../preview/dev-server.js';
|
|
6
7
|
import { armRepoHandle } from '../runs/arm-repo-handle.js';
|
|
8
|
+
import { ensureDataGitignore } from '../data-gitignore.js';
|
|
7
9
|
import { reclaimWorktrees } from '../runs/retention.js';
|
|
8
10
|
import { RunStore } from '../runs/store.js';
|
|
9
11
|
import { WorkspaceSemaphore } from '../workspace/semaphore.js';
|
|
10
12
|
import { RunManager } from '../workflows/run.js';
|
|
11
13
|
import { ensureLaunchKey } from './launch-key.js';
|
|
12
14
|
import { getRepoInfo } from './git.js';
|
|
15
|
+
import { ownedByAnotherCockpit } from './cockpit-ownership.js';
|
|
16
|
+
/** Data dirs this process has swept: the sweep cleans up after a crashed cezar, never this one. */
|
|
17
|
+
const sweptPreviewDirs = new Set();
|
|
18
|
+
/** One data dir's crash leftovers, once per process; whatever the live host runs is spared. */
|
|
19
|
+
function sweepPreviewOnce(dataDir, host) {
|
|
20
|
+
if (sweptPreviewDirs.has(dataDir))
|
|
21
|
+
return Promise.resolve(0);
|
|
22
|
+
sweptPreviewDirs.add(dataDir);
|
|
23
|
+
const keep = host
|
|
24
|
+
? (runId, what) => (what === 'browser' ? host.ownsBrowser(runId) : host.ownsServer(runId, what))
|
|
25
|
+
: undefined;
|
|
26
|
+
return sweepPreviewLeftovers(dataDir, { keep }).catch(() => 0);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A project's preview exits that the store drives (#781, spec 2026-10-02-live-preview-v1):
|
|
30
|
+
* dev servers and browsers a crashed cezar left behind are swept once per data dir per process
|
|
31
|
+
* (always, so turning the flag off after a crash still cleans up; a project removed and re-added
|
|
32
|
+
* is not swept again, and what the live host runs is spared either way), and a deleted run's
|
|
33
|
+
* preview is released with its profile.
|
|
34
|
+
*/
|
|
35
|
+
export function armPreview(store, dataDir, host) {
|
|
36
|
+
void sweepPreviewOnce(dataDir, host);
|
|
37
|
+
if (host)
|
|
38
|
+
store.on('deleted', (runId) => void host.release(runId, { deleteProfile: true, dataDir }).catch(() => undefined));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Boot: the crash leftovers of every registered project, not only the boot project's, so a dev
|
|
42
|
+
* server left in a project nobody opens this session does not hold its port all session. A data
|
|
43
|
+
* dir another live cockpit owns holds that cockpit's servers, not a crash's: it is skipped and
|
|
44
|
+
* left unswept, so this process's own context build (which takes ownership first) sweeps it if
|
|
45
|
+
* that cockpit goes. Resolves with how many processes were killed.
|
|
46
|
+
*/
|
|
47
|
+
export async function sweepRegisteredPreviewLeftovers(projects, host) {
|
|
48
|
+
let killed = 0;
|
|
49
|
+
for (const project of projects) {
|
|
50
|
+
if (project.status === 'missing')
|
|
51
|
+
continue;
|
|
52
|
+
const dataDir = join(project.root, '.ai/cezar');
|
|
53
|
+
if (sweptPreviewDirs.has(dataDir) || ownedByAnotherCockpit(dataDir))
|
|
54
|
+
continue;
|
|
55
|
+
killed += await sweepPreviewOnce(dataDir, host);
|
|
56
|
+
}
|
|
57
|
+
return killed;
|
|
58
|
+
}
|
|
13
59
|
/** Typed failure so the route layer can map reasons to statuses (404/409)
|
|
14
60
|
* without string matching. */
|
|
15
61
|
export class ProjectContextError extends Error {
|
|
@@ -123,15 +169,23 @@ export class ProjectContexts {
|
|
|
123
169
|
/**
|
|
124
170
|
* Tear down one project's context (project removal): the manager stops
|
|
125
171
|
* making moves on its own (`RunManager.dispose()` — usage-sampler
|
|
126
|
-
* unsubscribe, timers, queued state) and the store is closed —
|
|
127
|
-
*
|
|
172
|
+
* unsubscribe, timers, queued state) and the store is closed — pending
|
|
173
|
+
* rows written, its database released, every event-bus subscriber detached. Returns false when
|
|
128
174
|
* nothing was built for `projectId`.
|
|
129
175
|
*/
|
|
130
|
-
dispose(projectId) {
|
|
176
|
+
dispose(projectId, opts = {}) {
|
|
131
177
|
const ctx = this.contexts.get(projectId);
|
|
132
178
|
if (!ctx)
|
|
133
179
|
return false;
|
|
134
180
|
this.contexts.delete(projectId);
|
|
181
|
+
// The preview host is process-wide and outlives this context: a removed project's dev servers
|
|
182
|
+
// and browsers go with it (#781). Shutdown leaves that to `PreviewHost.close()`.
|
|
183
|
+
if (opts.releasePreviews !== false && this.deps.preview) {
|
|
184
|
+
// Every run id, not only the held ones: a finished run's dev server may still be up. A run
|
|
185
|
+
// without one is a no-op for the host.
|
|
186
|
+
for (const id of ctx.store.listRunIds())
|
|
187
|
+
void this.deps.preview.release(id).catch(() => undefined);
|
|
188
|
+
}
|
|
135
189
|
this.repoHandleControllers.get(ctx.store)?.abort();
|
|
136
190
|
this.repoHandleControllers.delete(ctx.store);
|
|
137
191
|
this.managerCleanups.get(ctx.manager)?.();
|
|
@@ -142,7 +196,7 @@ export class ProjectContexts {
|
|
|
142
196
|
/** Tear down every built context (process shutdown). */
|
|
143
197
|
disposeAll() {
|
|
144
198
|
for (const id of this.ids())
|
|
145
|
-
this.dispose(id);
|
|
199
|
+
this.dispose(id, { releasePreviews: false });
|
|
146
200
|
}
|
|
147
201
|
async build(projectId) {
|
|
148
202
|
const projects = await this.deps.listProjects();
|
|
@@ -155,12 +209,18 @@ export class ProjectContexts {
|
|
|
155
209
|
await this.deps.ownership?.acquire(dataDir);
|
|
156
210
|
// keepLive + recover() (#367), same as serveCommand: runs that were live
|
|
157
211
|
// when this project's context last existed are re-queued or resumed.
|
|
212
|
+
// A store that cannot open throws `RunStoreOpenError` (#779): nothing is
|
|
213
|
+
// cached, the route answers 409 with why, and the next request opens again.
|
|
214
|
+
// One attempt only: this runs on a live cockpit's event loop. The ignore file comes first: a
|
|
215
|
+
// failed open may already have created the database and the history backups.
|
|
216
|
+
ensureDataGitignore(project.root);
|
|
158
217
|
const store = RunStore.open(dataDir, { keepLive: true });
|
|
159
218
|
const automationStore = this.deps.automationStore?.(project.id, project.root)
|
|
160
219
|
?? AutomationStore.open(dataDir);
|
|
161
220
|
reconcileAutomationReceipts(automationStore, store);
|
|
162
221
|
this.notifyStoreCreated(store);
|
|
163
|
-
|
|
222
|
+
armPreview(store, dataDir, this.deps.preview);
|
|
223
|
+
const manager = new RunManager(store, project.root, { semaphore: this.semaphore, preview: this.deps.preview, cezarPort: this.deps.cezarPort });
|
|
164
224
|
try {
|
|
165
225
|
const cleanup = this.deps.prepareManager?.({ id: project.id, root: project.root, store, manager });
|
|
166
226
|
if (cleanup)
|
|
@@ -170,11 +230,14 @@ export class ProjectContexts {
|
|
|
170
230
|
// best-effort sweeps serveCommand runs for the boot project, gated on the
|
|
171
231
|
// root actually being a git repo.
|
|
172
232
|
if (await getRepoInfo(project.root)) {
|
|
173
|
-
await pruneOrphans(project.root, new Set(store.
|
|
233
|
+
await pruneOrphans(project.root, new Set(store.listRunIds())).catch(() => []);
|
|
174
234
|
const keep = await resolveWorktreeRetention(project.root).catch(() => DEFAULT_WORKTREE_RETENTION);
|
|
175
|
-
await reclaimWorktrees(project.root, store, keep).catch(() => []);
|
|
235
|
+
await reclaimWorktrees(project.root, store, keep, { previewHost: this.deps.preview }).catch(() => []);
|
|
176
236
|
}
|
|
177
237
|
await manager.recover();
|
|
238
|
+
// Archived transcripts left plain (or both-present after a crash) — fire-and-forget,
|
|
239
|
+
// never delays boot (#818).
|
|
240
|
+
store.compressArchivedHistory();
|
|
178
241
|
this.deps.afterRecover?.({ id: project.id, root: project.root, store, manager });
|
|
179
242
|
// Which repository this project IS (#945), so the referenced tier stops adopting another
|
|
180
243
|
// repo's PR/issue as a task's subject. Fire-and-forget on purpose — it costs a `gh` spawn
|
|
@@ -198,10 +261,11 @@ export class ProjectContexts {
|
|
|
198
261
|
}
|
|
199
262
|
}
|
|
200
263
|
}
|
|
201
|
-
/** Shared teardown for built and half-built contexts.
|
|
264
|
+
/** Shared teardown for built and half-built contexts. Closing the store writes what is pending
|
|
265
|
+
* and releases its database connection; a late write to it afterwards saves nothing. */
|
|
202
266
|
function teardown(ctx) {
|
|
203
267
|
ctx.manager.dispose();
|
|
204
|
-
ctx.store.
|
|
268
|
+
ctx.store.close();
|
|
205
269
|
ctx.store.removeAllListeners();
|
|
206
270
|
}
|
|
207
271
|
//# sourceMappingURL=project-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/server/project-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/server/project-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-action-gate.js","sourceRoot":"","sources":["../../src/server/provider-action-gate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAE3E,MAAM,KAAK,GAA+B;IACxC,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,EAAE,EAAE,IAAI;IACR,MAAM,EAAE,QAAQ;
|
|
1
|
+
{"version":3,"file":"provider-action-gate.js","sourceRoot":"","sources":["../../src/server/provider-action-gate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAE3E,MAAM,KAAK,GAA+B;IACxC,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,EAAE,EAAE,IAAI;IACR,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,UAAU,sBAAsB,CACpC,GAAc,EACd,QAAqB;IAErB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC;AAChC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,oBAAoB,CAAC,GAAc;IACjD,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa;QAC/B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,aAAa,CAAC;QACzD,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,OAAO,EAAE,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC;IAE7C,6EAA6E;IAC7E,6EAA6E;IAC7E,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IAElC,2EAA2E;IAC3E,4EAA4E;IAC5E,4BAA4B;IAC5B,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAC1C,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAA+B,EAC/B,QAAgC;IAEhC,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC3E,IAAI,GAAG,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3B,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,2DAA2D,CAAC;QACvF,CAAC;QACD,IAAI,GAAG,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,8EAA8E,CAAC;QAC1G,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BranchPrState, RepoBranchesResponse } from '../contract/index.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { BranchOwner } from '../runs/store.ts';
|
|
3
3
|
import type { LogEntryWithParents } from './git.ts';
|
|
4
4
|
export interface ForgePr {
|
|
5
5
|
number: number;
|
|
@@ -38,7 +38,8 @@ export declare function __clearPrListCacheForTests(): void;
|
|
|
38
38
|
export interface ClassifyInput {
|
|
39
39
|
/** Repository top level (`RepoInfo.root`). */
|
|
40
40
|
root: string;
|
|
41
|
-
|
|
41
|
+
/** Every run that owns a branch (`RunStore.listBranchOwners`): the few fields read here. */
|
|
42
|
+
runs: readonly BranchOwner[];
|
|
42
43
|
/** The run manager's liveness — a run can be live while its record still says `done`. */
|
|
43
44
|
isActive: (runId: string) => boolean;
|
|
44
45
|
/** `config.baseBranch`, when the repo sets one. */
|
|
@@ -101,4 +102,4 @@ export interface LogSource {
|
|
|
101
102
|
* subject names); a squash commit maps its trailing `(#123)` to a run by `pullRequestUrl`.
|
|
102
103
|
* Commits nothing maps stay unattributed — `null` in the returned list, never a guess.
|
|
103
104
|
*/
|
|
104
|
-
export declare function attributeLog(root: string, entries: readonly LogEntryWithParents[], runs: readonly
|
|
105
|
+
export declare function attributeLog(root: string, entries: readonly LogEntryWithParents[], runs: readonly BranchOwner[]): Promise<Array<LogSource | null>>;
|
|
@@ -19,7 +19,7 @@ import { promisify } from 'node:util';
|
|
|
19
19
|
import { z } from 'zod';
|
|
20
20
|
import { isSafeGitRef } from '../git-refs.js';
|
|
21
21
|
import { withWorktreeMutation } from '../git-worktree-lock.js';
|
|
22
|
-
import {
|
|
22
|
+
import { ownedCleanupProtection, parseShortstat } from '../git-worktree.js';
|
|
23
23
|
import { fetchGithubRefStatus, GH_REF_STATUS_MAX, refNumberFromUrl } from './github.js';
|
|
24
24
|
const exec = promisify(execFile);
|
|
25
25
|
function git(cwd, args) {
|
|
@@ -151,9 +151,10 @@ async function checkedOutBranches(root) {
|
|
|
151
151
|
}
|
|
152
152
|
return out;
|
|
153
153
|
}
|
|
154
|
-
/** The branch a run owns: its recorded `branch`, or `cez/<id8>` for an old worktree run
|
|
154
|
+
/** The branch a run owns: its recorded `branch`, or `cez/<id8>` for an old worktree run — the
|
|
155
|
+
* store's `branch` column already says which (`encodeRunRow`). */
|
|
155
156
|
function runBranch(run) {
|
|
156
|
-
return run.branch
|
|
157
|
+
return run.branch;
|
|
157
158
|
}
|
|
158
159
|
function isFinished(run) {
|
|
159
160
|
return FINISHED.has(run.status) || run.archived === true;
|
|
@@ -402,7 +403,7 @@ async function stateKey(input) {
|
|
|
402
403
|
git(input.root, ['worktree', 'list', '--porcelain']),
|
|
403
404
|
]);
|
|
404
405
|
const runs = input.runs.map((r) => [
|
|
405
|
-
r.id, r.status, r.archived, r.branch, r.baseBranch, r.pullRequestUrl, r.title,
|
|
406
|
+
r.id, r.status, r.archived, r.branch, r.baseBranch, r.pullRequestUrl, r.title, input.isActive(r.id),
|
|
406
407
|
]);
|
|
407
408
|
return createHash('sha256')
|
|
408
409
|
.update(JSON.stringify([refs.stdout, worktrees.stdout, input.configuredBase, input.currentBranch, input.hasRemote, runs]))
|