@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,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One retry schedule for the cleanup loops that have no other wake source (hearsay-tools/cezarion#879):
|
|
3
|
+
* worker destroy, terminal scratch and orphaned-generation reprobes. Each stays at its fast cadence
|
|
4
|
+
* for `fastCount` attempts, so a holder that exits soon is noticed soon, then doubles up to `capMs`
|
|
5
|
+
* and stays there. None ever stops: cezar has no exit callback for a process it did not spawn.
|
|
6
|
+
*/
|
|
7
|
+
export type Backoff = {
|
|
8
|
+
fastMs: number;
|
|
9
|
+
fastCount: number;
|
|
10
|
+
capMs: number;
|
|
11
|
+
};
|
|
12
|
+
export declare const DESTROY_BACKOFF: Backoff;
|
|
13
|
+
export declare const SCRATCH_BACKOFF: Backoff;
|
|
14
|
+
/** The orphan reprobe kept 15 s for its first 15 minutes before hearsay-tools/cezarion#879; that window is unchanged. */
|
|
15
|
+
export declare const ORPHAN_BACKOFF: Backoff;
|
|
16
|
+
/** For the batched reprobes: ids that probe together keep probing together, so they share a scan. */
|
|
17
|
+
export declare const noJitter: () => number;
|
|
18
|
+
/** Scheduled destroy attempts after which the cockpit says the cleanup needs attention: the first capped delay. */
|
|
19
|
+
export declare const DESTROY_ATTENTION_ATTEMPTS = 10;
|
|
20
|
+
/** Delay before the next attempt, after `attempt` consecutive failed attempts. Past the fast window
|
|
21
|
+
* the delay is stretched by up to 10 %, never shortened, so stuck items spread out and a capped
|
|
22
|
+
* delay is never under `capMs`. */
|
|
23
|
+
export declare function retryDelayMs(attempt: number, backoff: Backoff, random?: () => number): number;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const DESTROY_BACKOFF = { fastMs: 60_000, fastCount: 5, capMs: 3_600_000 };
|
|
2
|
+
export const SCRATCH_BACKOFF = { fastMs: 60_000, fastCount: 5, capMs: 3_600_000 };
|
|
3
|
+
/** The orphan reprobe kept 15 s for its first 15 minutes before hearsay-tools/cezarion#879; that window is unchanged. */
|
|
4
|
+
export const ORPHAN_BACKOFF = { fastMs: 15_000, fastCount: 60, capMs: 3_600_000 };
|
|
5
|
+
/** For the batched reprobes: ids that probe together keep probing together, so they share a scan. */
|
|
6
|
+
export const noJitter = () => 0;
|
|
7
|
+
/** Scheduled destroy attempts after which the cockpit says the cleanup needs attention: the first capped delay. */
|
|
8
|
+
export const DESTROY_ATTENTION_ATTEMPTS = 10;
|
|
9
|
+
/** Delay before the next attempt, after `attempt` consecutive failed attempts. Past the fast window
|
|
10
|
+
* the delay is stretched by up to 10 %, never shortened, so stuck items spread out and a capped
|
|
11
|
+
* delay is never under `capMs`. */
|
|
12
|
+
export function retryDelayMs(attempt, backoff, random = Math.random) {
|
|
13
|
+
const n = Math.max(0, Math.floor(attempt));
|
|
14
|
+
if (n < backoff.fastCount)
|
|
15
|
+
return backoff.fastMs;
|
|
16
|
+
return Math.min(backoff.capMs, backoff.fastMs * 2 ** (n - backoff.fastCount + 1)) * (1 + 0.1 * random());
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=retry-backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-backoff.js","sourceRoot":"","sources":["../../src/delegation/retry-backoff.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,eAAe,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC3F,MAAM,CAAC,MAAM,eAAe,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC3F,yHAAyH;AACzH,MAAM,CAAC,MAAM,cAAc,GAAY,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC3F,qGAAqG;AACrG,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;AAChC,mHAAmH;AACnH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C;;mCAEmC;AACnC,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAAgB,EAAE,MAAM,GAAiB,IAAI,CAAC,MAAM;IAChG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC;AAC3G,CAAC"}
|
|
@@ -10,7 +10,7 @@ export declare function delegationFailure(error: unknown): {
|
|
|
10
10
|
readonly code: "capacity_limit" | "denied_scope" | "incompatible_state" | "incomplete_cleanup" | "invalid_baseline" | "invalid_input" | "unauthenticated" | "unavailable_diff" | "unavailable_transport";
|
|
11
11
|
readonly error: string;
|
|
12
12
|
readonly modelChoices?: {
|
|
13
|
-
runner: "claude" | "codex" | "cursor" | "opencode" | "pi";
|
|
13
|
+
runner: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi";
|
|
14
14
|
requestedModel: string;
|
|
15
15
|
availableModels: {
|
|
16
16
|
id: string;
|
|
@@ -18,7 +18,7 @@ export declare function delegationFailure(error: unknown): {
|
|
|
18
18
|
description: string;
|
|
19
19
|
effortLevels?: ("high" | "low" | "max" | "medium" | "xhigh")[] | undefined;
|
|
20
20
|
}[];
|
|
21
|
-
otherRunners: ("claude" | "codex" | "cursor" | "opencode" | "pi")[];
|
|
21
|
+
otherRunners: ("claude" | "codex" | "cursor" | "omp" | "opencode" | "pi")[];
|
|
22
22
|
} | undefined;
|
|
23
23
|
};
|
|
24
24
|
readonly status: 400 | 401 | 403 | 409 | 503;
|
|
@@ -34,10 +34,10 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
34
34
|
enabled?: boolean | undefined;
|
|
35
35
|
hint?: string | undefined;
|
|
36
36
|
authFailureId?: string | undefined;
|
|
37
|
-
runner: "claude" | "codex" | "cursor" | "opencode" | "pi";
|
|
37
|
+
runner: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi";
|
|
38
38
|
}[];
|
|
39
39
|
} | {
|
|
40
|
-
runner: "claude" | "codex" | "cursor" | "opencode" | "pi";
|
|
40
|
+
runner: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi";
|
|
41
41
|
models: {
|
|
42
42
|
id: string;
|
|
43
43
|
label: string;
|
|
@@ -55,7 +55,7 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
55
55
|
kind: "runners";
|
|
56
56
|
} | {
|
|
57
57
|
kind: "models";
|
|
58
|
-
runner: "claude" | "codex" | "cursor" | "opencode" | "pi";
|
|
58
|
+
runner: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi";
|
|
59
59
|
};
|
|
60
60
|
};
|
|
61
61
|
};
|
|
@@ -84,10 +84,11 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
84
84
|
id: string;
|
|
85
85
|
})[] | undefined;
|
|
86
86
|
} | undefined;
|
|
87
|
-
backend?: "claude" | "codex" | "cursor" | "opencode" | "pi" | undefined;
|
|
87
|
+
backend?: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi" | undefined;
|
|
88
88
|
model?: string | undefined;
|
|
89
89
|
effort?: string | undefined;
|
|
90
90
|
workflow?: string | undefined;
|
|
91
|
+
skill?: string | undefined;
|
|
91
92
|
};
|
|
92
93
|
};
|
|
93
94
|
};
|
|
@@ -486,6 +487,18 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
486
487
|
} & {
|
|
487
488
|
"/:workerId": {
|
|
488
489
|
$get: {
|
|
490
|
+
output: {
|
|
491
|
+
error: string;
|
|
492
|
+
code?: "invalid_input" | undefined;
|
|
493
|
+
};
|
|
494
|
+
outputFormat: "json";
|
|
495
|
+
status: 400;
|
|
496
|
+
input: {
|
|
497
|
+
param: {
|
|
498
|
+
workerId: string;
|
|
499
|
+
};
|
|
500
|
+
};
|
|
501
|
+
} | {
|
|
489
502
|
output: {
|
|
490
503
|
workerId: string;
|
|
491
504
|
parentRunId: string;
|
|
@@ -500,7 +513,7 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
500
513
|
branch: string;
|
|
501
514
|
baselineSha: string;
|
|
502
515
|
};
|
|
503
|
-
backend?: "claude" | "codex" | "cursor" | "opencode" | "pi" | undefined;
|
|
516
|
+
backend?: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi" | undefined;
|
|
504
517
|
model?: string | undefined;
|
|
505
518
|
inputs?: {
|
|
506
519
|
source: {
|
|
@@ -546,6 +559,11 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
546
559
|
phase: "cleaning" | "complete" | "incomplete" | "requested" | "terminating";
|
|
547
560
|
remaining: ("branch" | "process" | "worktree")[];
|
|
548
561
|
error?: string | undefined;
|
|
562
|
+
retry?: {
|
|
563
|
+
attempts: number;
|
|
564
|
+
nextAt: string;
|
|
565
|
+
needsAttention?: true | undefined;
|
|
566
|
+
} | undefined;
|
|
549
567
|
} | undefined;
|
|
550
568
|
outcome?: {
|
|
551
569
|
workerId: string;
|
|
@@ -562,7 +580,11 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
562
580
|
workerId: string;
|
|
563
581
|
};
|
|
564
582
|
};
|
|
565
|
-
}
|
|
583
|
+
};
|
|
584
|
+
};
|
|
585
|
+
} & {
|
|
586
|
+
"/:workerId/collect": {
|
|
587
|
+
$post: {
|
|
566
588
|
output: {
|
|
567
589
|
error: string;
|
|
568
590
|
code?: "invalid_input" | undefined;
|
|
@@ -573,12 +595,10 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
573
595
|
param: {
|
|
574
596
|
workerId: string;
|
|
575
597
|
};
|
|
598
|
+
} & {
|
|
599
|
+
json: Record<string, never>;
|
|
576
600
|
};
|
|
577
|
-
}
|
|
578
|
-
};
|
|
579
|
-
} & {
|
|
580
|
-
"/:workerId/collect": {
|
|
581
|
-
$post: {
|
|
601
|
+
} | {
|
|
582
602
|
output: {
|
|
583
603
|
workerId: string;
|
|
584
604
|
parentRunId: string;
|
|
@@ -590,7 +610,7 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
590
610
|
partial: boolean;
|
|
591
611
|
settled: boolean;
|
|
592
612
|
error?: string | undefined;
|
|
593
|
-
backend?: "claude" | "codex" | "cursor" | "opencode" | "pi" | undefined;
|
|
613
|
+
backend?: "claude" | "codex" | "cursor" | "omp" | "opencode" | "pi" | undefined;
|
|
594
614
|
model?: string | undefined;
|
|
595
615
|
baselineSha: string;
|
|
596
616
|
workspace: {
|
|
@@ -680,7 +700,11 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
680
700
|
} & {
|
|
681
701
|
json: Record<string, never>;
|
|
682
702
|
};
|
|
683
|
-
}
|
|
703
|
+
};
|
|
704
|
+
};
|
|
705
|
+
} & {
|
|
706
|
+
"/:workerId/steer": {
|
|
707
|
+
$post: {
|
|
684
708
|
output: {
|
|
685
709
|
error: string;
|
|
686
710
|
code?: "invalid_input" | undefined;
|
|
@@ -692,13 +716,11 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
692
716
|
workerId: string;
|
|
693
717
|
};
|
|
694
718
|
} & {
|
|
695
|
-
json:
|
|
719
|
+
json: {
|
|
720
|
+
text: string;
|
|
721
|
+
};
|
|
696
722
|
};
|
|
697
|
-
}
|
|
698
|
-
};
|
|
699
|
-
} & {
|
|
700
|
-
"/:workerId/steer": {
|
|
701
|
-
$post: {
|
|
723
|
+
} | {
|
|
702
724
|
output: {
|
|
703
725
|
workerId: string;
|
|
704
726
|
state: "delivered" | "queued";
|
|
@@ -714,7 +736,11 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
714
736
|
text: string;
|
|
715
737
|
};
|
|
716
738
|
};
|
|
717
|
-
}
|
|
739
|
+
};
|
|
740
|
+
};
|
|
741
|
+
} & {
|
|
742
|
+
"/:workerId/stop": {
|
|
743
|
+
$post: {
|
|
718
744
|
output: {
|
|
719
745
|
error: string;
|
|
720
746
|
code?: "invalid_input" | undefined;
|
|
@@ -726,15 +752,9 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
726
752
|
workerId: string;
|
|
727
753
|
};
|
|
728
754
|
} & {
|
|
729
|
-
json:
|
|
730
|
-
text: string;
|
|
731
|
-
};
|
|
755
|
+
json: Record<string, never>;
|
|
732
756
|
};
|
|
733
|
-
}
|
|
734
|
-
};
|
|
735
|
-
} & {
|
|
736
|
-
"/:workerId/stop": {
|
|
737
|
-
$post: {
|
|
757
|
+
} | {
|
|
738
758
|
output: {
|
|
739
759
|
workerId: string;
|
|
740
760
|
state: "stopping" | "terminated";
|
|
@@ -748,7 +768,11 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
748
768
|
} & {
|
|
749
769
|
json: Record<string, never>;
|
|
750
770
|
};
|
|
751
|
-
}
|
|
771
|
+
};
|
|
772
|
+
};
|
|
773
|
+
} & {
|
|
774
|
+
"/:workerId/destroy": {
|
|
775
|
+
$post: {
|
|
752
776
|
output: {
|
|
753
777
|
error: string;
|
|
754
778
|
code?: "invalid_input" | undefined;
|
|
@@ -762,11 +786,7 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
762
786
|
} & {
|
|
763
787
|
json: Record<string, never>;
|
|
764
788
|
};
|
|
765
|
-
}
|
|
766
|
-
};
|
|
767
|
-
} & {
|
|
768
|
-
"/:workerId/destroy": {
|
|
769
|
-
$post: {
|
|
789
|
+
} | {
|
|
770
790
|
output: {
|
|
771
791
|
workerId: string;
|
|
772
792
|
state: "complete" | "incomplete";
|
|
@@ -789,20 +809,6 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
789
809
|
} & {
|
|
790
810
|
json: Record<string, never>;
|
|
791
811
|
};
|
|
792
|
-
} | {
|
|
793
|
-
output: {
|
|
794
|
-
error: string;
|
|
795
|
-
code?: "invalid_input" | undefined;
|
|
796
|
-
};
|
|
797
|
-
outputFormat: "json";
|
|
798
|
-
status: 400;
|
|
799
|
-
input: {
|
|
800
|
-
param: {
|
|
801
|
-
workerId: string;
|
|
802
|
-
};
|
|
803
|
-
} & {
|
|
804
|
-
json: Record<string, never>;
|
|
805
|
-
};
|
|
806
812
|
} | {
|
|
807
813
|
output: {
|
|
808
814
|
workerId: string;
|
|
@@ -832,13 +838,11 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
832
838
|
"/:workerId/diff": {
|
|
833
839
|
$get: {
|
|
834
840
|
output: {
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
diff: string;
|
|
838
|
-
truncated: boolean;
|
|
841
|
+
error: string;
|
|
842
|
+
code?: "invalid_input" | undefined;
|
|
839
843
|
};
|
|
840
844
|
outputFormat: "json";
|
|
841
|
-
status:
|
|
845
|
+
status: 400;
|
|
842
846
|
input: {
|
|
843
847
|
param: {
|
|
844
848
|
workerId: string;
|
|
@@ -846,11 +850,13 @@ export declare function createDelegationRoutes(service: DelegationService, crede
|
|
|
846
850
|
};
|
|
847
851
|
} | {
|
|
848
852
|
output: {
|
|
849
|
-
|
|
850
|
-
|
|
853
|
+
workerId: string;
|
|
854
|
+
baselineSha: string;
|
|
855
|
+
diff: string;
|
|
856
|
+
truncated: boolean;
|
|
851
857
|
};
|
|
852
858
|
outputFormat: "json";
|
|
853
|
-
status:
|
|
859
|
+
status: 200;
|
|
854
860
|
input: {
|
|
855
861
|
param: {
|
|
856
862
|
workerId: string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { RunStore } from '../runs/store.ts';
|
|
2
|
+
/** Terminal intent lives in the generation checkpoint as well as the run index. Unknown
|
|
3
|
+
* evidence is retained and reprobed, including when the index cannot load the worker.
|
|
4
|
+
* One timer serves every pending id, and a tick shares one `/proc` scan across every id it
|
|
5
|
+
* probes; a retained id backs off to hourly (hearsay-tools/cezarion#879). The batch does not
|
|
6
|
+
* jitter: ids that probe together should keep probing together. */
|
|
7
|
+
export declare class WorkerScratchCleanup {
|
|
8
|
+
private store;
|
|
9
|
+
private dataDir;
|
|
10
|
+
private busy;
|
|
11
|
+
private due;
|
|
12
|
+
private timer?;
|
|
13
|
+
/** The `at` the timer was armed for; with the clock, it decides what a tick takes. */
|
|
14
|
+
private armedFor;
|
|
15
|
+
private ticking;
|
|
16
|
+
private recoveryTimer?;
|
|
17
|
+
private enabled;
|
|
18
|
+
private backoff;
|
|
19
|
+
constructor(store: RunStore, dataDir: string, busy: (id: string) => boolean);
|
|
20
|
+
pause(): void;
|
|
21
|
+
recover(): void;
|
|
22
|
+
/** A cleanup intent: probe now. An id already pending for the same generation keeps its place
|
|
23
|
+
* in the backoff, so a repeated terminal `run` event cannot reset it; a new generation starts over. */
|
|
24
|
+
schedule(id: string): void;
|
|
25
|
+
private arm;
|
|
26
|
+
private wake;
|
|
27
|
+
private tick;
|
|
28
|
+
private probe;
|
|
29
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { agentTmpDirMayExist, removeAgentTmpDir, sweepAgentTmpDirs } from '../runs/agent-tmpdir.js';
|
|
2
|
+
import { workerEvidenceRunIds } from '../runs/worker-execution.js';
|
|
3
|
+
import { sharedCwdScan } from './process-liveness.js';
|
|
4
|
+
import { noJitter, retryDelayMs, SCRATCH_BACKOFF } from './retry-backoff.js';
|
|
5
|
+
/** Terminal intent lives in the generation checkpoint as well as the run index. Unknown
|
|
6
|
+
* evidence is retained and reprobed, including when the index cannot load the worker.
|
|
7
|
+
* One timer serves every pending id, and a tick shares one `/proc` scan across every id it
|
|
8
|
+
* probes; a retained id backs off to hourly (hearsay-tools/cezarion#879). The batch does not
|
|
9
|
+
* jitter: ids that probe together should keep probing together. */
|
|
10
|
+
export class WorkerScratchCleanup {
|
|
11
|
+
store;
|
|
12
|
+
dataDir;
|
|
13
|
+
busy;
|
|
14
|
+
due = new Map();
|
|
15
|
+
timer;
|
|
16
|
+
/** The `at` the timer was armed for; with the clock, it decides what a tick takes. */
|
|
17
|
+
armedFor = 0;
|
|
18
|
+
ticking = false;
|
|
19
|
+
recoveryTimer;
|
|
20
|
+
enabled = true;
|
|
21
|
+
// Private and overridable so tests need not wait out production cadence.
|
|
22
|
+
backoff = SCRATCH_BACKOFF;
|
|
23
|
+
constructor(store, dataDir, busy) {
|
|
24
|
+
this.store = store;
|
|
25
|
+
this.dataDir = dataDir;
|
|
26
|
+
this.busy = busy;
|
|
27
|
+
}
|
|
28
|
+
pause() {
|
|
29
|
+
this.enabled = false;
|
|
30
|
+
clearTimeout(this.timer);
|
|
31
|
+
this.timer = undefined;
|
|
32
|
+
this.due.clear();
|
|
33
|
+
clearTimeout(this.recoveryTimer);
|
|
34
|
+
this.recoveryTimer = undefined;
|
|
35
|
+
}
|
|
36
|
+
recover() {
|
|
37
|
+
// A store that could not open (#779) knows none of its runs: every scratch dir would look orphaned.
|
|
38
|
+
if (this.store.unavailable)
|
|
39
|
+
return;
|
|
40
|
+
this.enabled = true;
|
|
41
|
+
clearTimeout(this.recoveryTimer);
|
|
42
|
+
this.recoveryTimer = undefined;
|
|
43
|
+
const retained = workerEvidenceRunIds(this.dataDir);
|
|
44
|
+
// Only runs that can own scratch matter: the live set, and every worker or quarantined run
|
|
45
|
+
// by id (indexed, nothing decoded, #779). Other finished runs were reaped when they ended.
|
|
46
|
+
const live = this.store.listRuns();
|
|
47
|
+
const owners = [...this.store.listWorkerIds(), ...this.store.listQuarantinedRunIds()];
|
|
48
|
+
for (const id of new Set([...live.map(run => run.id), ...owners, ...(retained ?? [])]))
|
|
49
|
+
this.schedule(id);
|
|
50
|
+
// The sweep independently reserves every private-evidence id, even if the index lost it, and
|
|
51
|
+
// every run another process claims (#779): its live runs are not in this store's live set, and
|
|
52
|
+
// their scratch is theirs.
|
|
53
|
+
sweepAgentTmpDirs(this.dataDir, [...new Set([...live.filter(run => this.busy(run.id) || ['queued', 'running', 'waiting'].includes(run.status)).map(run => run.id), ...owners,
|
|
54
|
+
...this.store.listForeignClaimedRunIds()])]);
|
|
55
|
+
if (!retained) { // failed enumeration must not permanently lose a wake source
|
|
56
|
+
this.recoveryTimer = setTimeout(() => this.recover(), 60_000);
|
|
57
|
+
this.recoveryTimer.unref?.();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** A cleanup intent: probe now. An id already pending for the same generation keeps its place
|
|
61
|
+
* in the backoff, so a repeated terminal `run` event cannot reset it; a new generation starts over. */
|
|
62
|
+
schedule(id) {
|
|
63
|
+
const pending = this.due.get(id);
|
|
64
|
+
if (pending && this.store.readWorkerExecution(id)?.generation === pending.generation)
|
|
65
|
+
return;
|
|
66
|
+
this.arm(id, 0, 0);
|
|
67
|
+
}
|
|
68
|
+
arm(id, attempts, delay, from = Date.now()) {
|
|
69
|
+
this.due.delete(id);
|
|
70
|
+
if (!this.enabled || this.store.unavailable)
|
|
71
|
+
return;
|
|
72
|
+
// The scratch check first: most ids have none, and a finished record is decoded to ask (#779).
|
|
73
|
+
if (!agentTmpDirMayExist(this.dataDir, id))
|
|
74
|
+
return;
|
|
75
|
+
// Another process's run (#779, plan step 3): cleaning up after it is its owner's job, or the
|
|
76
|
+
// job of whoever adopts it once that owner is gone.
|
|
77
|
+
if (this.store.writeRefusal(id))
|
|
78
|
+
return;
|
|
79
|
+
const run = this.store.getRun(id);
|
|
80
|
+
if (run && (['queued', 'running', 'waiting'].includes(run.status) ||
|
|
81
|
+
(run.delegation?.role !== 'worker' && run.delegation?.role !== 'invalid')))
|
|
82
|
+
return;
|
|
83
|
+
// Reconstruct older complete checkpoints while the valid terminal index still exists.
|
|
84
|
+
try {
|
|
85
|
+
this.store.retainWorkerScratchCleanup(id);
|
|
86
|
+
}
|
|
87
|
+
catch { /* retry unreadable evidence */ }
|
|
88
|
+
const proof = this.store.readWorkerExecution(id);
|
|
89
|
+
if (run?.delegation?.role === 'worker' && proof && proof.phase !== 'complete')
|
|
90
|
+
return;
|
|
91
|
+
this.due.set(id, { at: from + delay, attempts, generation: proof?.generation, resourceId: proof?.scratchCleanup?.resourceId });
|
|
92
|
+
if (!this.ticking)
|
|
93
|
+
this.wake();
|
|
94
|
+
}
|
|
95
|
+
wake() {
|
|
96
|
+
clearTimeout(this.timer);
|
|
97
|
+
this.timer = undefined;
|
|
98
|
+
if (!this.enabled || !this.due.size)
|
|
99
|
+
return;
|
|
100
|
+
let next = Infinity;
|
|
101
|
+
for (const { at } of this.due.values())
|
|
102
|
+
next = Math.min(next, at);
|
|
103
|
+
this.armedFor = next;
|
|
104
|
+
this.timer = setTimeout(() => this.tick(), Math.max(0, next - Date.now()));
|
|
105
|
+
this.timer.unref?.();
|
|
106
|
+
}
|
|
107
|
+
tick() {
|
|
108
|
+
this.timer = undefined;
|
|
109
|
+
if (!this.enabled)
|
|
110
|
+
return;
|
|
111
|
+
// Ids due within 5 % of the fast cadence ride along, so near neighbours share the scan, and
|
|
112
|
+
// every id this tick retains is re-armed from the same instant, so they stay together.
|
|
113
|
+
const now = Date.now();
|
|
114
|
+
const dueBy = Math.max(this.armedFor, now) + this.backoff.fastMs / 20;
|
|
115
|
+
const cwds = sharedCwdScan();
|
|
116
|
+
this.ticking = true;
|
|
117
|
+
try {
|
|
118
|
+
for (const [id, pending] of [...this.due])
|
|
119
|
+
if (pending.at <= dueBy)
|
|
120
|
+
this.probe(id, pending, cwds, now);
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
this.ticking = false;
|
|
124
|
+
}
|
|
125
|
+
this.wake();
|
|
126
|
+
}
|
|
127
|
+
probe(id, { attempts, generation, resourceId }, cwds, now) {
|
|
128
|
+
this.due.delete(id);
|
|
129
|
+
const execution = this.store.readWorkerExecution(id);
|
|
130
|
+
// No await between ownership/generation + holder proof and rm. Admission is synchronous
|
|
131
|
+
// too, so a queued stale callback can never touch the next generation's scratch. The
|
|
132
|
+
// shared snapshot is this synchronous tick's: it never outlives a yield.
|
|
133
|
+
try {
|
|
134
|
+
if (generation && resourceId && execution?.generation === generation && !this.busy(id) &&
|
|
135
|
+
this.store.workerScratchResourcesSafe(id, generation, resourceId, cwds))
|
|
136
|
+
removeAgentTmpDir(this.dataDir, id);
|
|
137
|
+
}
|
|
138
|
+
catch { /* Transient evidence/read failures retain the durable intent for another wake. */ }
|
|
139
|
+
// Uncertainty has no age limit or force-delete exit; it backs off instead.
|
|
140
|
+
this.arm(id, attempts + 1, retryDelayMs(attempts, this.backoff, noJitter), now);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=scratch-cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-cleanup.js","sourceRoot":"","sources":["../../src/delegation/scratch-cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,14 +20,28 @@ export declare class DelegationService {
|
|
|
20
20
|
private serial;
|
|
21
21
|
private destroyRetryTimers;
|
|
22
22
|
private destroyRetryInFlight;
|
|
23
|
-
|
|
23
|
+
/** What each pending destroy's last full attempt observed (hearsay-tools/cezarion#879). */
|
|
24
|
+
private destroyObservations;
|
|
25
|
+
/** Each project's common Git dir, resolved once per registration for the change check. */
|
|
26
|
+
private commonDirs;
|
|
27
|
+
private destroyBackoff;
|
|
28
|
+
private destroyAttentionAttempts;
|
|
24
29
|
/** How long destroy waits for proven termination; private and overridable so tests need not wait it out. */
|
|
25
30
|
private terminationTimeoutMs;
|
|
26
31
|
registerProject(project: DelegationProject): () => void;
|
|
27
32
|
private clearDestroyRetries;
|
|
28
33
|
/** Called only after manager recovery, when persisted destroy intents may be retried. */
|
|
29
34
|
armDestroyRetries(projectId: string): void;
|
|
35
|
+
/** Arms the next automatic attempt of a pending destroy. A retry state written before a restart
|
|
36
|
+
* resumes where it was; the fast cadence is the floor, and a little over the cap the ceiling, so
|
|
37
|
+
* a clock that jumped cannot park a destroy for days (hearsay-tools/cezarion#879). */
|
|
30
38
|
private scheduleDestroyRetry;
|
|
39
|
+
/** One automatic attempt. It runs in full only when something its last full attempt observed has
|
|
40
|
+
* changed, or a holder it named has exited; either way it records the attempt and when the next
|
|
41
|
+
* is due, and from the attention threshold on the cockpit says the cleanup needs attention. */
|
|
42
|
+
private destroyTick;
|
|
43
|
+
private commonDir;
|
|
44
|
+
private observeAttempt;
|
|
31
45
|
private context;
|
|
32
46
|
private serialized;
|
|
33
47
|
private target;
|
|
@@ -180,5 +194,10 @@ export declare class DelegationService {
|
|
|
180
194
|
remaining: ("branch" | "process" | "worktree")[];
|
|
181
195
|
error?: string | undefined;
|
|
182
196
|
}>;
|
|
197
|
+
/** An explicit destroy (Clean up, `cez worker destroy`): always a full attempt, and it restarts the
|
|
198
|
+
* backoff, so a timer armed for a later automatic attempt is dropped and re-armed at the fast cadence. */
|
|
183
199
|
private destroySerialized;
|
|
200
|
+
/** One full destroy attempt; the caller holds the worker's serialization key. A manual attempt
|
|
201
|
+
* clears the run's `destroyRetry`, which resets the backoff; a completed destroy drops it. */
|
|
202
|
+
private destroyAttempt;
|
|
184
203
|
}
|