toolroll 0.9.104 → 0.9.105
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +62 -5
- package/README.md +18 -20
- package/dist/accent-colors.js +0 -29
- package/dist/acp-agents.js +0 -3
- package/dist/acp-attest.js +0 -30
- package/dist/acp-check.js +3 -70
- package/dist/acp-client.js +3 -94
- package/dist/acp-inspect.js +1 -20
- package/dist/action-ledger.js +0 -8
- package/dist/activity-line.js +0 -14
- package/dist/actor.js +0 -15
- package/dist/advanced-schema.js +12 -0
- package/dist/advanced-view.js +26 -0
- package/dist/advanced.js +61 -0
- package/dist/agent-board.js +0 -117
- package/dist/agent-fence.js +11 -367
- package/dist/agent-onboard.js +12 -50
- package/dist/agent-pulse.js +5 -38
- package/dist/agent-state-words.js +0 -8
- package/dist/agent-state.js +1 -45
- package/dist/agent-turns.js +3 -17
- package/dist/agentconfig.js +1 -99
- package/dist/agents-board.js +0 -60
- package/dist/agents-live.js +1 -8
- package/dist/api-tokens.js +0 -27
- package/dist/approval-authority.js +0 -59
- package/dist/approval-password.js +0 -10
- package/dist/approval-policy.js +0 -29
- package/dist/approval-rules-ui.js +0 -9
- package/dist/assignment-adapters.js +0 -14
- package/dist/assignment-brief.js +1 -17
- package/dist/assignment-delivery.js +0 -22
- package/dist/assignment-presentation.js +0 -14
- package/dist/assignment-status.js +1 -30
- package/dist/assignment-ui.js +0 -12
- package/dist/assignment.js +17 -139
- package/dist/attest.js +0 -38
- package/dist/audit-cli.js +0 -9
- package/dist/backend.js +0 -59
- package/dist/backup-ui.js +0 -12
- package/dist/backup.js +8 -61
- package/dist/batch-checks.js +0 -20
- package/dist/batch-policy.js +0 -4
- package/dist/beads.js +0 -48
- package/dist/bin.js +0 -8
- package/dist/board.js +1 -36
- package/dist/boot-identity.js +0 -42
- package/dist/bounded-spawn.js +4 -28
- package/dist/brand-mark.js +0 -21
- package/dist/brief-fence.js +0 -16
- package/dist/browser/terminal.css +1 -1
- package/dist/browser/terminal.js +16 -16
- package/dist/browser/workspace.css +2 -2
- package/dist/browser/workspace.js +26 -26
- package/dist/browser-crew.js +0 -8
- package/dist/browser-shell.js +2 -15
- package/dist/browser-workspace.js +6 -30
- package/dist/budget-alerts.js +1 -4
- package/dist/build-review.js +2 -50
- package/dist/builder-restart.js +0 -13
- package/dist/builder.js +21 -1035
- package/dist/canonical-json.js +0 -12
- package/dist/capscan.js +1 -32
- package/dist/card-catalog.js +0 -12
- package/dist/card-cli.js +0 -1
- package/dist/card-render.js +0 -25
- package/dist/card-sources.js +0 -10
- package/dist/chat-acceptance.js +0 -7
- package/dist/chat-actions.js +5 -190
- package/dist/chat-admission.js +0 -7
- package/dist/chat-approval.js +0 -25
- package/dist/chat-ask.js +0 -17
- package/dist/chat-card-part.js +0 -3
- package/dist/chat-card.js +0 -6
- package/dist/chat-channel.js +2 -83
- package/dist/chat-continuity.js +0 -31
- package/dist/chat-controls.js +0 -7
- package/dist/chat-core.js +0 -55
- package/dist/chat-decide.js +2 -153
- package/dist/chat-delivery-state.js +0 -49
- package/dist/chat-delivery.js +2 -143
- package/dist/chat-display.js +0 -2
- package/dist/chat-evidence.js +0 -65
- package/dist/chat-flow.js +0 -72
- package/dist/chat-follow.js +0 -13
- package/dist/chat-inbox.js +0 -34
- package/dist/chat-live-schema.js +0 -14
- package/dist/chat-live.js +2 -87
- package/dist/chat-message-states.js +13 -40
- package/dist/chat-messages.js +0 -153
- package/dist/chat-migration.js +0 -57
- package/dist/chat-polish.js +0 -7
- package/dist/chat-quiet.js +0 -37
- package/dist/chat-review.js +0 -4
- package/dist/chat-rooms.js +0 -22
- package/dist/chat-settings-page.js +0 -4
- package/dist/chat-task-actions.js +0 -7
- package/dist/chat-terms.js +0 -21
- package/dist/chat-voice.js +0 -38
- package/dist/chat-warmth.js +1 -3
- package/dist/check-access.js +0 -30
- package/dist/check-facts.js +2 -62
- package/dist/check-failure.js +0 -98
- package/dist/check-levels-ui.js +4 -10
- package/dist/check-levels.js +3 -35
- package/dist/check-load.js +1 -49
- package/dist/check-only-standing.js +0 -6
- package/dist/check-only.js +0 -22
- package/dist/check-progress.js +0 -32
- package/dist/check-repair.js +2 -35
- package/dist/check-report.js +1 -108
- package/dist/check-stamp.js +0 -20
- package/dist/checkout-cleanup.js +0 -84
- package/dist/checkout-proof.js +1 -13
- package/dist/child-database.js +0 -3
- package/dist/claim.js +4 -508
- package/dist/claude-print.js +0 -10
- package/dist/cli-fast.js +0 -8
- package/dist/cli-help.js +90 -78
- package/dist/cli-http.js +0 -10
- package/dist/cli.js +26 -241
- package/dist/code-extract.js +0 -6
- package/dist/code-map-acts.js +0 -7
- package/dist/code-map-admission.js +2 -26
- package/dist/code-map-build.js +3 -24
- package/dist/code-map-cli.js +0 -4
- package/dist/code-map-main.js +0 -6
- package/dist/code-map-read.js +0 -12
- package/dist/code-map-report.js +0 -9
- package/dist/code-map-shape.js +0 -19
- package/dist/code-map-store.js +0 -26
- package/dist/codex-limits.js +1 -17
- package/dist/coding-context.js +0 -10
- package/dist/coding-handoff.js +0 -14
- package/dist/coding-provider.js +0 -39
- package/dist/coding-shipping-ui.js +0 -1
- package/dist/coding-ui.js +0 -1
- package/dist/coding-update.js +1 -18
- package/dist/coding-workspace.js +0 -27
- package/dist/commit-extract.js +0 -83
- package/dist/connect-cli.js +0 -19
- package/dist/console-chrome.js +1 -34
- package/dist/console-instance.js +2 -91
- package/dist/container-state.js +0 -4
- package/dist/containment.js +2 -105
- package/dist/contract-changes.js +0 -6
- package/dist/contracts/acceptance-terms.js +0 -7
- package/dist/contracts/chat-actions.js +0 -46
- package/dist/contracts/chat-callback-rows.js +0 -8
- package/dist/contracts/chat-card.js +0 -14
- package/dist/contracts/chat-content.js +0 -55
- package/dist/contracts/chat-tables.js +0 -7
- package/dist/contracts/cli.js +0 -59
- package/dist/contracts/coding-activity.js +0 -15
- package/dist/contracts/coding-context.js +0 -15
- package/dist/contracts/coding-handoff.js +0 -11
- package/dist/contracts/coding-workspace.js +0 -14
- package/dist/contracts/console-api.js +1 -54
- package/dist/contracts/contract-test.js +0 -14
- package/dist/contracts/contract.js +0 -48
- package/dist/contracts/decision.js +0 -20
- package/dist/contracts/diff-stat.js +0 -16
- package/dist/contracts/discord-callback.js +0 -9
- package/dist/contracts/flow-card.js +0 -18
- package/dist/contracts/flow-propose.js +0 -8
- package/dist/contracts/flow-send.js +0 -31
- package/dist/contracts/flow.js +0 -112
- package/dist/contracts/gateway-tools.js +0 -22
- package/dist/contracts/handoff.js +0 -22
- package/dist/contracts/integration-metadata.js +0 -39
- package/dist/contracts/lead-context.js +0 -14
- package/dist/contracts/lead-tools.js +0 -49
- package/dist/contracts/mcp-oauth.js +0 -12
- package/dist/contracts/memory-pass.js +0 -21
- package/dist/contracts/model-catalog.js +0 -9
- package/dist/contracts/observation-request.js +0 -11
- package/dist/contracts/plan.js +0 -16
- package/dist/contracts/project-knowledge.js +0 -26
- package/dist/contracts/project-memory.js +0 -16
- package/dist/contracts/project-skills.js +0 -31
- package/dist/contracts/proof.js +0 -23
- package/dist/contracts/provider.js +0 -9
- package/dist/contracts/recipes.js +0 -16
- package/dist/contracts/release-check.js +0 -61
- package/dist/contracts/release-terms.js +0 -27
- package/dist/contracts/retention.js +0 -12
- package/dist/contracts/review-findings.js +0 -13
- package/dist/contracts/route-results.js +0 -15
- package/dist/contracts/route.js +0 -33
- package/dist/contracts/scope.js +0 -29
- package/dist/contracts/scout-report.js +0 -34
- package/dist/contracts/slack-callback.js +0 -11
- package/dist/contracts/sort-answer.js +0 -24
- package/dist/contracts/stage-output.js +0 -46
- package/dist/contracts/storage.js +0 -8
- package/dist/contracts/store-json.js +0 -41
- package/dist/contracts/subagent-turn.js +0 -23
- package/dist/contracts/task-sizing.js +0 -10
- package/dist/contracts/teams-callback.js +0 -7
- package/dist/contracts/telegram-callback.js +0 -27
- package/dist/contracts/trigger-payloads.js +0 -41
- package/dist/contracts/update-journal.js +0 -47
- package/dist/contracts/verification-receipt.js +0 -36
- package/dist/contracts/verification-view.js +0 -15
- package/dist/contracts/youiyoux-request.js +0 -26
- package/dist/control-setup.js +0 -7
- package/dist/control-ui.js +0 -3
- package/dist/controller-service.js +0 -4
- package/dist/controller-supervisor.js +0 -15
- package/dist/converse.js +3 -129
- package/dist/coordinator-proposals.js +1 -6
- package/dist/coordinator.js +0 -65
- package/dist/credentials-ui.js +0 -6
- package/dist/daemon.js +0 -137
- package/dist/database-reclaim.js +0 -3
- package/dist/decision.js +0 -78
- package/dist/demo-chat.js +4 -15
- package/dist/demo-sign-in.js +77 -0
- package/dist/demo.js +5 -194
- package/dist/deploy-gate.js +0 -20
- package/dist/deploy-lock.js +0 -4
- package/dist/deploy-phase.js +0 -22
- package/dist/deploy-rescue.js +0 -21
- package/dist/deprecations.js +0 -12
- package/dist/design/kit.css +9 -6
- package/dist/design/kit.js +2 -33
- package/dist/desktop-access.js +0 -9
- package/dist/desktop-bundle.js +1 -3
- package/dist/desktop-host.js +0 -34
- package/dist/desktop-update-gate.js +0 -8
- package/dist/desktop-update-recovery.js +1 -18
- package/dist/desktop-update.js +2 -48
- package/dist/digest-times.js +0 -2
- package/dist/disclosure.js +0 -5
- package/dist/discord-api.js +0 -6
- package/dist/discord-chat.js +0 -31
- package/dist/discord.js +0 -7
- package/dist/discover.js +0 -50
- package/dist/dispatch.js +61 -60
- package/dist/dispose.js +0 -208
- package/dist/doctor.js +0 -48
- package/dist/easy-start-args.js +7 -7
- package/dist/easy-start.js +32 -45
- package/dist/egress.js +1 -63
- package/dist/email-settings.js +0 -8
- package/dist/envelope.js +50 -86
- package/dist/eval-gate.js +1 -37
- package/dist/eval-hooks.js +0 -120
- package/dist/eval-oracle-main.js +0 -7
- package/dist/eval-oracle.js +3 -42
- package/dist/eval-world.js +1 -23
- package/dist/evals.js +6 -134
- package/dist/evidence-pack.js +0 -29
- package/dist/evidence-pair.js +0 -17
- package/dist/evidence.js +4 -280
- package/dist/exec.js +19 -404
- package/dist/exhaustion.js +0 -30
- package/dist/export-ui.js +0 -7
- package/dist/export.js +1 -38
- package/dist/failing-first.js +0 -6
- package/dist/fallback-schema.js +0 -5
- package/dist/fallback.js +0 -81
- package/dist/fast-start.js +0 -97
- package/dist/fast-terms.js +0 -3
- package/dist/fenced-check-coverage.js +0 -11
- package/dist/findings.js +1 -63
- package/dist/first-run.js +4 -57
- package/dist/first-tasks-child.js +0 -5
- package/dist/flaky-ci.js +1 -24
- package/dist/flaky-cli.js +0 -4
- package/dist/flaky.js +0 -43
- package/dist/fleet-schema.js +0 -11
- package/dist/flow-actions.js +0 -31
- package/dist/flow-browser.js +0 -42
- package/dist/flow-cadence.js +1 -24
- package/dist/flow-card-task.js +0 -11
- package/dist/flow-changed.js +0 -16
- package/dist/flow-code.js +1 -45
- package/dist/flow-draft.js +0 -17
- package/dist/flow-engine.js +2 -76
- package/dist/flow-gallery-ui.js +0 -28
- package/dist/flow-gallery.js +0 -54
- package/dist/flow-insights.js +0 -12
- package/dist/flow-items.js +0 -27
- package/dist/flow-live.js +0 -31
- package/dist/flow-people.js +0 -14
- package/dist/flow-pull-request.js +0 -32
- package/dist/flow-replies.js +0 -9
- package/dist/flow-result-card.js +0 -8
- package/dist/flow-schedule.js +0 -74
- package/dist/flow-scripts.js +0 -13
- package/dist/flow-secrets.js +0 -10
- package/dist/flow-send.js +0 -45
- package/dist/flow-share.js +0 -60
- package/dist/flow-sort.js +1 -24
- package/dist/flow-starters-ui.js +0 -2
- package/dist/flow-starters.js +0 -13
- package/dist/flow-steps.js +0 -80
- package/dist/flow-triggers.js +2 -256
- package/dist/flow-unattended-words.js +0 -13
- package/dist/flow-unattended.js +2 -115
- package/dist/flows-cli.js +2 -36
- package/dist/flows-ui.js +0 -51
- package/dist/flows.js +0 -158
- package/dist/folder-gate.js +0 -21
- package/dist/folder-look.js +0 -42
- package/dist/follow-through-brief.js +0 -6
- package/dist/follow-through-cli.js +0 -5
- package/dist/fonts.js +0 -13
- package/dist/gaps.js +0 -20
- package/dist/gate-failure.js +0 -7
- package/dist/git-floor.js +0 -12
- package/dist/git-incident.js +2 -38
- package/dist/git-views.js +0 -24
- package/dist/git.js +0 -31
- package/dist/github-import.js +0 -22
- package/dist/github-jobs.js +0 -12
- package/dist/google-mail.js +2 -27
- package/dist/grant.js +0 -110
- package/dist/graph.js +0 -108
- package/dist/guides.js +4 -15
- package/dist/handover-note.js +0 -12
- package/dist/health-cli.js +0 -2
- package/dist/home-groups.js +0 -15
- package/dist/html.js +0 -54
- package/dist/install-method.js +0 -12
- package/dist/integrations-ui.js +0 -15
- package/dist/integrations.js +7 -50
- package/dist/invoke.js +1 -381
- package/dist/is-record.js +0 -1
- package/dist/issues.js +0 -48
- package/dist/jsonl-discriminants.js +0 -6
- package/dist/keymap.js +0 -17
- package/dist/keys.js +0 -56
- package/dist/kits-ui.js +0 -3
- package/dist/kits.js +1 -24
- package/dist/knowledge-cli.js +0 -4
- package/dist/knowledge-ui.js +0 -8
- package/dist/landed-cleanup.js +0 -119
- package/dist/laptop-background.js +0 -85
- package/dist/laptop-service.js +0 -67
- package/dist/latency-timeline.js +2 -23
- package/dist/lead-about.js +0 -7
- package/dist/lead-answer-eval.js +0 -39
- package/dist/lead-capabilities.js +0 -19
- package/dist/lead-cli-live.js +0 -22
- package/dist/lead-cli.js +0 -27
- package/dist/lead-commitments.js +1 -27
- package/dist/lead-context.js +2 -42
- package/dist/lead-contract.js +0 -8
- package/dist/lead-doors.js +0 -105
- package/dist/lead-follow.js +0 -41
- package/dist/lead-identity.js +1 -4
- package/dist/lead-latency-schema.js +0 -13
- package/dist/lead-people.js +3 -18
- package/dist/lead-progress.js +0 -12
- package/dist/lead-queue-runtime.js +0 -26
- package/dist/lead-queue.js +0 -35
- package/dist/lead-route.js +0 -33
- package/dist/lead-status.js +0 -37
- package/dist/lead-sweep.js +0 -18
- package/dist/lead-tools.js +0 -160
- package/dist/lead-voice.js +0 -54
- package/dist/lead.js +2 -105
- package/dist/learning-child.js +0 -6
- package/dist/learning-look.js +0 -14
- package/dist/ledger-chain.js +0 -34
- package/dist/ledger-csv.js +0 -2
- package/dist/ledger-view.js +0 -3
- package/dist/lesson-notes.js +0 -56
- package/dist/limits-ui.js +0 -14
- package/dist/link.js +0 -79
- package/dist/live-backup.js +3 -33
- package/dist/live-bus.js +7 -81
- package/dist/live-children-read.js +4 -47
- package/dist/live-children.js +4 -44
- package/dist/live-detail.js +0 -17
- package/dist/live-input.js +5 -68
- package/dist/live-main-read.js +1 -14
- package/dist/live-notes.js +0 -12
- package/dist/live-open.js +1 -23
- package/dist/live-records.js +4 -151
- package/dist/live-reply.js +1 -51
- package/dist/live-terminal.js +12 -111
- package/dist/live.js +4 -130
- package/dist/local-owner-acts.js +0 -53
- package/dist/local-owner.js +2 -93
- package/dist/log.js +0 -8
- package/dist/login-secrets.js +2 -38
- package/dist/machine-check.js +0 -2
- package/dist/machine-identity.js +1 -46
- package/dist/mailbox.js +0 -30
- package/dist/maintenance.js +1 -3
- package/dist/mcp-connect.js +0 -88
- package/dist/mcp-core.js +0 -45
- package/dist/mcp-http.js +0 -13
- package/dist/mcp-oauth.js +0 -37
- package/dist/mcp-person.js +0 -11
- package/dist/mcp.js +3 -73
- package/dist/memory-cli.js +0 -3
- package/dist/memory-pass.js +0 -53
- package/dist/memory-tidy.js +0 -55
- package/dist/memory-use.js +2 -24
- package/dist/merge-checklist.js +21 -29
- package/dist/metrics.js +0 -10
- package/dist/mobile-viewport.js +0 -6
- package/dist/model-catalog.js +1 -33
- package/dist/model-choices.js +9 -84
- package/dist/model-names.js +0 -9
- package/dist/models-cli.js +0 -13
- package/dist/models-ui.js +0 -17
- package/dist/modes.js +0 -35
- package/dist/monitoring-settings.js +2 -27
- package/dist/monitoring-ui.js +2 -14
- package/dist/monitoring.js +2 -38
- package/dist/names.js +0 -39
- package/dist/needs-you.js +7 -70
- package/dist/never-index.js +0 -9
- package/dist/nightly-check.js +0 -74
- package/dist/nightly-github.js +0 -168
- package/dist/notification-delivery.js +0 -3
- package/dist/notification-rows.js +0 -17
- package/dist/oauth-run-token.js +1 -37
- package/dist/observations.js +0 -16
- package/dist/oidc.js +1 -20
- package/dist/onboard.js +4 -57
- package/dist/one-step-chat-schema.js +0 -15
- package/dist/openrouter-models.js +0 -6
- package/dist/operate-remote-arguments.js +0 -17
- package/dist/operate-remote.js +0 -33
- package/dist/operate.js +227 -2326
- package/dist/orphan-sweep.js +3 -37
- package/dist/page-work-contract.js +0 -3
- package/dist/password-bearer.js +1 -11
- package/dist/passwordless.js +0 -3
- package/dist/peek-cli.js +0 -46
- package/dist/peek.js +2 -61
- package/dist/people-audit-ui.js +0 -6
- package/dist/person-proof.js +0 -6
- package/dist/phase-routing.js +8 -183
- package/dist/plain-schema.js +0 -14
- package/dist/plain-words.js +18 -12
- package/dist/plan-auto.js +0 -20
- package/dist/plan-login.js +0 -16
- package/dist/plan.js +0 -68
- package/dist/plane-review.js +0 -56
- package/dist/planner-source.js +0 -96
- package/dist/planner.js +0 -117
- package/dist/policy-ui.js +0 -8
- package/dist/policy.js +0 -47
- package/dist/prepared-evidence.js +0 -5
- package/dist/principal.js +0 -29
- package/dist/probe.js +0 -30
- package/dist/process-custody.js +0 -15
- package/dist/process-liveness.js +0 -32
- package/dist/process-tree.js +3 -29
- package/dist/project-access.js +0 -10
- package/dist/project-admission.js +1 -41
- package/dist/project-cli.js +0 -6
- package/dist/project-concurrency.js +0 -35
- package/dist/project-delete-ui.js +4 -29
- package/dist/project-delete.js +1 -73
- package/dist/project-demo.js +0 -13
- package/dist/project-file.js +0 -2
- package/dist/project-identity.js +0 -41
- package/dist/project-knowledge.js +0 -39
- package/dist/project-learning.js +3 -55
- package/dist/project-memory.js +2 -45
- package/dist/project-outcomes.js +0 -6
- package/dist/project-sandbox.js +0 -23
- package/dist/project-skills.js +0 -12
- package/dist/project-tools.js +6 -184
- package/dist/project.js +0 -48
- package/dist/prompt.js +0 -31
- package/dist/proof.js +0 -220
- package/dist/proposal.js +0 -50
- package/dist/protected-storage-look.js +0 -6
- package/dist/protected-storage.js +1 -84
- package/dist/provider-auth.js +3 -69
- package/dist/provider-capture.js +1 -15
- package/dist/provider-connection.js +0 -8
- package/dist/provider-home.js +0 -25
- package/dist/provider-limits.js +0 -14
- package/dist/provider.js +0 -324
- package/dist/public-access.js +0 -34
- package/dist/public-check.js +0 -16
- package/dist/publish.js +1 -150
- package/dist/pull-request-flow.js +0 -77
- package/dist/pull-request-schema.js +0 -4
- package/dist/pull-request-ui.js +0 -5
- package/dist/pulls.js +0 -80
- package/dist/push.js +5 -89
- package/dist/quick-start.js +1 -23
- package/dist/read-executor-worker.js +0 -1
- package/dist/read-executor.js +0 -10
- package/dist/read-only-request.js +0 -7
- package/dist/recipe-ui.js +0 -6
- package/dist/recipes.js +0 -13
- package/dist/release-adapters.js +6 -214
- package/dist/release-approval.js +0 -74
- package/dist/release-authority.js +0 -42
- package/dist/release-auto.js +0 -142
- package/dist/release-card.js +0 -100
- package/dist/release-carry.js +0 -132
- package/dist/release-ci-hold.js +0 -20
- package/dist/release-cli.js +0 -46
- package/dist/release-coverage.js +0 -16
- package/dist/release-gate.js +0 -30
- package/dist/release-git.js +0 -24
- package/dist/release-links.js +0 -17
- package/dist/release-net.js +0 -42
- package/dist/release-next.js +0 -25
- package/dist/release-recheck.js +0 -89
- package/dist/release-refusal.js +0 -18
- package/dist/release-view.js +0 -5
- package/dist/release.js +7 -341
- package/dist/releases.js +0 -49
- package/dist/remote-audit.js +0 -25
- package/dist/remote-command.js +0 -16
- package/dist/remote-destination.js +5 -26
- package/dist/remote-exec.js +1 -27
- package/dist/remote-main.js +1 -53
- package/dist/remote-run.js +0 -5
- package/dist/remote.js +0 -49
- package/dist/render.js +0 -133
- package/dist/reply-shape.js +0 -85
- package/dist/reply-voice.js +0 -7
- package/dist/report-summary.js +0 -5
- package/dist/reported-usage.js +0 -30
- package/dist/repos.js +9 -62
- package/dist/repository-context.js +1 -24
- package/dist/request-budget-ui.js +0 -4
- package/dist/request-budget.js +0 -23
- package/dist/restart-certification.js +0 -37
- package/dist/result-actions.js +0 -62
- package/dist/result-acts.js +0 -34
- package/dist/result-completion.js +0 -25
- package/dist/result-evidence-readers.js +0 -3
- package/dist/result-follow-ups.js +1 -39
- package/dist/result-review.js +0 -86
- package/dist/result-shots.js +0 -39
- package/dist/retention-ui.js +0 -7
- package/dist/retention.js +2 -46
- package/dist/review-context.js +0 -129
- package/dist/review-evidence.js +0 -4
- package/dist/review-switch.js +1 -7
- package/dist/reviewer.js +0 -35
- package/dist/route-change-check.js +0 -2
- package/dist/route-change.js +0 -16
- package/dist/route-hooks.js +0 -27
- package/dist/route-results.js +2 -58
- package/dist/route-rules.js +1 -106
- package/dist/route-savings.js +0 -36
- package/dist/route-store.js +1 -133
- package/dist/run-closeout.js +2 -50
- package/dist/run-efficiency.js +2 -44
- package/dist/run-ending.js +0 -13
- package/dist/runner-process.js +0 -33
- package/dist/runner.js +17 -189
- package/dist/sample-project.js +2 -27
- package/dist/sandbox-launch.js +4 -25
- package/dist/sandbox-runtime.js +1 -88
- package/dist/scan.js +0 -27
- package/dist/scope.js +4 -567
- package/dist/scout-browser-lock.js +0 -6
- package/dist/scout-browser.js +2 -68
- package/dist/scout-net.js +1 -32
- package/dist/scout-report.js +0 -22
- package/dist/scout.js +1 -116
- package/dist/secret-mint.js +0 -6
- package/dist/serve.js +21 -555
- package/dist/server/agents-computers.js +0 -10
- package/dist/server/agents-live-filed.js +0 -13
- package/dist/server/agents-live-lead.js +0 -19
- package/dist/server/agents-live-room.js +0 -19
- package/dist/server/chat.js +2 -194
- package/dist/server/chrome.js +17 -263
- package/dist/server/console.css +4 -4
- package/dist/server/edge-refusal.js +0 -3
- package/dist/server/flows.js +5 -74
- package/dist/server/guards.js +1 -88
- package/dist/server/handler-registry.js +0 -2
- package/dist/server/home-asks.js +1 -22
- package/dist/server/home.js +1 -30
- package/dist/server/http.js +0 -82
- package/dist/server/in-place.js +0 -15
- package/dist/server/kit-standalone.js +0 -20
- package/dist/server/kit.js +2 -114
- package/dist/server/last-checks.js +0 -2
- package/dist/server/live.js +1 -36
- package/dist/server/merge-ready-view.js +0 -6
- package/dist/server/mutation-key.js +3 -40
- package/dist/server/pages-assets.js +0 -16
- package/dist/server/pages.js +7 -195
- package/dist/server/people-tokens.js +3 -101
- package/dist/server/remote-hooks.js +0 -13
- package/dist/server/remote.js +0 -28
- package/dist/server/render-chat.js +8 -144
- package/dist/server/render-code-map.js +0 -5
- package/dist/server/render-flaky.js +0 -8
- package/dist/server/render-follow-through.js +2 -5
- package/dist/server/render-history.js +2 -34
- package/dist/server/render-new-task.js +2 -29
- package/dist/server/render-pages.js +1 -111
- package/dist/server/render-people.js +2 -46
- package/dist/server/render-projects.js +15 -32
- package/dist/server/render-release.js +1 -14
- package/dist/server/render-results.js +4 -355
- package/dist/server/render-settings.js +0 -15
- package/dist/server/render-tasks.js +13 -493
- package/dist/server/request-context.js +2 -9
- package/dist/server/retired-routes.js +0 -11
- package/dist/server/route-policy.js +0 -3
- package/dist/server/route-table.js +6 -135
- package/dist/server/runtime.js +0 -1
- package/dist/server/session.js +0 -28
- package/dist/server/settings.js +40 -246
- package/dist/server/signup-gate.js +0 -11
- package/dist/server/sweeps.js +0 -6
- package/dist/server/task-views.js +9 -227
- package/dist/server/tasks.js +5 -539
- package/dist/server/terminals.js +2 -46
- package/dist/server/welcome.js +2 -22
- package/dist/server-telemetry.js +0 -9
- package/dist/settings-groups-ui.js +50 -63
- package/dist/settings-kit-script.js +0 -19
- package/dist/settings-kit.js +0 -63
- package/dist/settings-proofs.js +0 -23
- package/dist/setup-guide.js +1 -9
- package/dist/shared-deps.js +9 -84
- package/dist/sign-in-guard.js +0 -27
- package/dist/skills-ui.js +0 -2
- package/dist/skills.js +2 -54
- package/dist/slack-api.js +0 -3
- package/dist/slack-chat.js +0 -25
- package/dist/slack-settings.js +0 -1
- package/dist/slack-socket.js +0 -5
- package/dist/slack.js +0 -4
- package/dist/sleep.js +0 -1
- package/dist/source-key.js +0 -10
- package/dist/spend-report.js +0 -29
- package/dist/spend-ui.js +0 -26
- package/dist/spend.js +0 -40
- package/dist/sqlite-runtime.js +0 -2
- package/dist/sqlite-telemetry.js +0 -9
- package/dist/sso-settings.js +0 -13
- package/dist/sso-ui.js +0 -2
- package/dist/staged-runtimes.js +5 -39
- package/dist/steer-capabilities.js +1 -7
- package/dist/steer-controls.js +0 -10
- package/dist/steer-live.js +0 -31
- package/dist/steer-mailbox.js +4 -65
- package/dist/steer-status.js +0 -7
- package/dist/stop-proof.js +5 -62
- package/dist/storage-sweep-child.js +1 -5
- package/dist/storage-sweep-process.js +2 -20
- package/dist/storage-sweep-schedule.js +0 -32
- package/dist/storage-sweep.js +2 -51
- package/dist/storage-ui.js +0 -18
- package/dist/storage.js +0 -31
- package/dist/store-baseline.js +0 -14
- package/dist/store.js +109 -4763
- package/dist/stream-scope.js +0 -16
- package/dist/structured-output.js +0 -39
- package/dist/style-asset.js +0 -2
- package/dist/subagent-admin.js +0 -9
- package/dist/subagent-desk.js +0 -29
- package/dist/subagent-memory.js +0 -38
- package/dist/subagent-question.js +0 -29
- package/dist/subagent-tools.js +1 -60
- package/dist/subagent-week.js +0 -28
- package/dist/subagent-work.js +1 -39
- package/dist/subagents-ui.js +1 -13
- package/dist/subagents.js +0 -40
- package/dist/subscription-chat.js +1 -42
- package/dist/summary.js +0 -19
- package/dist/surface.js +0 -75
- package/dist/sweep-gate.js +0 -2
- package/dist/sweep-quarantine.js +2 -13
- package/dist/sync.js +0 -47
- package/dist/tailnet.js +0 -9
- package/dist/tamper-scan.js +0 -15
- package/dist/task-activity.js +1 -16
- package/dist/task-aliases.js +0 -3
- package/dist/task-archive.js +0 -7
- package/dist/task-base.js +0 -18
- package/dist/task-composer.js +0 -2
- package/dist/task-control.js +0 -74
- package/dist/task-live.js +0 -23
- package/dist/task-moves.js +0 -28
- package/dist/task-outcome-cli.js +17 -28
- package/dist/task-review-brief.js +0 -7
- package/dist/task-sizing.js +0 -47
- package/dist/task-source.js +0 -23
- package/dist/task-status.js +0 -106
- package/dist/task-text.js +0 -12
- package/dist/team-chat-authorization.js +0 -3
- package/dist/team-contract.js +0 -2
- package/dist/team-http.js +0 -4
- package/dist/team-leads.js +1 -16
- package/dist/team-runtime.js +0 -13
- package/dist/team-ui.js +0 -1
- package/dist/team-updates.js +0 -4
- package/dist/teams-api.js +0 -12
- package/dist/teams-chat.js +0 -28
- package/dist/teams.js +0 -12
- package/dist/teardown-git.js +6 -294
- package/dist/telegram-flow.js +0 -51
- package/dist/telegram-lead.js +2 -203
- package/dist/telegram-live.js +1 -42
- package/dist/telegram-progress.js +0 -18
- package/dist/telegram-settings.js +0 -7
- package/dist/telegram-status.js +0 -46
- package/dist/telegram-team.js +1 -33
- package/dist/telegram.js +6 -454
- package/dist/templates.js +0 -24
- package/dist/terminal-catalog.js +2 -20
- package/dist/terminal-text.js +0 -12
- package/dist/test-infra.js +0 -50
- package/dist/test-temp.js +3 -26
- package/dist/text-limits.js +0 -92
- package/dist/tidy.js +0 -76
- package/dist/tier-report.js +0 -2
- package/dist/token-notices.js +1 -9
- package/dist/tokens-cli.js +0 -13
- package/dist/tool-broker.js +2 -53
- package/dist/tool-launcher.js +0 -14
- package/dist/tool-secret-store.js +3 -125
- package/dist/toolroll-update-cli.js +0 -9
- package/dist/toolroll-update-ui.js +0 -14
- package/dist/toolroll-update.js +13 -252
- package/dist/tools-ui.js +0 -17
- package/dist/transitions-recipes.js +0 -2
- package/dist/tree-proof.js +0 -23
- package/dist/tui-contract.js +0 -8
- package/dist/tui-source.js +16 -36
- package/dist/tui.js +1 -1
- package/dist/typed-start.js +0 -27
- package/dist/unfenced-test-support.js +0 -5
- package/dist/up-processes.js +1 -40
- package/dist/up-role-child.js +1 -13
- package/dist/update-notice.js +0 -1
- package/dist/vanished-retry.js +0 -40
- package/dist/verification-evidence.js +0 -39
- package/dist/version.js +0 -1
- package/dist/wake-hub.js +0 -28
- package/dist/webhook-limits.js +0 -7
- package/dist/webhook-readers.js +0 -30
- package/dist/webhook-signing.js +0 -14
- package/dist/webhooks.js +0 -54
- package/dist/welcome-facts.js +2 -14
- package/dist/when-html.js +0 -27
- package/dist/work-index.js +26 -98
- package/dist/work-summary.js +2 -17
- package/dist/workspace-motion.js +0 -2
- package/dist/workspace-revision.js +1 -21
- package/dist/workspace-ui.js +15 -135
- package/dist/worktree-notices.js +0 -3
- package/dist/worktree.js +0 -308
- package/dist/writes-mode.js +0 -1
- package/dist/youiyoux-intake.js +4 -159
- package/package.json +4 -3
- package/dist/accent-colors.d.ts +0 -51
- package/dist/acp-agents.d.ts +0 -43
- package/dist/acp-attest.d.ts +0 -44
- package/dist/acp-check.d.ts +0 -37
- package/dist/acp-client.d.ts +0 -163
- package/dist/acp-inspect.d.ts +0 -23
- package/dist/action-ledger.d.ts +0 -27
- package/dist/activity-line.d.ts +0 -29
- package/dist/actor.d.ts +0 -11
- package/dist/agent-board.d.ts +0 -229
- package/dist/agent-fence.d.ts +0 -479
- package/dist/agent-onboard.d.ts +0 -158
- package/dist/agent-pulse.d.ts +0 -43
- package/dist/agent-state-words.d.ts +0 -19
- package/dist/agent-state.d.ts +0 -65
- package/dist/agent-turns.d.ts +0 -52
- package/dist/agentconfig.d.ts +0 -191
- package/dist/agents-board.d.ts +0 -145
- package/dist/agents-live.d.ts +0 -31
- package/dist/api-tokens.d.ts +0 -80
- package/dist/approval-authority.d.ts +0 -51
- package/dist/approval-password.d.ts +0 -31
- package/dist/approval-policy.d.ts +0 -69
- package/dist/approval-rules-ui.d.ts +0 -40
- package/dist/assignment-adapters.d.ts +0 -152
- package/dist/assignment-brief.d.ts +0 -83
- package/dist/assignment-delivery.d.ts +0 -86
- package/dist/assignment-presentation.d.ts +0 -37
- package/dist/assignment-status.d.ts +0 -71
- package/dist/assignment-ui.d.ts +0 -68
- package/dist/assignment.d.ts +0 -350
- package/dist/attest.d.ts +0 -59
- package/dist/audit-cli.d.ts +0 -17
- package/dist/backend.d.ts +0 -97
- package/dist/backup-ui.d.ts +0 -32
- package/dist/backup.d.ts +0 -92
- package/dist/batch-checks.d.ts +0 -15
- package/dist/batch-policy.d.ts +0 -23
- package/dist/beads.d.ts +0 -34
- package/dist/bin.d.ts +0 -2
- package/dist/board.d.ts +0 -134
- package/dist/boot-identity.d.ts +0 -64
- package/dist/bounded-spawn.d.ts +0 -57
- package/dist/brand-icons.d.ts +0 -168
- package/dist/brand-mark.d.ts +0 -28
- package/dist/brief-fence.d.ts +0 -9
- package/dist/browser-crew.d.ts +0 -12
- package/dist/browser-shell.d.ts +0 -9
- package/dist/browser-workspace.d.ts +0 -1985
- package/dist/budget-alerts.d.ts +0 -19
- package/dist/build-review.d.ts +0 -38
- package/dist/builder-restart.d.ts +0 -21
- package/dist/builder.d.ts +0 -409
- package/dist/canonical-json.d.ts +0 -14
- package/dist/capscan.d.ts +0 -35
- package/dist/card-catalog.d.ts +0 -209
- package/dist/card-cli.d.ts +0 -43
- package/dist/card-render.d.ts +0 -43
- package/dist/card-sources.d.ts +0 -68
- package/dist/chat-acceptance.d.ts +0 -74
- package/dist/chat-actions.d.ts +0 -460
- package/dist/chat-admission.d.ts +0 -19
- package/dist/chat-approval.d.ts +0 -58
- package/dist/chat-ask.d.ts +0 -32
- package/dist/chat-card-part.d.ts +0 -11
- package/dist/chat-card.d.ts +0 -46
- package/dist/chat-channel.d.ts +0 -126
- package/dist/chat-continuity.d.ts +0 -32
- package/dist/chat-controls.d.ts +0 -117
- package/dist/chat-core.d.ts +0 -177
- package/dist/chat-decide.d.ts +0 -269
- package/dist/chat-delivery-state.d.ts +0 -132
- package/dist/chat-delivery.d.ts +0 -71
- package/dist/chat-display.d.ts +0 -1
- package/dist/chat-evidence.d.ts +0 -123
- package/dist/chat-flow.d.ts +0 -70
- package/dist/chat-follow.d.ts +0 -20
- package/dist/chat-inbox.d.ts +0 -57
- package/dist/chat-live-schema.d.ts +0 -17
- package/dist/chat-live.d.ts +0 -161
- package/dist/chat-message-states.d.ts +0 -75
- package/dist/chat-messages.d.ts +0 -338
- package/dist/chat-migration.d.ts +0 -30
- package/dist/chat-polish.d.ts +0 -17
- package/dist/chat-quiet.d.ts +0 -40
- package/dist/chat-review.d.ts +0 -51
- package/dist/chat-rooms.d.ts +0 -123
- package/dist/chat-settings-page.d.ts +0 -43
- package/dist/chat-task-actions.d.ts +0 -59
- package/dist/chat-terms.d.ts +0 -29
- package/dist/chat-voice.d.ts +0 -69
- package/dist/chat-warmth.d.ts +0 -21
- package/dist/check-access.d.ts +0 -54
- package/dist/check-facts.d.ts +0 -126
- package/dist/check-failure.d.ts +0 -113
- package/dist/check-levels-ui.d.ts +0 -36
- package/dist/check-levels.d.ts +0 -70
- package/dist/check-load.d.ts +0 -85
- package/dist/check-only-standing.d.ts +0 -36
- package/dist/check-only.d.ts +0 -15
- package/dist/check-progress.d.ts +0 -78
- package/dist/check-repair.d.ts +0 -47
- package/dist/check-report.d.ts +0 -177
- package/dist/check-stamp.d.ts +0 -46
- package/dist/checkout-cleanup.d.ts +0 -157
- package/dist/checkout-proof.d.ts +0 -28
- package/dist/child-database.d.ts +0 -12
- package/dist/claim.d.ts +0 -627
- package/dist/claude-print.d.ts +0 -12
- package/dist/cli-fast.d.ts +0 -8
- package/dist/cli-help.d.ts +0 -8
- package/dist/cli-http.d.ts +0 -58
- package/dist/cli.d.ts +0 -149
- package/dist/code-extract.d.ts +0 -44
- package/dist/code-map-acts.d.ts +0 -24
- package/dist/code-map-admission.d.ts +0 -52
- package/dist/code-map-build.d.ts +0 -63
- package/dist/code-map-cli.d.ts +0 -153
- package/dist/code-map-main.d.ts +0 -1
- package/dist/code-map-read.d.ts +0 -106
- package/dist/code-map-report.d.ts +0 -37
- package/dist/code-map-shape.d.ts +0 -172
- package/dist/code-map-store.d.ts +0 -136
- package/dist/codex-limits.d.ts +0 -15
- package/dist/coding-context.d.ts +0 -18
- package/dist/coding-handoff.d.ts +0 -39
- package/dist/coding-provider.d.ts +0 -88
- package/dist/coding-shipping-ui.d.ts +0 -5
- package/dist/coding-types.d.ts +0 -16
- package/dist/coding-ui.d.ts +0 -19
- package/dist/coding-update.d.ts +0 -28
- package/dist/coding-workspace.d.ts +0 -141
- package/dist/commit-extract.d.ts +0 -135
- package/dist/connect-cli.d.ts +0 -34
- package/dist/console-chrome.d.ts +0 -41
- package/dist/console-instance.d.ts +0 -157
- package/dist/container-state.d.ts +0 -5
- package/dist/containment.d.ts +0 -205
- package/dist/contract-changes.d.ts +0 -52
- package/dist/contracts/acceptance-terms.d.ts +0 -14
- package/dist/contracts/chat-actions.d.ts +0 -465
- package/dist/contracts/chat-callback-rows.d.ts +0 -59
- package/dist/contracts/chat-card.d.ts +0 -91
- package/dist/contracts/chat-content.d.ts +0 -551
- package/dist/contracts/chat-tables.d.ts +0 -12
- package/dist/contracts/cli.d.ts +0 -987
- package/dist/contracts/coding-activity.d.ts +0 -64
- package/dist/contracts/coding-context.d.ts +0 -97
- package/dist/contracts/coding-handoff.d.ts +0 -44
- package/dist/contracts/coding-workspace.d.ts +0 -165
- package/dist/contracts/console-api.d.ts +0 -540
- package/dist/contracts/contract-test.d.ts +0 -45
- package/dist/contracts/contract.d.ts +0 -92
- package/dist/contracts/decision.d.ts +0 -45
- package/dist/contracts/diff-stat.d.ts +0 -58
- package/dist/contracts/discord-callback.d.ts +0 -45
- package/dist/contracts/flow-card.d.ts +0 -53
- package/dist/contracts/flow-propose.d.ts +0 -334
- package/dist/contracts/flow-send.d.ts +0 -245
- package/dist/contracts/flow.d.ts +0 -19565
- package/dist/contracts/gateway-tools.d.ts +0 -472
- package/dist/contracts/handoff.d.ts +0 -91
- package/dist/contracts/health.d.ts +0 -82
- package/dist/contracts/integration-metadata.d.ts +0 -100
- package/dist/contracts/lead-context.d.ts +0 -165
- package/dist/contracts/lead-tools.d.ts +0 -2312
- package/dist/contracts/mcp-oauth.d.ts +0 -53
- package/dist/contracts/memory-pass.d.ts +0 -157
- package/dist/contracts/model-catalog.d.ts +0 -21
- package/dist/contracts/observation-request.d.ts +0 -37
- package/dist/contracts/plan.d.ts +0 -58
- package/dist/contracts/project-knowledge.d.ts +0 -159
- package/dist/contracts/project-memory.d.ts +0 -119
- package/dist/contracts/project-skills.d.ts +0 -120
- package/dist/contracts/proof.d.ts +0 -136
- package/dist/contracts/provider.d.ts +0 -40
- package/dist/contracts/recipes.d.ts +0 -166
- package/dist/contracts/release-check.d.ts +0 -371
- package/dist/contracts/release-terms.d.ts +0 -107
- package/dist/contracts/retention.d.ts +0 -42
- package/dist/contracts/review-findings.d.ts +0 -46
- package/dist/contracts/route-results.d.ts +0 -121
- package/dist/contracts/route.d.ts +0 -897
- package/dist/contracts/scope.d.ts +0 -105
- package/dist/contracts/scout-report.d.ts +0 -234
- package/dist/contracts/slack-callback.d.ts +0 -43
- package/dist/contracts/sort-answer.d.ts +0 -83
- package/dist/contracts/stage-output.d.ts +0 -127
- package/dist/contracts/storage.d.ts +0 -37
- package/dist/contracts/store-json.d.ts +0 -313
- package/dist/contracts/subagent-turn.d.ts +0 -43
- package/dist/contracts/task-sizing.d.ts +0 -24
- package/dist/contracts/teams-callback.d.ts +0 -13
- package/dist/contracts/telegram-callback.d.ts +0 -120
- package/dist/contracts/trigger-payloads.d.ts +0 -389
- package/dist/contracts/update-journal.d.ts +0 -254
- package/dist/contracts/verification-receipt.d.ts +0 -200
- package/dist/contracts/verification-view.d.ts +0 -102
- package/dist/contracts/youiyoux-request.d.ts +0 -248
- package/dist/control-setup.d.ts +0 -44
- package/dist/control-ui.d.ts +0 -37
- package/dist/controller-service.d.ts +0 -1
- package/dist/controller-supervisor.d.ts +0 -38
- package/dist/converse.d.ts +0 -316
- package/dist/coordinator-proposals.d.ts +0 -29
- package/dist/coordinator.d.ts +0 -186
- package/dist/credentials-ui.d.ts +0 -33
- package/dist/daemon.d.ts +0 -226
- package/dist/database-reclaim.d.ts +0 -4
- package/dist/decision.d.ts +0 -119
- package/dist/demo-chat.d.ts +0 -32
- package/dist/demo.d.ts +0 -153
- package/dist/deploy-gate.d.ts +0 -20
- package/dist/deploy-lock.d.ts +0 -8
- package/dist/deploy-phase.d.ts +0 -37
- package/dist/deploy-rescue.d.ts +0 -42
- package/dist/deprecations.d.ts +0 -20
- package/dist/design/kit.d.ts +0 -216
- package/dist/desktop-access.d.ts +0 -28
- package/dist/desktop-bundle.d.ts +0 -16
- package/dist/desktop-host.d.ts +0 -54
- package/dist/desktop-update-gate.d.ts +0 -12
- package/dist/desktop-update-recovery.d.ts +0 -14
- package/dist/desktop-update.d.ts +0 -147
- package/dist/digest-times.d.ts +0 -3
- package/dist/disclosure.d.ts +0 -6
- package/dist/discord-api.d.ts +0 -24
- package/dist/discord-chat.d.ts +0 -27
- package/dist/discord-settings.d.ts +0 -4
- package/dist/discord.d.ts +0 -10
- package/dist/discover.d.ts +0 -75
- package/dist/dispatch.d.ts +0 -123
- package/dist/dispose.d.ts +0 -194
- package/dist/doctor.d.ts +0 -67
- package/dist/easy-start-args.d.ts +0 -13
- package/dist/easy-start.d.ts +0 -77
- package/dist/egress.d.ts +0 -121
- package/dist/email-settings.d.ts +0 -34
- package/dist/envelope.d.ts +0 -47
- package/dist/eval-gate.d.ts +0 -51
- package/dist/eval-hooks.d.ts +0 -94
- package/dist/eval-oracle-main.d.ts +0 -1
- package/dist/eval-oracle.d.ts +0 -60
- package/dist/eval-world.d.ts +0 -17
- package/dist/evals.d.ts +0 -299
- package/dist/evidence-pack.d.ts +0 -186
- package/dist/evidence-pair.d.ts +0 -53
- package/dist/evidence.d.ts +0 -371
- package/dist/exec.d.ts +0 -355
- package/dist/exhaustion.d.ts +0 -58
- package/dist/export-ui.d.ts +0 -11
- package/dist/export.d.ts +0 -48
- package/dist/failing-first.d.ts +0 -31
- package/dist/fallback-schema.d.ts +0 -8
- package/dist/fallback.d.ts +0 -138
- package/dist/fast-start.d.ts +0 -213
- package/dist/fast-terms.d.ts +0 -9
- package/dist/fenced-check-coverage.d.ts +0 -62
- package/dist/findings.d.ts +0 -224
- package/dist/first-run.d.ts +0 -197
- package/dist/first-tasks-child.d.ts +0 -1
- package/dist/flaky-ci.d.ts +0 -31
- package/dist/flaky-cli.d.ts +0 -60
- package/dist/flaky.d.ts +0 -83
- package/dist/fleet-schema.d.ts +0 -17
- package/dist/flow-actions.d.ts +0 -79
- package/dist/flow-browser.d.ts +0 -103
- package/dist/flow-cadence.d.ts +0 -48
- package/dist/flow-card-task.d.ts +0 -11
- package/dist/flow-changed.d.ts +0 -14
- package/dist/flow-code.d.ts +0 -84
- package/dist/flow-draft.d.ts +0 -42
- package/dist/flow-engine.d.ts +0 -82
- package/dist/flow-gallery-ui.d.ts +0 -73
- package/dist/flow-gallery.d.ts +0 -147
- package/dist/flow-insights.d.ts +0 -104
- package/dist/flow-items.d.ts +0 -37
- package/dist/flow-live.d.ts +0 -16
- package/dist/flow-people.d.ts +0 -23
- package/dist/flow-pull-request.d.ts +0 -14
- package/dist/flow-replies.d.ts +0 -48
- package/dist/flow-result-card.d.ts +0 -22
- package/dist/flow-schedule.d.ts +0 -154
- package/dist/flow-scripts.d.ts +0 -31
- package/dist/flow-secrets.d.ts +0 -13
- package/dist/flow-send.d.ts +0 -54
- package/dist/flow-share.d.ts +0 -78
- package/dist/flow-sort.d.ts +0 -63
- package/dist/flow-starters-ui.d.ts +0 -15
- package/dist/flow-starters.d.ts +0 -63
- package/dist/flow-steps.d.ts +0 -52
- package/dist/flow-triggers.d.ts +0 -303
- package/dist/flow-unattended-words.d.ts +0 -48
- package/dist/flow-unattended.d.ts +0 -259
- package/dist/flows-cli.d.ts +0 -358
- package/dist/flows-ui.d.ts +0 -70
- package/dist/flows.d.ts +0 -136
- package/dist/folder-gate.d.ts +0 -32
- package/dist/folder-look.d.ts +0 -110
- package/dist/follow-through-brief.d.ts +0 -12
- package/dist/follow-through-cli.d.ts +0 -23
- package/dist/fonts.d.ts +0 -19
- package/dist/gaps.d.ts +0 -35
- package/dist/gate-failure.d.ts +0 -40
- package/dist/git-floor.d.ts +0 -16
- package/dist/git-incident.d.ts +0 -65
- package/dist/git-views.d.ts +0 -20
- package/dist/git.d.ts +0 -54
- package/dist/github-import.d.ts +0 -62
- package/dist/github-jobs.d.ts +0 -25
- package/dist/google-mail.d.ts +0 -59
- package/dist/grant.d.ts +0 -136
- package/dist/graph.d.ts +0 -164
- package/dist/guides.d.ts +0 -22
- package/dist/handover-note.d.ts +0 -33
- package/dist/health-cli.d.ts +0 -3
- package/dist/home-groups.d.ts +0 -39
- package/dist/html.d.ts +0 -85
- package/dist/install-method.d.ts +0 -17
- package/dist/integrations-ui.d.ts +0 -17
- package/dist/integrations.d.ts +0 -138
- package/dist/invoke.d.ts +0 -228
- package/dist/is-record.d.ts +0 -2
- package/dist/issues.d.ts +0 -41
- package/dist/jsonl-discriminants.d.ts +0 -11
- package/dist/keymap.d.ts +0 -43
- package/dist/keys.d.ts +0 -108
- package/dist/kits-ui.d.ts +0 -16
- package/dist/kits.d.ts +0 -88
- package/dist/knowledge-cli.d.ts +0 -132
- package/dist/knowledge-ui.d.ts +0 -45
- package/dist/landed-cleanup.d.ts +0 -175
- package/dist/laptop-background.d.ts +0 -187
- package/dist/laptop-service.d.ts +0 -111
- package/dist/latency-timeline.d.ts +0 -46
- package/dist/lead-about.d.ts +0 -35
- package/dist/lead-answer-eval.d.ts +0 -93
- package/dist/lead-capabilities.d.ts +0 -57
- package/dist/lead-cli-live.d.ts +0 -56
- package/dist/lead-cli.d.ts +0 -58
- package/dist/lead-commitments.d.ts +0 -84
- package/dist/lead-context.d.ts +0 -45
- package/dist/lead-contract.d.ts +0 -10
- package/dist/lead-doors.d.ts +0 -122
- package/dist/lead-follow.d.ts +0 -26
- package/dist/lead-identity.d.ts +0 -23
- package/dist/lead-latency-schema.d.ts +0 -24
- package/dist/lead-people.d.ts +0 -55
- package/dist/lead-progress.d.ts +0 -67
- package/dist/lead-queue-runtime.d.ts +0 -46
- package/dist/lead-queue.d.ts +0 -104
- package/dist/lead-route.d.ts +0 -56
- package/dist/lead-status.d.ts +0 -116
- package/dist/lead-sweep.d.ts +0 -67
- package/dist/lead-tools.d.ts +0 -167
- package/dist/lead-voice.d.ts +0 -85
- package/dist/lead.d.ts +0 -142
- package/dist/learning-child.d.ts +0 -1
- package/dist/learning-look.d.ts +0 -25
- package/dist/ledger-chain.d.ts +0 -46
- package/dist/ledger-csv.d.ts +0 -4
- package/dist/ledger-view.d.ts +0 -27
- package/dist/lesson-notes.d.ts +0 -81
- package/dist/limits-ui.d.ts +0 -34
- package/dist/link.d.ts +0 -72
- package/dist/live-backup.d.ts +0 -39
- package/dist/live-bus.d.ts +0 -141
- package/dist/live-children-read.d.ts +0 -52
- package/dist/live-children.d.ts +0 -73
- package/dist/live-detail.d.ts +0 -27
- package/dist/live-input.d.ts +0 -68
- package/dist/live-main-read.d.ts +0 -19
- package/dist/live-notes.d.ts +0 -20
- package/dist/live-open.d.ts +0 -28
- package/dist/live-records.d.ts +0 -149
- package/dist/live-reply.d.ts +0 -83
- package/dist/live-terminal.d.ts +0 -273
- package/dist/live.d.ts +0 -152
- package/dist/local-owner-acts.d.ts +0 -83
- package/dist/local-owner.d.ts +0 -135
- package/dist/log.d.ts +0 -7
- package/dist/login-secrets.d.ts +0 -60
- package/dist/machine-check.d.ts +0 -16
- package/dist/machine-identity.d.ts +0 -75
- package/dist/mailbox.d.ts +0 -57
- package/dist/maintenance.d.ts +0 -13
- package/dist/mcp-connect.d.ts +0 -181
- package/dist/mcp-core.d.ts +0 -110
- package/dist/mcp-http.d.ts +0 -32
- package/dist/mcp-oauth.d.ts +0 -92
- package/dist/mcp-person.d.ts +0 -22
- package/dist/mcp.d.ts +0 -20
- package/dist/memory-cli.d.ts +0 -768
- package/dist/memory-pass.d.ts +0 -151
- package/dist/memory-tidy.d.ts +0 -181
- package/dist/memory-use.d.ts +0 -35
- package/dist/merge-checklist.d.ts +0 -55
- package/dist/metrics.d.ts +0 -6
- package/dist/mobile-viewport.d.ts +0 -7
- package/dist/model-catalog.d.ts +0 -123
- package/dist/model-choices.d.ts +0 -235
- package/dist/model-names.d.ts +0 -6
- package/dist/models-cli.d.ts +0 -307
- package/dist/models-ui.d.ts +0 -161
- package/dist/modes.d.ts +0 -99
- package/dist/monitoring-settings.d.ts +0 -44
- package/dist/monitoring-ui.d.ts +0 -23
- package/dist/monitoring.d.ts +0 -34
- package/dist/names.d.ts +0 -67
- package/dist/needs-you.d.ts +0 -164
- package/dist/never-index.d.ts +0 -3
- package/dist/nightly-check.d.ts +0 -107
- package/dist/nightly-github.d.ts +0 -318
- package/dist/notification-delivery.d.ts +0 -19
- package/dist/notification-rows.d.ts +0 -30
- package/dist/oauth-run-token.d.ts +0 -51
- package/dist/observations.d.ts +0 -36
- package/dist/oidc.d.ts +0 -71
- package/dist/onboard.d.ts +0 -108
- package/dist/one-step-chat-schema.d.ts +0 -22
- package/dist/openrouter-models.d.ts +0 -34
- package/dist/operate-remote-arguments.d.ts +0 -36
- package/dist/operate-remote.d.ts +0 -98
- package/dist/operate.d.ts +0 -401
- package/dist/orphan-sweep.d.ts +0 -65
- package/dist/page-work-contract.d.ts +0 -21
- package/dist/password-bearer.d.ts +0 -25
- package/dist/passwordless.d.ts +0 -23
- package/dist/peek-cli.d.ts +0 -112
- package/dist/peek.d.ts +0 -110
- package/dist/people-audit-ui.d.ts +0 -16
- package/dist/person-proof.d.ts +0 -2
- package/dist/phase-routing.d.ts +0 -401
- package/dist/plain-schema.d.ts +0 -23
- package/dist/plain-words.d.ts +0 -20
- package/dist/plan-auto.d.ts +0 -25
- package/dist/plan-login.d.ts +0 -14
- package/dist/plan.d.ts +0 -188
- package/dist/plane-review.d.ts +0 -54
- package/dist/planner-source.d.ts +0 -225
- package/dist/planner.d.ts +0 -76
- package/dist/policy-ui.d.ts +0 -22
- package/dist/policy.d.ts +0 -92
- package/dist/prepared-evidence.d.ts +0 -17
- package/dist/principal.d.ts +0 -42
- package/dist/probe.d.ts +0 -46
- package/dist/process-custody.d.ts +0 -17
- package/dist/process-liveness.d.ts +0 -13
- package/dist/process-tree.d.ts +0 -39
- package/dist/project-access.d.ts +0 -17
- package/dist/project-activity.d.ts +0 -20
- package/dist/project-admission.d.ts +0 -105
- package/dist/project-cli.d.ts +0 -19
- package/dist/project-concurrency.d.ts +0 -62
- package/dist/project-delete-ui.d.ts +0 -96
- package/dist/project-delete.d.ts +0 -59
- package/dist/project-demo.d.ts +0 -12
- package/dist/project-file.d.ts +0 -3
- package/dist/project-identity.d.ts +0 -52
- package/dist/project-knowledge.d.ts +0 -124
- package/dist/project-learning.d.ts +0 -120
- package/dist/project-memory.d.ts +0 -70
- package/dist/project-outcomes.d.ts +0 -119
- package/dist/project-sandbox.d.ts +0 -59
- package/dist/project-skills.d.ts +0 -139
- package/dist/project-tools.d.ts +0 -318
- package/dist/project.d.ts +0 -65
- package/dist/prompt.d.ts +0 -33
- package/dist/proof.d.ts +0 -457
- package/dist/proposal.d.ts +0 -70
- package/dist/protected-storage-look.d.ts +0 -1
- package/dist/protected-storage.d.ts +0 -98
- package/dist/provider-auth.d.ts +0 -143
- package/dist/provider-capture.d.ts +0 -34
- package/dist/provider-connection.d.ts +0 -23
- package/dist/provider-home.d.ts +0 -22
- package/dist/provider-limits.d.ts +0 -37
- package/dist/provider.d.ts +0 -369
- package/dist/public-access.d.ts +0 -61
- package/dist/public-check.d.ts +0 -37
- package/dist/publish.d.ts +0 -146
- package/dist/pull-request-flow.d.ts +0 -189
- package/dist/pull-request-schema.d.ts +0 -5
- package/dist/pull-request-ui.d.ts +0 -25
- package/dist/pulls.d.ts +0 -121
- package/dist/push.d.ts +0 -120
- package/dist/quality.d.ts +0 -8
- package/dist/quick-start.d.ts +0 -26
- package/dist/read-executor-worker.d.ts +0 -1
- package/dist/read-executor.d.ts +0 -66
- package/dist/read-only-request.d.ts +0 -4
- package/dist/recipe-ui.d.ts +0 -21
- package/dist/recipes.d.ts +0 -56
- package/dist/release-adapters.d.ts +0 -205
- package/dist/release-approval.d.ts +0 -180
- package/dist/release-authority.d.ts +0 -173
- package/dist/release-auto.d.ts +0 -184
- package/dist/release-card.d.ts +0 -170
- package/dist/release-carry.d.ts +0 -261
- package/dist/release-ci-hold.d.ts +0 -41
- package/dist/release-cli.d.ts +0 -34
- package/dist/release-coverage.d.ts +0 -16
- package/dist/release-gate.d.ts +0 -84
- package/dist/release-git.d.ts +0 -43
- package/dist/release-links.d.ts +0 -29
- package/dist/release-net.d.ts +0 -90
- package/dist/release-next.d.ts +0 -48
- package/dist/release-recheck.d.ts +0 -146
- package/dist/release-refusal.d.ts +0 -32
- package/dist/release-view.d.ts +0 -37
- package/dist/release.d.ts +0 -806
- package/dist/releases.d.ts +0 -94
- package/dist/remote-audit.d.ts +0 -79
- package/dist/remote-command.d.ts +0 -45
- package/dist/remote-destination.d.ts +0 -36
- package/dist/remote-exec.d.ts +0 -38
- package/dist/remote-main.d.ts +0 -111
- package/dist/remote-run.d.ts +0 -20
- package/dist/remote.d.ts +0 -67
- package/dist/render.d.ts +0 -64
- package/dist/reply-shape.d.ts +0 -106
- package/dist/reply-voice.d.ts +0 -23
- package/dist/report-summary.d.ts +0 -22
- package/dist/reported-usage.d.ts +0 -69
- package/dist/repos.d.ts +0 -67
- package/dist/repository-context-ui.d.ts +0 -3
- package/dist/repository-context.d.ts +0 -66
- package/dist/request-budget-ui.d.ts +0 -14
- package/dist/request-budget.d.ts +0 -127
- package/dist/restart-certification.d.ts +0 -133
- package/dist/result-actions.d.ts +0 -36
- package/dist/result-acts.d.ts +0 -112
- package/dist/result-completion.d.ts +0 -39
- package/dist/result-evidence-readers.d.ts +0 -42
- package/dist/result-follow-ups.d.ts +0 -118
- package/dist/result-review.d.ts +0 -220
- package/dist/result-shots.d.ts +0 -59
- package/dist/retention-ui.d.ts +0 -21
- package/dist/retention.d.ts +0 -77
- package/dist/review-context.d.ts +0 -245
- package/dist/review-evidence.d.ts +0 -33
- package/dist/review-switch.d.ts +0 -36
- package/dist/reviewer.d.ts +0 -99
- package/dist/route-change-check.d.ts +0 -4
- package/dist/route-change.d.ts +0 -22
- package/dist/route-hooks.d.ts +0 -54
- package/dist/route-results.d.ts +0 -75
- package/dist/route-rules.d.ts +0 -324
- package/dist/route-savings.d.ts +0 -136
- package/dist/route-store.d.ts +0 -300
- package/dist/run-closeout.d.ts +0 -89
- package/dist/run-efficiency.d.ts +0 -74
- package/dist/run-ending.d.ts +0 -21
- package/dist/runner-process.d.ts +0 -76
- package/dist/runner.d.ts +0 -324
- package/dist/sample-project.d.ts +0 -31
- package/dist/sandbox-launch.d.ts +0 -1
- package/dist/sandbox-runtime.d.ts +0 -128
- package/dist/scan.d.ts +0 -32
- package/dist/scope.d.ts +0 -1098
- package/dist/scout-browser-lock.d.ts +0 -69
- package/dist/scout-browser.d.ts +0 -107
- package/dist/scout-net.d.ts +0 -25
- package/dist/scout-report.d.ts +0 -23
- package/dist/scout.d.ts +0 -142
- package/dist/secret-mint.d.ts +0 -1
- package/dist/serve.d.ts +0 -11
- package/dist/server/agents-computers.d.ts +0 -9
- package/dist/server/agents-live-filed.d.ts +0 -17
- package/dist/server/agents-live-lead.d.ts +0 -47
- package/dist/server/agents-live-room.d.ts +0 -23
- package/dist/server/chat.d.ts +0 -39
- package/dist/server/chrome.d.ts +0 -328
- package/dist/server/edge-refusal.d.ts +0 -7
- package/dist/server/flows.d.ts +0 -8
- package/dist/server/guards.d.ts +0 -81
- package/dist/server/handler-context.d.ts +0 -22
- package/dist/server/handler-registry.d.ts +0 -23
- package/dist/server/home-asks.d.ts +0 -45
- package/dist/server/home.d.ts +0 -65
- package/dist/server/http.d.ts +0 -337
- package/dist/server/in-place.d.ts +0 -15
- package/dist/server/kit-standalone.d.ts +0 -22
- package/dist/server/kit.d.ts +0 -452
- package/dist/server/last-checks.d.ts +0 -17
- package/dist/server/live.d.ts +0 -74
- package/dist/server/merge-ready-view.d.ts +0 -10
- package/dist/server/mutation-key.d.ts +0 -70
- package/dist/server/pages-assets.d.ts +0 -11
- package/dist/server/pages.d.ts +0 -8
- package/dist/server/people-tokens.d.ts +0 -18
- package/dist/server/remote-hooks.d.ts +0 -29
- package/dist/server/remote.d.ts +0 -60
- package/dist/server/render-chat.d.ts +0 -439
- package/dist/server/render-code-map.d.ts +0 -30
- package/dist/server/render-flaky.d.ts +0 -20
- package/dist/server/render-follow-through.d.ts +0 -11
- package/dist/server/render-history.d.ts +0 -51
- package/dist/server/render-new-task.d.ts +0 -54
- package/dist/server/render-pages.d.ts +0 -236
- package/dist/server/render-people.d.ts +0 -102
- package/dist/server/render-projects.d.ts +0 -104
- package/dist/server/render-release.d.ts +0 -19
- package/dist/server/render-results.d.ts +0 -758
- package/dist/server/render-settings.d.ts +0 -93
- package/dist/server/render-tasks.d.ts +0 -783
- package/dist/server/request-context.d.ts +0 -78
- package/dist/server/retired-routes.d.ts +0 -17
- package/dist/server/route-policy.d.ts +0 -18
- package/dist/server/route-table.d.ts +0 -114
- package/dist/server/runtime.d.ts +0 -343
- package/dist/server/session.d.ts +0 -192
- package/dist/server/settings.d.ts +0 -76
- package/dist/server/signup-gate.d.ts +0 -9
- package/dist/server/sweeps.d.ts +0 -4
- package/dist/server/task-views.d.ts +0 -98
- package/dist/server/tasks.d.ts +0 -108
- package/dist/server/terminals.d.ts +0 -31
- package/dist/server/welcome.d.ts +0 -28
- package/dist/server-telemetry.d.ts +0 -87
- package/dist/settings-groups-ui.d.ts +0 -286
- package/dist/settings-kit-script.d.ts +0 -21
- package/dist/settings-kit.d.ts +0 -173
- package/dist/settings-proofs.d.ts +0 -64
- package/dist/setup-guide.d.ts +0 -39
- package/dist/shared-deps.d.ts +0 -115
- package/dist/sign-in-guard.d.ts +0 -70
- package/dist/skills-ui.d.ts +0 -12
- package/dist/skills.d.ts +0 -99
- package/dist/slack-api.d.ts +0 -59
- package/dist/slack-chat.d.ts +0 -37
- package/dist/slack-settings.d.ts +0 -4
- package/dist/slack-socket.d.ts +0 -12
- package/dist/slack.d.ts +0 -6
- package/dist/sleep.d.ts +0 -2
- package/dist/source-key.d.ts +0 -2
- package/dist/spend-report.d.ts +0 -87
- package/dist/spend-ui.d.ts +0 -80
- package/dist/spend.d.ts +0 -142
- package/dist/sqlite-runtime.d.ts +0 -3
- package/dist/sqlite-telemetry.d.ts +0 -9
- package/dist/sso-settings.d.ts +0 -33
- package/dist/sso-ui.d.ts +0 -26
- package/dist/staged-runtimes.d.ts +0 -54
- package/dist/steer-capabilities.d.ts +0 -32
- package/dist/steer-controls.d.ts +0 -14
- package/dist/steer-live.d.ts +0 -19
- package/dist/steer-mailbox.d.ts +0 -46
- package/dist/steer-status.d.ts +0 -25
- package/dist/stop-proof.d.ts +0 -67
- package/dist/storage-sweep-child.d.ts +0 -1
- package/dist/storage-sweep-process.d.ts +0 -55
- package/dist/storage-sweep-schedule.d.ts +0 -30
- package/dist/storage-sweep.d.ts +0 -77
- package/dist/storage-ui.d.ts +0 -23
- package/dist/storage.d.ts +0 -68
- package/dist/store-baseline.d.ts +0 -19
- package/dist/store.d.ts +0 -8613
- package/dist/stream-scope.d.ts +0 -18
- package/dist/structured-output.d.ts +0 -57
- package/dist/style-asset.d.ts +0 -7
- package/dist/subagent-admin.d.ts +0 -53
- package/dist/subagent-desk.d.ts +0 -59
- package/dist/subagent-memory.d.ts +0 -65
- package/dist/subagent-question.d.ts +0 -59
- package/dist/subagent-tools.d.ts +0 -125
- package/dist/subagent-week.d.ts +0 -68
- package/dist/subagent-work.d.ts +0 -76
- package/dist/subagents-ui.d.ts +0 -22
- package/dist/subagents.d.ts +0 -146
- package/dist/subscription-chat.d.ts +0 -54
- package/dist/summary.d.ts +0 -33
- package/dist/surface.d.ts +0 -49
- package/dist/sweep-gate.d.ts +0 -10
- package/dist/sweep-quarantine.d.ts +0 -29
- package/dist/sync.d.ts +0 -94
- package/dist/tailnet.d.ts +0 -11
- package/dist/tamper-scan.d.ts +0 -4
- package/dist/task-activity.d.ts +0 -27
- package/dist/task-aliases.d.ts +0 -5
- package/dist/task-archive.d.ts +0 -13
- package/dist/task-base.d.ts +0 -39
- package/dist/task-composer.d.ts +0 -14
- package/dist/task-control.d.ts +0 -159
- package/dist/task-live.d.ts +0 -8
- package/dist/task-moves.d.ts +0 -90
- package/dist/task-outcome-cli.d.ts +0 -48
- package/dist/task-review-brief.d.ts +0 -69
- package/dist/task-sizing.d.ts +0 -58
- package/dist/task-source.d.ts +0 -77
- package/dist/task-status.d.ts +0 -324
- package/dist/task-text.d.ts +0 -31
- package/dist/team-chat-authorization.d.ts +0 -11
- package/dist/team-contract.d.ts +0 -103
- package/dist/team-http.d.ts +0 -25
- package/dist/team-leads.d.ts +0 -85
- package/dist/team-runtime.d.ts +0 -25
- package/dist/team-ui.d.ts +0 -4
- package/dist/team-updates.d.ts +0 -8
- package/dist/teams-api.d.ts +0 -33
- package/dist/teams-chat.d.ts +0 -36
- package/dist/teams-settings.d.ts +0 -14
- package/dist/teams.d.ts +0 -24
- package/dist/teardown-git.d.ts +0 -164
- package/dist/telegram-flow.d.ts +0 -112
- package/dist/telegram-lead.d.ts +0 -151
- package/dist/telegram-live.d.ts +0 -116
- package/dist/telegram-progress.d.ts +0 -20
- package/dist/telegram-settings.d.ts +0 -9
- package/dist/telegram-status.d.ts +0 -83
- package/dist/telegram-team.d.ts +0 -68
- package/dist/telegram.d.ts +0 -271
- package/dist/templates.d.ts +0 -69
- package/dist/terminal-catalog.d.ts +0 -11
- package/dist/terminal-text.d.ts +0 -11
- package/dist/test-infra.d.ts +0 -34
- package/dist/test-temp.d.ts +0 -40
- package/dist/text-limits.d.ts +0 -297
- package/dist/tidy.d.ts +0 -130
- package/dist/tier-report.d.ts +0 -44
- package/dist/token-notices.d.ts +0 -11
- package/dist/tokens-cli.d.ts +0 -21
- package/dist/tool-broker.d.ts +0 -52
- package/dist/tool-launcher.d.ts +0 -1
- package/dist/tool-secret-store.d.ts +0 -167
- package/dist/toolroll-update-cli.d.ts +0 -15
- package/dist/toolroll-update-ui.d.ts +0 -47
- package/dist/toolroll-update.d.ts +0 -265
- package/dist/tools-ui.d.ts +0 -51
- package/dist/transitions-recipes.d.ts +0 -1
- package/dist/tree-proof.d.ts +0 -34
- package/dist/tui-contract.d.ts +0 -202
- package/dist/tui-source.d.ts +0 -14
- package/dist/typed-start.d.ts +0 -51
- package/dist/unfenced-test-support.d.ts +0 -2
- package/dist/up-processes.d.ts +0 -162
- package/dist/up-role-child.d.ts +0 -1
- package/dist/update-notice.d.ts +0 -5
- package/dist/vanished-retry.d.ts +0 -30
- package/dist/verification-evidence.d.ts +0 -68
- package/dist/version.d.ts +0 -2
- package/dist/wake-hub.d.ts +0 -72
- package/dist/webhook-limits.d.ts +0 -23
- package/dist/webhook-readers.d.ts +0 -56
- package/dist/webhook-signing.d.ts +0 -27
- package/dist/webhooks.d.ts +0 -84
- package/dist/welcome-facts.d.ts +0 -18
- package/dist/when-html.d.ts +0 -40
- package/dist/work-index.d.ts +0 -175
- package/dist/work-summary.d.ts +0 -61
- package/dist/workspace-motion.d.ts +0 -4
- package/dist/workspace-revision.d.ts +0 -48
- package/dist/workspace-ui.d.ts +0 -385
- package/dist/worktree-notices.d.ts +0 -13
- package/dist/worktree.d.ts +0 -365
- package/dist/writes-mode.d.ts +0 -9
- package/dist/youiyoux-intake.d.ts +0 -234
package/dist/release.js
CHANGED
|
@@ -1,66 +1,20 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `toolroll release <branch>` (D10): the whole release of Toolroll itself as one resumable command. The owner's
|
|
3
|
-
* approval of the release scope is the only human step; everything else runs headless, each waiting step with a time
|
|
4
|
-
* limit:
|
|
5
|
-
*
|
|
6
|
-
* gate → approval → check → complete → quiet → deploy → link → ci → merge → tree → tag → publish → homebrew → done
|
|
7
|
-
*
|
|
8
|
-
* gate, before filing a task for that commit, looks at the pull request's required checks on it: one that failed stops
|
|
9
|
-
* the release before anything is filed or sent for approval; it waits, naming them, for checks not started or still
|
|
10
|
-
* running, and stops if they don't finish within its limit (a task already filed is not looked at again; ci checks
|
|
11
|
-
* once more before merging). It then files a prepared-candidate task pinned to the branch's exact commit, with the full
|
|
12
|
-
* release check. approval
|
|
13
|
-
* waits for an active approver's yes to that exact scope (never a mode's, an AI's or the lead's). check requires a Full
|
|
14
|
-
* result of that commit: a failed check stops the release and stays visible, nothing reruns it. complete marks that
|
|
15
|
-
* exact result Complete through the task's own authorization. quiet waits until nothing builds. deploy runs the
|
|
16
|
-
* candidate's own deploy (scripts/deploy-browser.mjs: drain, backup, rehearsal, swap, health) and keeps the runtime its
|
|
17
|
-
* final JSON names; an interrupted one is recovered from its saved stage (--phase recover) before anything else. link
|
|
18
|
-
* points both CLI names at that runtime's bin.js, putting them back if either doesn't answer, and goes on only when
|
|
19
|
-
* the console, worker and both names run the gated commit. ci waits for every
|
|
20
|
-
* reported pull-request check on that same commit to pass, with every required check present: pending, missing,
|
|
21
|
-
* skipped or failed never merges. merge
|
|
22
|
-
* squash-merges with the head pinned to the gated commit, tree proves main's new commit has exactly the gated tree,
|
|
23
|
-
* and only then tag pushes the version tag, whose macOS matrix must pass before npm publication (publish.yml). publish
|
|
24
|
-
* waits for npm, the GitHub release and the macOS checks; homebrew updates the tap's formula and merges it (after its checks, when the tap runs any).
|
|
25
|
-
*
|
|
26
|
-
* A private journal (mode 0600, written whole then renamed) records what each step is about to do before it does
|
|
27
|
-
* anything outside this machine, and what it saw after. A stop — a time limit, a failure, a crash, Ctrl-C — leaves the
|
|
28
|
-
* journal at its step; running the same command again finds what already happened (the task, the completion, the
|
|
29
|
-
* merge, the tag, the package, the tap change) instead of doing it twice, and continues from the first unfinished
|
|
30
|
-
* step. A branch, pull request or tag that no longer matches what was gated stops the release rather than guess.
|
|
31
|
-
*
|
|
32
|
-
* Everything outside this module is an adapter (release-adapters.ts), so the state machine is tested without git,
|
|
33
|
-
* GitHub, npm or a running Toolroll.
|
|
34
|
-
*/
|
|
35
1
|
import { closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
36
2
|
import { randomUUID } from "node:crypto";
|
|
37
3
|
import { dirname, join } from "node:path";
|
|
38
4
|
import { personProof } from "./person-proof.js";
|
|
39
5
|
import { RELEASE_CI_RUNNING_WORDS as CI_RUNNING_WORDS } from "./release-ci-hold.js";
|
|
40
6
|
import { transientFailure } from "./release-net.js";
|
|
41
|
-
/** The pull-request checks a release waits for, by exact job name (docs/plans/test-matrix.md). Every one must have
|
|
42
|
-
* concluded `success` — executed, never skipped — on the gated commit; src/ci-workflow.test.ts holds the workflows to
|
|
43
|
-
* this list, and publish.yml's release proof to the same list. */
|
|
44
7
|
export const REQUIRED_PR_CHECKS = [
|
|
45
|
-
// The unit suite on Node 24 (ci.yml "test-shard" and "test"), on every pull request.
|
|
46
8
|
"node 24 · ubuntu-latest",
|
|
47
|
-
// The area lanes (ci.yml), on every pull request except a documentation-only one (scripts/ci-scope.mjs), where they
|
|
48
|
-
// are skipped; a release's pull request runs them.
|
|
49
9
|
"linux native containment · delegated cgroup v2",
|
|
50
10
|
"linux fence · sandbox-runtime",
|
|
51
11
|
"Windows Job Object containment",
|
|
52
|
-
// The git lanes (ci.yml job "git"): the declared floor (git-floor.ts) and Debian trixie's 2.47.
|
|
53
12
|
"git 2.41 · debian trixie",
|
|
54
13
|
"git 2.47 · debian trixie",
|
|
55
|
-
// The unit suite on macOS (ci.yml jobs "macos-shard" and "macos"; pipeline-speed.md, item 3a), Node 24.
|
|
56
14
|
"node 24 · macos-latest",
|
|
57
|
-
// Node 22, the engines floor, on Linux and macOS (release-candidate.yml): on a release-* branch's pull request,
|
|
58
|
-
// skipped on every other pull request.
|
|
59
15
|
"node 22 · ubuntu-latest",
|
|
60
16
|
"node 22 · macos-latest",
|
|
61
17
|
];
|
|
62
|
-
/** The workflow file each REQUIRED_PR_CHECKS job belongs to: a job of that name from any other workflow (a lookalike
|
|
63
|
-
* added beside it) never stands for it (Codex review round 1, inherited CI limitation). */
|
|
64
18
|
export const REQUIRED_PR_CHECKS_WORKFLOW = {
|
|
65
19
|
"node 24 · ubuntu-latest": ".github/workflows/ci.yml",
|
|
66
20
|
"linux native containment · delegated cgroup v2": ".github/workflows/ci.yml",
|
|
@@ -72,76 +26,44 @@ export const REQUIRED_PR_CHECKS_WORKFLOW = {
|
|
|
72
26
|
"node 22 · ubuntu-latest": ".github/workflows/release-candidate.yml",
|
|
73
27
|
"node 22 · macos-latest": ".github/workflows/release-candidate.yml",
|
|
74
28
|
};
|
|
75
|
-
/**
|
|
76
|
-
* The pull-request checks main's GitHub protection is not yet required to name (eval-harness review 2, finding 1).
|
|
77
|
-
* Empty since the test matrix (docs/plans/test-matrix.md): publication's release proof trusts what main's protection
|
|
78
|
-
* required at the merge, so main's protection must name every REQUIRED_PR_CHECKS check, and a release refuses to merge
|
|
79
|
-
* (and so to publish) until it does.
|
|
80
|
-
*/
|
|
81
29
|
export const PROTECTION_REPORT_ONLY_CHECKS = [];
|
|
82
|
-
/** The checks main's protection must require at minimum: every required check that isn't report-only. */
|
|
83
30
|
export const PROTECTION_MINIMUM_CHECKS = REQUIRED_PR_CHECKS.filter(name => !PROTECTION_REPORT_ONLY_CHECKS.includes(name));
|
|
84
|
-
/**
|
|
85
|
-
* Pull-request checks a release never waits for or fails on, by exact name and the workflow file that defines them:
|
|
86
|
-
* youiyoux's UI drift check (src/design/KIT.md), which fails a pull request that adds design drift but says nothing
|
|
87
|
-
* about whether a build is safe to release, and the scripted journeys on a pull request (journeys.yml,
|
|
88
|
-
* docs/plans/ci-speed.md item 4), advisory while they settle in CI: the release check runs every journey itself. Only a
|
|
89
|
-
* GitHub Actions run of that name from that workflow is left out; the same name from anywhere else is judged like any
|
|
90
|
-
* other check. Never a required check.
|
|
91
|
-
*/
|
|
92
31
|
export const ADVISORY_PR_CHECKS = {
|
|
93
32
|
"youiyoux · UI drift": ".github/workflows/youiyoux.yml",
|
|
94
33
|
"journeys · app (scripted)": ".github/workflows/journeys.yml",
|
|
95
34
|
"journeys · flows (scripted)": ".github/workflows/journeys.yml",
|
|
96
35
|
"upgrade path · scope": ".github/workflows/upgrade-path.yml",
|
|
97
36
|
"upgrade path": ".github/workflows/upgrade-path.yml",
|
|
37
|
+
"install smoke · ubuntu-24.04": ".github/workflows/install-smoke.yml",
|
|
38
|
+
"install smoke · macos-latest": ".github/workflows/install-smoke.yml",
|
|
98
39
|
};
|
|
99
|
-
/** The checks a release's publication waits for on its tag (.github/workflows/publish.yml, docs/plans/test-matrix.md):
|
|
100
|
-
* the release proof (the tagged tree passed every REQUIRED_PR_CHECKS check on its pull request, read from GitHub) and
|
|
101
|
-
* the publish job that needs it. The tag runs no tests again. Nothing else reported on the merge commit (main-push.yml)
|
|
102
|
-
* holds publication. */
|
|
103
40
|
export const RELEASE_TAG_CHECKS = ["release proof", "publish"];
|
|
104
41
|
export const RELEASE_TAG_WORKFLOW = ".github/workflows/publish.yml";
|
|
105
42
|
export const RELEASE_STEPS = ["gate", "approval", "check", "complete", "quiet", "deploy", "link", "ci", "merge", "tree", "tag", "publish", "homebrew", "done"];
|
|
106
|
-
/** How long each waiting step may take, in minutes, before the release stops there (rerunning continues from it). The
|
|
107
|
-
* check's covers the first attempt and the two same-commit reruns the plane may give it, each of which a busy machine
|
|
108
|
-
* may stretch to two hours (check-load.ts). */
|
|
109
43
|
export const RELEASE_LIMITS = { gate: 60, approval: 24 * 60, check: 360, quiet: 60, deploy: 30, ci: 60, publish: 45, homebrew: 45 };
|
|
110
44
|
const POLL_MS = 15_000;
|
|
111
|
-
/**
|
|
112
|
-
* Failure classes replace a flat flake allowance (docs/plans/eval-harness.md; check-failure.ts says the classes): only a
|
|
113
|
-
* failure the plane itself confirmed as infrastructure is ever run again under the same approval — at most once per
|
|
114
|
-
* incident and twice per candidate — for a release check and for a GitHub CI job alike. A failing test, a typecheck, an
|
|
115
|
-
* attack test, a migration: none tolerated. An unexplained failure blocks, and a person decides.
|
|
116
|
-
*/
|
|
117
45
|
export const INFRA_RERUNS_PER_INCIDENT = 1;
|
|
118
46
|
export const INFRA_RERUNS_PER_CANDIDATE = 2;
|
|
119
|
-
/** A stop the release reports: the step it stopped at and why, in words. */
|
|
120
47
|
class Stop extends Error {
|
|
121
48
|
reason;
|
|
122
49
|
build;
|
|
123
|
-
/** `build`: the release build itself failed before its check (not a failed check). */
|
|
124
50
|
constructor(reason, message, build = false) {
|
|
125
51
|
super(message);
|
|
126
52
|
this.reason = reason;
|
|
127
53
|
this.build = build;
|
|
128
54
|
}
|
|
129
55
|
}
|
|
130
|
-
/** The tap change's checks failed: Homebrew's own state, never a stop of a published release. */
|
|
131
56
|
class HomebrewFailed extends Error {
|
|
132
57
|
}
|
|
133
|
-
/** The branch moved before the deploy reservation: carry the approval to the new head, or file it for a person. */
|
|
134
58
|
class Restart extends Error {
|
|
135
59
|
head;
|
|
136
60
|
updated;
|
|
137
|
-
/** `updated`: Toolroll itself brought the branch up to main; the new commit is a new candidate and nothing carries. */
|
|
138
61
|
constructor(head, updated = false) {
|
|
139
62
|
super(`restart at ${head}`);
|
|
140
63
|
this.head = head;
|
|
141
64
|
this.updated = updated;
|
|
142
65
|
}
|
|
143
66
|
}
|
|
144
|
-
/** Every commit that landed after the approval, in words: the summary and the merge message list them all. */
|
|
145
67
|
export function landedWords(landed) {
|
|
146
68
|
if (landed.length === 0)
|
|
147
69
|
return [];
|
|
@@ -151,7 +73,6 @@ export function landedWords(landed) {
|
|
|
151
73
|
const branchFile = (branch) => branch.replace(/[^A-Za-z0-9._-]+/g, "_");
|
|
152
74
|
export const journalFile = (stateDir, branch) => join(stateDir, "releases", `${branchFile(branch)}.json`);
|
|
153
75
|
export const resumeCommand = (branch, checkout) => `toolroll release ${releaseBranchArg(branch)} --repo ${checkout}`;
|
|
154
|
-
/** Whole or not at all: a private temp file, synced, renamed into place, its folder synced. */
|
|
155
76
|
export function writeJournal(file, journal) {
|
|
156
77
|
mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
|
|
157
78
|
const temp = `${file}.${randomUUID()}.tmp`;
|
|
@@ -182,10 +103,7 @@ export function readJournal(file) {
|
|
|
182
103
|
throw new Error(`${file} is not a release journal this version reads`);
|
|
183
104
|
return parsed;
|
|
184
105
|
}
|
|
185
|
-
/** The release task's id: one per exact commit, so a rerun finds the task it filed instead of filing another. */
|
|
186
106
|
export const gateTaskId = (version, sha) => `release-${version.replace(/[^0-9A-Za-z.-]/g, "-")}-${sha.slice(0, 7)}`;
|
|
187
|
-
/** Whether the scope's approval is the owner's own yes to these exact bytes: a person through the password (or
|
|
188
|
-
* identity) ceremony or a chat confirmation — never a mode's coverage, an AI teammate, a routine or the lead. */
|
|
189
107
|
export function ownerApproval(gate, digest) {
|
|
190
108
|
const approval = gate.approval;
|
|
191
109
|
if (approval === null)
|
|
@@ -200,8 +118,6 @@ export function ownerApproval(gate, digest) {
|
|
|
200
118
|
return { ok: false, why: `approved as ${approval.by}, not by a person` };
|
|
201
119
|
if (approval.role !== "approver" || !approval.active)
|
|
202
120
|
return { ok: false, why: `approved by ${approval.by}, who is not an active approver` };
|
|
203
|
-
// A person's proof, recorded for these exact bytes (approval policy §1.5): a lead token or a remote API token sealed
|
|
204
|
-
// through the person's road before the fix said `password` too. A plane that can't say is not a yes.
|
|
205
121
|
if (approval.person === undefined)
|
|
206
122
|
return { ok: false, why: "the plane can't show a person gave this approval; update it first" };
|
|
207
123
|
if (!approval.person.ok)
|
|
@@ -210,10 +126,8 @@ export function ownerApproval(gate, digest) {
|
|
|
210
126
|
return { ok: false, why: "approved with a machine credential, not by a person" };
|
|
211
127
|
return { ok: true, by: approval.by, at: approval.at };
|
|
212
128
|
}
|
|
213
|
-
/** Every required check present, and every reported check's newest attempt completed successfully. */
|
|
214
129
|
export function checksVerdict(runs, required) {
|
|
215
130
|
const failed = [], waiting = [];
|
|
216
|
-
// The adapter orders attempts oldest first, so the last attempt for each name is authoritative.
|
|
217
131
|
const latest = new Map(runs.map(run => [run.name, run]));
|
|
218
132
|
for (const name of new Set([...required, ...latest.keys()])) {
|
|
219
133
|
const run = latest.get(name);
|
|
@@ -228,19 +142,10 @@ export function checksVerdict(runs, required) {
|
|
|
228
142
|
return { state: "failed", failed };
|
|
229
143
|
return waiting.length > 0 ? { state: "pending", waiting } : { state: "passed" };
|
|
230
144
|
}
|
|
231
|
-
/**
|
|
232
|
-
* Publication's verdict on the tag commit (test-matrix.md): only RELEASE_TAG_CHECKS, from GitHub Actions runs of
|
|
233
|
-
* publish.yml bound to the tag's push, each by its newest attempt. Every other check on the merge commit — main's own
|
|
234
|
-
* push run — is not waited for: the candidate's checks already passed on its exact head before the merge, the merged
|
|
235
|
-
* tree was proved equal to it, and publish.yml's release proof checks both again from GitHub's record.
|
|
236
|
-
*/
|
|
237
145
|
export function tagChecksVerdict(runs) {
|
|
238
146
|
const names = RELEASE_TAG_CHECKS;
|
|
239
|
-
// Only GitHub Actions runs of publish.yml bound to the tag's own push (release-adapters.ts readCheckRuns): a check of
|
|
240
|
-
// the same name from another workflow, an unbound run or another app is never counted (security scan).
|
|
241
147
|
return checksVerdict(runs.filter(run => names.includes(run.name) && run.app === "github-actions" && workflowIs(run.workflowPath, RELEASE_TAG_WORKFLOW)), RELEASE_TAG_CHECKS);
|
|
242
148
|
}
|
|
243
|
-
/** Run the release from wherever its journal stopped. */
|
|
244
149
|
export async function runRelease(options, adapters) {
|
|
245
150
|
const file = journalFile(options.stateDir, options.branch);
|
|
246
151
|
const resume = resumeCommand(options.branch, options.checkout);
|
|
@@ -251,10 +156,8 @@ export async function runRelease(options, adapters) {
|
|
|
251
156
|
let step = "preflight";
|
|
252
157
|
let freshApproval = false;
|
|
253
158
|
let supersededTask = null;
|
|
254
|
-
/** The commit whose check stopped the release being set aside. The stop tells a person to approve it again with --new. */
|
|
255
159
|
let stoppedCheck = null;
|
|
256
160
|
const save = () => { journal.updatedAt = adapters.now().toISOString(); writeJournal(file, journal); };
|
|
257
|
-
/** Tell the progress record about a step (v146). Never throws and never waits: the release goes on whatever it says. */
|
|
258
161
|
const mark = (at, state, detail = null) => {
|
|
259
162
|
const j = journal;
|
|
260
163
|
if (j === null || adapters.progress === undefined || at === "done")
|
|
@@ -262,7 +165,7 @@ export async function runRelease(options, adapters) {
|
|
|
262
165
|
try {
|
|
263
166
|
adapters.progress({ taskId: j.task.id, tag: j.tag, version: j.packageVersion, pr: j.pr, step: at, state, at: adapters.now(), detail });
|
|
264
167
|
}
|
|
265
|
-
catch {
|
|
168
|
+
catch { }
|
|
266
169
|
};
|
|
267
170
|
const advance = (next) => { const was = journal.step; journal.step = next; journal.stopped = null; save(); if (was !== next)
|
|
268
171
|
mark(was, "done"); };
|
|
@@ -280,8 +183,6 @@ export async function runRelease(options, adapters) {
|
|
|
280
183
|
delete j.intents.deploy;
|
|
281
184
|
save();
|
|
282
185
|
};
|
|
283
|
-
/** Ask `probe` until it answers, within this step's limit. A short network failure on the way to GitHub (git or gh
|
|
284
|
-
* timing out) is no answer yet, never the release's end: the next poll asks again, until the step's own limit. */
|
|
285
186
|
const waitFor = async (at, what, probe) => {
|
|
286
187
|
const deadline = adapters.now().getTime() + limits[at] * 60_000;
|
|
287
188
|
let said = false, unreachable = null;
|
|
@@ -334,17 +235,11 @@ export async function runRelease(options, adapters) {
|
|
|
334
235
|
say(`Released ${journal.tag} (${journal.candidate.sha.slice(0, 7)}) — nothing left to do.`);
|
|
335
236
|
return { ok: true, journal, file };
|
|
336
237
|
}
|
|
337
|
-
// Published, with Homebrew still to finish: this run finishes it, waiting for the tap's checks within its limit.
|
|
338
238
|
const finishingHomebrew = journal !== null && journal.step === "homebrew" && journal.published !== null && options.fresh !== true;
|
|
339
239
|
if (!await adapters.github.authenticated())
|
|
340
240
|
throw new Stop("github-auth", "GitHub CLI is not signed in: run `gh auth login`, then rerun.");
|
|
341
241
|
if (journal === null) {
|
|
342
242
|
journal = await begin(options, adapters, adapters.now());
|
|
343
|
-
// The earlier attempt needs a person's fresh approval (a CI failure after its deploy): this one files a task of its
|
|
344
|
-
// own for the same commit, so the old approval can't carry it.
|
|
345
|
-
// A check that stopped this same commit is the same: its task keeps that failure, so reusing it would only stop again
|
|
346
|
-
// (a passing run on it, run 3333, can't erase it). A new task reruns the check and asks a person, never the plane.
|
|
347
|
-
// Only an id that has never existed, numbered after the superseded one: never a task whose approval still stands.
|
|
348
243
|
if (freshApproval || journal.candidate.sha === stoppedCheck) {
|
|
349
244
|
const base = journal.task.id;
|
|
350
245
|
const suffix = supersededTask === null ? null : supersededTask === base ? 1 : supersededTask.startsWith(`${base}-`) ? Number(supersededTask.slice(base.length + 1)) : null;
|
|
@@ -365,13 +260,11 @@ export async function runRelease(options, adapters) {
|
|
|
365
260
|
else
|
|
366
261
|
say(`Resuming the release of ${journal.tag} (${journal.candidate.sha.slice(0, 7)}) at ${journal.step}.`);
|
|
367
262
|
const j = journal;
|
|
368
|
-
// A journal an older coordinator filed ahead of CI: its deploy reads CI fresh too.
|
|
369
263
|
if (j.ciAhead === true && j.ciBeforeDeploy !== true)
|
|
370
264
|
j.ciBeforeDeploy = true;
|
|
371
265
|
if (j.checkout !== options.checkout)
|
|
372
266
|
throw new Stop("checkout", `This release runs in ${j.checkout}; rerun with --repo ${j.checkout}.`);
|
|
373
267
|
save();
|
|
374
|
-
// Before anything merges, the branch and its pull request must still be the gated commit.
|
|
375
268
|
const pinned = async () => {
|
|
376
269
|
const head = await adapters.repo.remoteHead(j.branch);
|
|
377
270
|
if (head !== j.candidate.sha)
|
|
@@ -381,14 +274,7 @@ export async function runRelease(options, adapters) {
|
|
|
381
274
|
throw new Stop("drift", `Pull request #${j.pr} no longer has ${j.candidate.sha.slice(0, 7)} at its head.`);
|
|
382
275
|
return pr;
|
|
383
276
|
};
|
|
384
|
-
// ---- Homebrew, finished apart from publication (pipeline-speed.md, P1) ------------------------------------------
|
|
385
277
|
let homebrewLeft = null;
|
|
386
|
-
/**
|
|
387
|
-
* One look at the tap: propose the formula change when it's missing, judge its checks (once, or within the Homebrew
|
|
388
|
-
* limit when `wait`), and merge exactly the proposed head once every check passed. A tap that already names a newer
|
|
389
|
-
* version is never overwritten, checked again right before the merge. Checksums come from npm's own tarball
|
|
390
|
-
* (release-adapters.ts propose), unchanged.
|
|
391
|
-
*/
|
|
392
278
|
const homebrewPass = async (wait) => {
|
|
393
279
|
const brew = adapters.homebrew;
|
|
394
280
|
let state = await brew.state(j.packageVersion);
|
|
@@ -396,8 +282,6 @@ export async function runRelease(options, adapters) {
|
|
|
396
282
|
return { state: "superseded", why: `the tap already names ${state.version}` };
|
|
397
283
|
if (state.kind === "current")
|
|
398
284
|
return { state: "current", why: null };
|
|
399
|
-
// A change this release already proposed is the only one it ever merges (security scan): another pull request for
|
|
400
|
-
// the same version, a moved head or a closed change is failed, never adopted or merged.
|
|
401
285
|
const journaled = j.homebrew?.pr != null && j.homebrew.head != null ? { pr: j.homebrew.pr, head: j.homebrew.head } : null;
|
|
402
286
|
if (journaled !== null && state.kind === "missing")
|
|
403
287
|
return { state: "failed", why: `${brew.repo} #${journaled.pr} was closed before it merged` };
|
|
@@ -412,13 +296,9 @@ export async function runRelease(options, adapters) {
|
|
|
412
296
|
const proposed = state;
|
|
413
297
|
j.homebrew = { pr: proposed.pr, head: proposed.head, merged: false, state: "pending", why: null };
|
|
414
298
|
save();
|
|
415
|
-
// Whatever checks do register are always judged; an empty set passes only for a tap whose workflows never run
|
|
416
|
-
// on a change, and only when it's still empty a poll later.
|
|
417
299
|
const checked = await brew.checked(proposed.head);
|
|
418
300
|
let emptyLooks = 0;
|
|
419
301
|
const probe = async () => {
|
|
420
|
-
// Check runs and commit statuses are judged apart, so neither stands in for the other or hides its failure.
|
|
421
|
-
// Two apps may name a check alike; each app's attempts stand for themselves.
|
|
422
302
|
const runs = (await adapters.github.checks(brew.repo, proposed.head)).map(run => ({ ...run, name: `${run.app ?? "unknown app"}: ${run.name}` }));
|
|
423
303
|
const statuses = await brew.statuses(proposed.head);
|
|
424
304
|
const verdicts = [runs, statuses].filter(one => one.length > 0).map(one => checksVerdict(one, [...new Set(one.map(run => run.name))]));
|
|
@@ -427,8 +307,6 @@ export async function runRelease(options, adapters) {
|
|
|
427
307
|
throw new HomebrewFailed(`the tap change's checks failed: ${failed.join(", ")}`);
|
|
428
308
|
if (verdicts.some(one => one.state === "pending"))
|
|
429
309
|
return null;
|
|
430
|
-
// GitHub registers checks asynchronously; an empty set says nothing about success.
|
|
431
|
-
// A workflow is owed: only its own run counts, not another app's green check.
|
|
432
310
|
if (checked && !runs.some(run => run.app === "github-actions"))
|
|
433
311
|
return null;
|
|
434
312
|
if (runs.length === 0 && statuses.length === 0)
|
|
@@ -443,12 +321,10 @@ export async function runRelease(options, adapters) {
|
|
|
443
321
|
catch (error) {
|
|
444
322
|
if (error instanceof HomebrewFailed)
|
|
445
323
|
return { state: "failed", why: `${brew.repo} #${proposed.pr}: ${error.message}` };
|
|
446
|
-
// Waiting ran out: still pending, never a stop of a published release.
|
|
447
324
|
if (error instanceof Stop && error.reason === "timeout")
|
|
448
325
|
return { state: "pending", why: error.message };
|
|
449
326
|
throw error;
|
|
450
327
|
}
|
|
451
|
-
// Ordering, once more right before the merge: a newer formula landed meanwhile is never overwritten.
|
|
452
328
|
const now = await brew.state(j.packageVersion);
|
|
453
329
|
if (now.kind === "newer")
|
|
454
330
|
return { state: "superseded", why: `the tap already names ${now.version}` };
|
|
@@ -464,15 +340,12 @@ export async function runRelease(options, adapters) {
|
|
|
464
340
|
await brew.merge(proposed.pr, proposed.head);
|
|
465
341
|
return { state: "current", why: null };
|
|
466
342
|
};
|
|
467
|
-
// ---- one approval per release (release-once.md) -------------------------------------------------------------
|
|
468
343
|
const rel = adapters.release;
|
|
469
|
-
/** One-tap release approval: tell the plane, never stopping or changing the release whatever it answers. */
|
|
470
344
|
const tell = async (act) => { if (rel?.ready === undefined)
|
|
471
345
|
return; try {
|
|
472
346
|
await act(rel.ready);
|
|
473
347
|
}
|
|
474
|
-
catch {
|
|
475
|
-
/** The last pull request checks this run read on the candidate (the gate reads them before the task exists). */
|
|
348
|
+
catch { } };
|
|
476
349
|
let lastCi = null;
|
|
477
350
|
const noteCi = async (runs, verdict) => {
|
|
478
351
|
lastCi = { candidate: j.candidate.sha, state: verdict.state === "pending" ? "running" : verdict.state, failed: verdict.failed ?? [], runs: runs.filter(run => REQUIRED_PR_CHECKS.includes(run.name)) };
|
|
@@ -481,9 +354,7 @@ export async function runRelease(options, adapters) {
|
|
|
481
354
|
};
|
|
482
355
|
const currentCi = () => lastCi;
|
|
483
356
|
let epoch = null;
|
|
484
|
-
// This invocation's own lease owner (review round 1): two runs of the same journal never share an epoch.
|
|
485
357
|
const owner = `${j.id}:${randomUUID()}`;
|
|
486
|
-
/** Take the release's lease (a takeover raises its epoch), then settle every operation still open before any new work. */
|
|
487
358
|
const hold = async () => {
|
|
488
359
|
if (rel === undefined || !j.authority)
|
|
489
360
|
return;
|
|
@@ -497,11 +368,8 @@ export async function runRelease(options, adapters) {
|
|
|
497
368
|
if (rel === undefined || !j.authority)
|
|
498
369
|
return;
|
|
499
370
|
for (const op of (await rel.operations(j.authority.id)).filter(one => one.state === "reserved" || one.state === "running" || one.state === "unknown")) {
|
|
500
|
-
// A started call whose issuer may still be alive may still land (review round 2): nothing is settled for it on
|
|
501
|
-
// elapsed time. It stays as it is, and a person looks.
|
|
502
371
|
const inFlight = () => new Stop("operation-in-flight", `An earlier ${op.kind} (operation ${op.id}) was started by a process that may still be running. Nothing was settled: check that process, then rerun.`);
|
|
503
372
|
if (op.kind === "deploy") {
|
|
504
|
-
// Reserved and never started: nothing to undo (a start after this takeover is refused: its epoch moved).
|
|
505
373
|
if (op.state === "reserved") {
|
|
506
374
|
await rel.finish(op.id, "failed", { detail: "the call never started" }, epoch);
|
|
507
375
|
continue;
|
|
@@ -513,7 +381,6 @@ export async function runRelease(options, adapters) {
|
|
|
513
381
|
if (!op.issuerGone)
|
|
514
382
|
throw inFlight();
|
|
515
383
|
if (op.direct) {
|
|
516
|
-
// A person's own deploy: its process is gone; its lock, update pause and journal must say nothing is half done.
|
|
517
384
|
if (!await adapters.toolroll.deploymentIdle(op.stage))
|
|
518
385
|
throw new Stop("deploy-recovery", `A person's deploy of this release (operation ${op.id}) ended without finishing${op.stage === null ? "" : `; its journal is in ${op.stage}`}. Recover it, then rerun.`);
|
|
519
386
|
await rel.finish(op.id, "failed", { detail: "reconciled: the deploy's process ended, and nothing is deployed or half done" }, epoch);
|
|
@@ -523,7 +390,6 @@ export async function runRelease(options, adapters) {
|
|
|
523
390
|
await rel.finish(op.id, "failed", { detail: "reconciled: recovered the previous build" }, epoch);
|
|
524
391
|
}
|
|
525
392
|
else {
|
|
526
|
-
// The pull request decides an unknown merge: merged from the gated head is a success, whoever issued it.
|
|
527
393
|
const pr = await adapters.github.pullRequest(j.github, j.branch);
|
|
528
394
|
if (pr?.state === "merged" && pr.number === j.pr && pr.head === op.candidate && pr.mergeCommit !== null)
|
|
529
395
|
await rel.finish(op.id, "succeeded", { externalRef: pr.mergeCommit, detail: "reconciled: the pull request is merged from the gated head" }, epoch);
|
|
@@ -538,11 +404,6 @@ export async function runRelease(options, adapters) {
|
|
|
538
404
|
}
|
|
539
405
|
}
|
|
540
406
|
};
|
|
541
|
-
/**
|
|
542
|
-
* Who and what the release is, read again: the repository, the pull request (open, its number, base main) and its
|
|
543
|
-
* head, and the live-release predicate for the coming action. Before the deploy reservation a moved head restarts
|
|
544
|
-
* the release for the new commit; after it, it stops, and the new commit needs a person.
|
|
545
|
-
*/
|
|
546
407
|
const identity = async (action, beforeReservation) => {
|
|
547
408
|
if (rel === undefined) {
|
|
548
409
|
await pinned();
|
|
@@ -563,27 +424,17 @@ export async function runRelease(options, adapters) {
|
|
|
563
424
|
}
|
|
564
425
|
if (j.authority) {
|
|
565
426
|
const live = await rel.live(j.task.id, action);
|
|
566
|
-
// Fail closed: once the release has an authority, its task must be one the predicate applies to AND accepts.
|
|
567
427
|
if (!live.applies || !live.ok)
|
|
568
428
|
throw new Stop("release", `Task ${j.task.id} can't ${action === "dispatch" ? "go on" : action}: ${live.applies ? live.why ?? "its release approval doesn't stand" : "it belongs to no release approval this plane can find"}.`);
|
|
569
429
|
if (epoch !== null && !await rel.renew(j.authority.id, owner, epoch))
|
|
570
430
|
throw new Stop("lease", "Another release coordinator took over this release.");
|
|
571
431
|
}
|
|
572
432
|
};
|
|
573
|
-
/** The head moved before the deploy reservation: carry the approval to it, or file it for a person. Nothing kept from
|
|
574
|
-
* the old step is used afterwards: the journal is rewritten and the state machine runs again. */
|
|
575
|
-
/**
|
|
576
|
-
* A pull request check failed after the deploy reservation (Alex, 2026-10-25): the candidate froze at deploy, so the
|
|
577
|
-
* release needs a person's fresh approval, even for the same commit. It is persisted (the authority stops; the
|
|
578
|
-
* journal says so) before the release stops; `--new` files the commit for a person again.
|
|
579
|
-
*/
|
|
580
433
|
const ciFailedAfterDeploy = async (what, deploy = "after") => {
|
|
581
434
|
j.needsApproval = true;
|
|
582
435
|
save();
|
|
583
|
-
// An automatic approval never outlives a CI failure: the owner is told, and a person approves again.
|
|
584
436
|
if (j.auto?.state === "approved")
|
|
585
437
|
await rel?.auto?.giveUp(j.task.id, deploy === "after" ? `${what}, after the deploy` : what);
|
|
586
|
-
// Fail closed: the authority must have stopped; otherwise its approval could still carry the commit.
|
|
587
438
|
if (rel !== undefined && j.authority && (epoch === null || !await rel.needsApproval(j.authority.id, deploy === "after" ? "a pull request check failed after the deploy" : "a pull request check failed before the deploy", epoch))) {
|
|
588
439
|
throw new Stop("lease", `${what}. Nothing was merged, but this release's approval couldn't be stopped (another coordinator holds it, or a merge is reserved). Check it with \`toolroll release ${j.branch} --repo ${j.checkout}\` before going on.`);
|
|
589
440
|
}
|
|
@@ -591,16 +442,7 @@ export async function runRelease(options, adapters) {
|
|
|
591
442
|
? `${what}. Nothing was merged. The deploy had already started, so this commit needs a person's approval again: run \`toolroll release ${j.branch} --repo ${j.checkout} --new\`.`
|
|
592
443
|
: `${what}. Nothing was deployed or merged. This commit needs a person's approval: run \`toolroll release ${j.branch} --repo ${j.checkout} --new\`.`);
|
|
593
444
|
};
|
|
594
|
-
/** An automatic approval's CI allowance: only attempts GitHub shows failing before the tests ran, at most
|
|
595
|
-
* INFRA_RERUNS_PER_CANDIDATE on the commit; a person's approval judges each job by its latest attempt. */
|
|
596
445
|
const autoCap = () => (j.auto?.state === "approved" ? { auto: true } : {});
|
|
597
|
-
/**
|
|
598
|
-
* An automatically approved release stands only while its CI does (auto-approve-green.md): the complete, current
|
|
599
|
-
* checks on the exact commit are read again right before each step that can't be taken back — the deploy, the CLI
|
|
600
|
-
* relink, the merge and the tag. Anything but green (failed, a job re-run and pending, an earlier failure GitHub
|
|
601
|
-
* doesn't show as the runner's own) stops the
|
|
602
|
-
* release, revokes its approval and tells the owner; the commit then needs a person.
|
|
603
|
-
*/
|
|
604
446
|
const autoCiHolds = async (before) => {
|
|
605
447
|
if (j.auto?.state !== "approved")
|
|
606
448
|
return;
|
|
@@ -612,7 +454,6 @@ export async function runRelease(options, adapters) {
|
|
|
612
454
|
return;
|
|
613
455
|
}
|
|
614
456
|
if (before === "the tag") {
|
|
615
|
-
// Already merged: nothing to revoke. It isn't tagged or published, and a person decides — durably, in the plane.
|
|
616
457
|
const why = `Pull request checks on ${j.candidate.sha.slice(0, 7)} stopped passing after the merge`;
|
|
617
458
|
await rel?.auto?.holdPublish(j.task.id, why);
|
|
618
459
|
await rel?.auto?.giveUp(j.task.id, why);
|
|
@@ -620,13 +461,11 @@ export async function runRelease(options, adapters) {
|
|
|
620
461
|
}
|
|
621
462
|
await ciFailedAfterDeploy(`Pull request checks on ${j.candidate.sha.slice(0, 7)} are no longer all passing before ${before}: ${(verdict.state === "failed" ? verdict.failed : verdict.waiting).join(", ")}`, before === "the deploy" && j.deploy === null ? "before" : "after");
|
|
622
463
|
};
|
|
623
|
-
/** A publication held for a person (the plane's record) stops the tag, the publication and Homebrew. */
|
|
624
464
|
const publishHold = async () => {
|
|
625
465
|
const held = rel?.auto === undefined ? null : await rel.auto.publishHeld(j.task.id);
|
|
626
466
|
if (held !== null)
|
|
627
467
|
throw new Stop("approval", `${held}. It was merged; nothing more is tagged, published or sent to Homebrew until a person lets it go on: \`toolroll release publish-ok ${j.task.id} --as <you> --token <password>\`, then rerun.`);
|
|
628
468
|
};
|
|
629
|
-
/** GitHub's nightly lane debt before a deploy, the merge or the tag (evals-nightly.md, part A2). */
|
|
630
469
|
const nightlyHolds = async (phase) => {
|
|
631
470
|
if (rel?.nightly === undefined)
|
|
632
471
|
return;
|
|
@@ -636,14 +475,8 @@ export async function runRelease(options, adapters) {
|
|
|
636
475
|
if (!answer.ok)
|
|
637
476
|
throw new Stop("nightly-debt", `${answer.why} Nothing was ${phase === "deploy" ? "deployed" : phase === "merge" ? "merged" : "tagged or published"}; rerun the release once it passes.`);
|
|
638
477
|
};
|
|
639
|
-
/** identity(), on a plane that keeps release authority; a legacy plane keeps the old rules. */
|
|
640
478
|
const watch = async (action) => { if (rel !== undefined)
|
|
641
479
|
await identity(action, true); };
|
|
642
|
-
/**
|
|
643
|
-
* Behind main (plain-toolroll.md P2.6): update the branch under this release's lease and the head it was gated on.
|
|
644
|
-
* A concurrent push aborts it. The approval stops first, so nothing can ride it across the update; the updated head
|
|
645
|
-
* is a new candidate with a new approval, fresh CI and a fresh check, and there is no carry.
|
|
646
|
-
*/
|
|
647
480
|
const updateFromMain = async () => {
|
|
648
481
|
const update = adapters.github.updateBranch;
|
|
649
482
|
if (update === undefined)
|
|
@@ -667,10 +500,6 @@ export async function runRelease(options, adapters) {
|
|
|
667
500
|
return head !== null && head !== j.candidate.sha ? head : null;
|
|
668
501
|
});
|
|
669
502
|
};
|
|
670
|
-
/**
|
|
671
|
-
* Move the release back to an earlier step: write the fields the caller names (and only those), drop the named steps'
|
|
672
|
-
* intents, set the step, and save the journal. Every step-back goes through here.
|
|
673
|
-
*/
|
|
674
503
|
const rewindTo = (step, fields, dropIntents = []) => {
|
|
675
504
|
Object.assign(j, fields);
|
|
676
505
|
for (const one of dropIntents)
|
|
@@ -679,7 +508,6 @@ export async function runRelease(options, adapters) {
|
|
|
679
508
|
save();
|
|
680
509
|
};
|
|
681
510
|
const restart = async (head, updated = false) => {
|
|
682
|
-
// The step this commit was at ends here: the release goes on with the new commit (and, filed again, a new task).
|
|
683
511
|
mark(j.step, "failed", `${j.branch} moved to ${head.slice(0, 7)}`);
|
|
684
512
|
const tree = await adapters.repo.tree(head);
|
|
685
513
|
if (updated)
|
|
@@ -689,7 +517,6 @@ export async function runRelease(options, adapters) {
|
|
|
689
517
|
const carried = await rel.carry(j.authority.id, head, randomUUID(), epoch);
|
|
690
518
|
if (carried.ok) {
|
|
691
519
|
const view = await rel.authority(carried.taskId);
|
|
692
|
-
// The candidate is written before the gate is read, as it always was: a gate that fails leaves it moved.
|
|
693
520
|
j.candidate = { sha: head, tree };
|
|
694
521
|
const task = { id: carried.taskId, scopeDigest: (await adapters.toolroll.gate(carried.taskId)).scopeDigest };
|
|
695
522
|
rewindTo("check", { task, check: null, completion: null, landed: view?.landed ?? j.landed ?? [], stopped: null }, ["check", "complete"]);
|
|
@@ -704,19 +531,11 @@ export async function runRelease(options, adapters) {
|
|
|
704
531
|
rewindTo("gate", { candidate: { sha: head, tree }, task: { id: gateTaskId(j.packageVersion, head), scopeDigest: null },
|
|
705
532
|
approval: null, check: null, completion: null, authority: null, auto: null, stopped: null }, ["gate", "check", "complete"]);
|
|
706
533
|
};
|
|
707
|
-
/**
|
|
708
|
-
* The automatic road ended without an approval: the plane takes its `auto-check` back (the task asks a person, its
|
|
709
|
-
* passing check kept) and tells the owner; the release waits at approval for a person, as without the setting.
|
|
710
|
-
*/
|
|
711
534
|
const autoRefused = async (why) => {
|
|
712
535
|
rewindTo("approval", { auto: { state: "refused", why }, check: null });
|
|
713
536
|
await rel?.auto?.giveUp(j.task.id, why);
|
|
714
537
|
throw new Stop("approval", `Not approved automatically: ${why}. A person approves task ${j.task.id} (\`toolroll task approve ${j.task.id} --digest ${j.task.scopeDigest}\`, or the console), then rerun \`${resume}\`.`);
|
|
715
538
|
};
|
|
716
|
-
/**
|
|
717
|
-
* CI passed on the candidate as the coordinator read it: the plane reads it itself and lifts the approval hold it
|
|
718
|
-
* placed when the task was filed ahead of CI (round 1, finding 4). A refusal stops here; nobody was asked.
|
|
719
|
-
*/
|
|
720
539
|
const liftCiHold = async (ask, nothing) => {
|
|
721
540
|
const lift = rel?.auto?.ciPassed;
|
|
722
541
|
if (lift === undefined)
|
|
@@ -725,11 +544,6 @@ export async function runRelease(options, adapters) {
|
|
|
725
544
|
if (!lifted.ok)
|
|
726
545
|
throw new Stop("ci-failed", `The plane didn't confirm CI passed on ${j.candidate.sha.slice(0, 7)}: ${lifted.why}. ${nothing}. Rerun \`${resume}\` once every pull request check passes.`);
|
|
727
546
|
};
|
|
728
|
-
/**
|
|
729
|
-
* One look at the pull request's required checks on the exact commit while CI may still run: a failed check stops
|
|
730
|
-
* (`nothing` says what hasn't happened), passed ends the plane's "CI still running" note, pending (or GitHub not
|
|
731
|
-
* answering) answers false. Judged as the ci step judges a person's release (prChecksVerdict, ci.yml, exact head).
|
|
732
|
-
*/
|
|
733
547
|
const ciWhileRunning = async (nothing, ask) => {
|
|
734
548
|
let runs;
|
|
735
549
|
try {
|
|
@@ -747,8 +561,6 @@ export async function runRelease(options, adapters) {
|
|
|
747
561
|
}
|
|
748
562
|
if (verdict.state !== "passed")
|
|
749
563
|
return false;
|
|
750
|
-
// The plane's note can survive a crash before the journal saved ciAhead. Clear it on the plane's own reading,
|
|
751
|
-
// even on an older/resumed journal whose flags say nothing about CI.
|
|
752
564
|
await liftCiHold(ask, nothing);
|
|
753
565
|
if (j.ciAhead === true) {
|
|
754
566
|
j.ciAhead = false;
|
|
@@ -756,8 +568,6 @@ export async function runRelease(options, adapters) {
|
|
|
756
568
|
}
|
|
757
569
|
return true;
|
|
758
570
|
};
|
|
759
|
-
/** Every person's release reads exact-head CI at deployment, even if it was green at the gate or an older
|
|
760
|
-
* journal has no ciBeforeDeploy flag. An approval and the release check can outlive that earlier green reading. */
|
|
761
571
|
const personCiBeforeDeploy = async () => {
|
|
762
572
|
if (j.auto?.state === "approved")
|
|
763
573
|
return;
|
|
@@ -773,15 +583,9 @@ export async function runRelease(options, adapters) {
|
|
|
773
583
|
return null;
|
|
774
584
|
});
|
|
775
585
|
};
|
|
776
|
-
/**
|
|
777
|
-
* The task is approved for `action`: a release task (a carried commit, or any task once the release has an
|
|
778
|
-
* authority) only when the live-release predicate applies to it AND accepts it — fail closed, whatever its own seal
|
|
779
|
-
* says. Anything else needs the owner's own approval of these exact words (which a carried seal never is).
|
|
780
|
-
*/
|
|
781
586
|
const approved = async (gate, action = "dispatch") => {
|
|
782
587
|
if (gate.candidate !== j.candidate.sha || gate.scopeDigest !== j.task.scopeDigest)
|
|
783
588
|
throw new Stop("scope-changed", `Task ${j.task.id}'s candidate or scope changed after approval.`);
|
|
784
|
-
// Checking automatically: the plane's `auto-check` seal must still stand (the setting on, its evidence, this digest).
|
|
785
589
|
if (j.auto?.state === "checking" && !j.authority) {
|
|
786
590
|
const standing = rel?.auto === undefined ? { ok: false, why: "this plane can't approve releases automatically" } : await rel.auto.checking(j.task.id);
|
|
787
591
|
if (standing.ok)
|
|
@@ -804,7 +608,6 @@ export async function runRelease(options, adapters) {
|
|
|
804
608
|
if (gate.result.check !== "passed")
|
|
805
609
|
throw new Stop("check-failed", checkFailedWords({ sha: j.candidate.sha, run: gate.result.run, class: null, why: `its check reads ${gate.result.check}`, branch: j.branch, checkout: j.checkout, taskId: j.task.id }));
|
|
806
610
|
};
|
|
807
|
-
/** The commit the passing build recorded: what the deployed runtime is stamped with. */
|
|
808
611
|
const builtHead = () => j.check?.head ?? j.candidate.sha;
|
|
809
612
|
const checked = async (gate, action = "dispatch") => {
|
|
810
613
|
await approved(gate, action);
|
|
@@ -814,7 +617,6 @@ export async function runRelease(options, adapters) {
|
|
|
814
617
|
};
|
|
815
618
|
if (j.needsApproval === true)
|
|
816
619
|
throw new Stop("ci-failed", `A pull request check failed after the deploy, so ${j.candidate.sha.slice(0, 7)} needs a person's approval again: run \`toolroll release ${j.branch} --repo ${j.checkout} --new\`.`);
|
|
817
|
-
// A resumed release that already has an authority takes its lease and settles every open operation first.
|
|
818
620
|
await hold();
|
|
819
621
|
while (j.step !== "done" && homebrewLeft === null) {
|
|
820
622
|
step = j.step;
|
|
@@ -824,8 +626,6 @@ export async function runRelease(options, adapters) {
|
|
|
824
626
|
switch (j.step) {
|
|
825
627
|
case "gate": {
|
|
826
628
|
await pinned();
|
|
827
|
-
// The same commit's earlier gate belongs to a release that no longer stands (a CI failure after its deploy, a
|
|
828
|
-
// revoke): a fresh task asks a person again, and their yes opens a new generation.
|
|
829
629
|
if (rel !== undefined && j.freshTask !== true) {
|
|
830
630
|
const base = gateTaskId(j.packageVersion, j.candidate.sha);
|
|
831
631
|
for (let n = 1; n < 50; n++) {
|
|
@@ -840,8 +640,6 @@ export async function runRelease(options, adapters) {
|
|
|
840
640
|
}
|
|
841
641
|
}
|
|
842
642
|
}
|
|
843
|
-
// The tree CI tested (the pull request's head, not GitHub's merge commit) is the tree that merges only when the
|
|
844
|
-
// branch already contains main's head: refused here, before anything is filed, and again right before merging.
|
|
845
643
|
try {
|
|
846
644
|
await containsMain(adapters, j, "Nothing was filed or sent for approval");
|
|
847
645
|
}
|
|
@@ -856,21 +654,15 @@ export async function runRelease(options, adapters) {
|
|
|
856
654
|
if (j.intents.gate === undefined)
|
|
857
655
|
await mainProtection(adapters, j, false, "Nothing was filed or sent for approval");
|
|
858
656
|
const existing = await adapters.toolroll.gate(j.task.id);
|
|
859
|
-
// A fresh task this journal never filed has appeared under its id: it isn't ours, and isn't a fresh approval.
|
|
860
657
|
if (existing.exists && j.freshTask === true && j.intents.gate === undefined)
|
|
861
658
|
throw new Stop("approval", `Task ${j.task.id} appeared before this release filed it; rerun with --new.`);
|
|
862
659
|
if (existing.exists) {
|
|
863
|
-
// Filed already (a resume after a lost answer): the task stands, and the ci step judges its checks.
|
|
864
660
|
if (existing.candidate !== j.candidate.sha)
|
|
865
661
|
throw new Stop("conflict", `Task ${j.task.id} exists for a different commit (${existing.candidate?.slice(0, 7) ?? "none"}).`);
|
|
866
662
|
j.task.scopeDigest = existing.scopeDigest;
|
|
867
663
|
}
|
|
868
664
|
else {
|
|
869
|
-
// The gate only stops on a check that already failed: the task is filed and a person asked while CI runs, and
|
|
870
|
-
// the release check runs beside it (pipeline-speed.md, D2 and "Decision: a person's release asks during
|
|
871
|
-
// CI"). The automatic approval waits for CI (the check step); nothing deploys before it passes (the deploy).
|
|
872
665
|
const settled = await earlyChecks(adapters, j, (what, probe) => waitFor("gate", what, probe), { pendingIsEnough: true, seen: (runs, verdict) => noteCi(runs, verdict) });
|
|
873
|
-
// Recorded before the task exists, so its approval card says CI still runs from the first moment.
|
|
874
666
|
if (!settled)
|
|
875
667
|
await rel?.auto?.ciRunning?.(j.task.id, j.candidate.sha);
|
|
876
668
|
j.ciAhead = !settled;
|
|
@@ -889,7 +681,6 @@ export async function runRelease(options, adapters) {
|
|
|
889
681
|
...(rel === undefined ? {} : { release: { version: j.packageVersion, pr: j.pr, branch: j.branch, noCarry: options.noCarry === true } }),
|
|
890
682
|
});
|
|
891
683
|
j.task.scopeDigest = filed.scopeDigest;
|
|
892
|
-
// The checks the gate read before the task existed, kept for its approval sheet now that it does.
|
|
893
684
|
const seen = currentCi();
|
|
894
685
|
if (seen !== null)
|
|
895
686
|
await tell(ready => ready.ci({ taskId: j.task.id, ...seen }));
|
|
@@ -898,9 +689,6 @@ export async function runRelease(options, adapters) {
|
|
|
898
689
|
break;
|
|
899
690
|
}
|
|
900
691
|
case "approval": {
|
|
901
|
-
// Approve automatically when checks pass (auto-approve-green.md): with the project's setting on, the plane seals
|
|
902
|
-
// `auto-check` so the release check runs first; the approval itself is sealed after it passed. A fresh task
|
|
903
|
-
// after a CI failure after the deploy, or an automatic refusal, always asks a person.
|
|
904
692
|
const auto = rel?.auto;
|
|
905
693
|
if (auto !== undefined && j.freshTask !== true && j.auto?.state !== "refused" && j.task.scopeDigest !== null && await auto.setting(j.task.id)) {
|
|
906
694
|
await watch("dispatch");
|
|
@@ -921,12 +709,8 @@ export async function runRelease(options, adapters) {
|
|
|
921
709
|
say(` Not approved automatically: ${authorized.why}. A person approves it.`);
|
|
922
710
|
}
|
|
923
711
|
}
|
|
924
|
-
// Filed while CI still runs: the person is asked now (Alex, 2026-10-29), and told nothing deploys until CI passes.
|
|
925
|
-
// A check that already failed asks nobody (as at the gate).
|
|
926
712
|
if (j.ciAhead === true)
|
|
927
713
|
await ciWhileRunning("Nothing was deployed or merged", true);
|
|
928
|
-
// One push, on every entry to this step (a fresh filing or a resumed one): the plane files it once per task and
|
|
929
|
-
// scope digest, so a crash between filing and here is healed by the next run.
|
|
930
714
|
await tell(ready => ready.asked(j.task.id));
|
|
931
715
|
say(` The release scope needs your approval: \`toolroll task approve ${j.task.id} --digest ${j.task.scopeDigest}\`, or open the task in the console.`);
|
|
932
716
|
say(` Or approve it from here: \`toolroll release approve ${releaseBranchArg(j.branch)}\`.`);
|
|
@@ -934,8 +718,6 @@ export async function runRelease(options, adapters) {
|
|
|
934
718
|
say(` ${CI_RUNNING_WORDS}`);
|
|
935
719
|
const approved = await waitFor("approval", `a person to approve task ${j.task.id}`, async () => {
|
|
936
720
|
await watch("dispatch");
|
|
937
|
-
// While asking: a check that failed stops here (nobody approves a red commit), and CI passing ends the card's
|
|
938
|
-
// "still running" note (and lifts a hold an older coordinator placed).
|
|
939
721
|
if (j.ciAhead === true)
|
|
940
722
|
await ciWhileRunning("Nothing was deployed or merged", true);
|
|
941
723
|
const gate = await adapters.toolroll.gate(j.task.id);
|
|
@@ -948,7 +730,6 @@ export async function runRelease(options, adapters) {
|
|
|
948
730
|
});
|
|
949
731
|
j.approval = { by: approved.by, at: approved.at };
|
|
950
732
|
say(` approved by ${approved.by}`);
|
|
951
|
-
// The person's yes to release terms opened the release's authority: hold its lease from here on.
|
|
952
733
|
if (rel !== undefined) {
|
|
953
734
|
const view = await rel.authority(j.task.id);
|
|
954
735
|
if (view !== null) {
|
|
@@ -964,15 +745,11 @@ export async function runRelease(options, adapters) {
|
|
|
964
745
|
}
|
|
965
746
|
case "check": {
|
|
966
747
|
const checkProbe = async () => {
|
|
967
|
-
// Before acting on an old candidate's failure: a moved head restarts the release first.
|
|
968
748
|
await watch("dispatch");
|
|
969
749
|
const gate = await adapters.toolroll.gate(j.task.id);
|
|
970
750
|
await approved(gate);
|
|
971
|
-
// A rerun of the same approved commit is on its way: the failure before it is not this release's answer.
|
|
972
751
|
if (gate.pending === true && gate.result?.check !== "passed")
|
|
973
752
|
return null;
|
|
974
|
-
// A failed Full check: the plane says why (its own records only) and reruns it under the same approval only
|
|
975
|
-
// for confirmed infrastructure; every attempt stays in the evidence. Anything else stops, saying its class.
|
|
976
753
|
if (gate.failed === null && gate.result !== null && gate.result.level === "full" && gate.result.check === "failed" && rel?.recheck !== undefined) {
|
|
977
754
|
const answer = await rel.recheck(j.task.id);
|
|
978
755
|
if (answer.action === "pending")
|
|
@@ -987,8 +764,6 @@ export async function runRelease(options, adapters) {
|
|
|
987
764
|
throw new Stop("check-failed", `The release build of ${j.task.id} failed: ${gate.failed}. Fix it and release the new commit with --new.`, true);
|
|
988
765
|
if (gate.result === null || gate.result.check === "running" || gate.result.check === "pending")
|
|
989
766
|
return null;
|
|
990
|
-
// The build records a prepared candidate as a commit of its own (its message names the task): it must hold
|
|
991
|
-
// exactly the candidate's tree, or it isn't the release.
|
|
992
767
|
const head = gate.result.head;
|
|
993
768
|
if (head === null || (head !== j.candidate.sha && await adapters.repo.tree(head) !== await adapters.repo.tree(j.candidate.sha))) {
|
|
994
769
|
throw new Stop("drift", `The release result is for ${head?.slice(0, 7) ?? "no commit"}, which doesn't hold exactly ${j.candidate.sha.slice(0, 7)}'s files.`);
|
|
@@ -996,8 +771,6 @@ export async function runRelease(options, adapters) {
|
|
|
996
771
|
fullCheck(gate);
|
|
997
772
|
if (gate.result.worktree === null)
|
|
998
773
|
throw new Stop("worktree", `Run ${gate.result.run} names no checkout to deploy from.`);
|
|
999
|
-
// A pass stands only when no earlier attempt on this commit failed for a reason other than confirmed
|
|
1000
|
-
// infrastructure the release reran; what passed only on a retry is said (and an automatic approval refuses it).
|
|
1001
774
|
if (rel?.standing !== undefined) {
|
|
1002
775
|
const standing = await rel.standing(j.task.id, gate.result.run);
|
|
1003
776
|
if (!standing.ok)
|
|
@@ -1007,8 +780,6 @@ export async function runRelease(options, adapters) {
|
|
|
1007
780
|
else if (standing.retried.length > 0)
|
|
1008
781
|
say(` run ${gate.result.run} passed, but only on a retry: ${standing.retried.join(", ")}`);
|
|
1009
782
|
}
|
|
1010
|
-
// A sandboxed Full check must show that what it skipped passed elsewhere (trusted-release-reports.md H3). The plane
|
|
1011
|
-
// answers at once for a check that ran unsandboxed, as Toolroll's own do: nothing there skips for this reason.
|
|
1012
783
|
if (rel?.fencedCoverage !== undefined) {
|
|
1013
784
|
const covered = await rel.fencedCoverage(j.task.id, gate.result.run, j.candidate.sha);
|
|
1014
785
|
if (!covered.ok)
|
|
@@ -1023,8 +794,6 @@ export async function runRelease(options, adapters) {
|
|
|
1023
794
|
return await checkProbe();
|
|
1024
795
|
}
|
|
1025
796
|
catch (error) {
|
|
1026
|
-
// A failed check (or a changed candidate) ends the automatic road: the owner is told, and a person decides.
|
|
1027
|
-
// A failed check is told, and stays checkable again on the same commit (a flake); anything else ends the road.
|
|
1028
797
|
if (error instanceof Stop && j.auto?.state === "checking" && error.reason === "check-failed" && !error.build)
|
|
1029
798
|
await rel?.auto?.checkFailed(j.task.id, error.message.replace(/\.$/, ""));
|
|
1030
799
|
else if (error instanceof Stop && j.auto?.state === "checking" && error.reason !== "approval")
|
|
@@ -1035,8 +804,6 @@ export async function runRelease(options, adapters) {
|
|
|
1035
804
|
j.check = result;
|
|
1036
805
|
say(` run ${result.run} passed on ${j.candidate.sha.slice(0, 7)}`);
|
|
1037
806
|
if (j.auto?.state === "checking" && !j.authority) {
|
|
1038
|
-
// The check ran beside CI (the gate didn't wait): it waits for every pull request check now. A failure ends the
|
|
1039
|
-
// automatic road, and the person's road refuses it too (the approval step waits for CI first).
|
|
1040
807
|
if (j.ciAhead === true) {
|
|
1041
808
|
try {
|
|
1042
809
|
await earlyChecks(adapters, j, (what, probe) => waitFor("gate", what, probe), { nothing: "Nothing was approved" });
|
|
@@ -1052,7 +819,6 @@ export async function runRelease(options, adapters) {
|
|
|
1052
819
|
j.ciAhead = false;
|
|
1053
820
|
save();
|
|
1054
821
|
}
|
|
1055
|
-
// The release approval, sealed only now: the plane reads CI on the exact commit itself and proves the check.
|
|
1056
822
|
const sealed = rel?.auto === undefined ? { ok: false, why: "this plane can't approve releases automatically" }
|
|
1057
823
|
: await rel.auto.approve({ taskId: j.task.id, digest: j.task.scopeDigest, candidate: j.candidate.sha, run: result.run, receipt: result.receipt });
|
|
1058
824
|
if (!sealed.ok)
|
|
@@ -1080,8 +846,6 @@ export async function runRelease(options, adapters) {
|
|
|
1080
846
|
await checked(gate, "complete");
|
|
1081
847
|
if (gate.completion?.digest !== check.receipt) {
|
|
1082
848
|
intend("complete");
|
|
1083
|
-
// Toolroll proves the check's build stopped by itself (stop-proof.ts) a short while after it finished: the
|
|
1084
|
-
// release waits for that, never for a person to confirm it.
|
|
1085
849
|
const done = await waitFor("quiet", "Toolroll to make sure the release check stopped", async () => {
|
|
1086
850
|
const tried = await adapters.toolroll.complete(j.task.id, check.receipt);
|
|
1087
851
|
return !tried.ok && tried.reason === "stopping" ? null : tried;
|
|
@@ -1109,16 +873,12 @@ export async function runRelease(options, adapters) {
|
|
|
1109
873
|
const check = j.check;
|
|
1110
874
|
await recoverDeploy();
|
|
1111
875
|
await checked(await adapters.toolroll.gate(j.task.id), "deploy");
|
|
1112
|
-
// A deployment that finished but whose answer was lost: the services already run a runtime of this commit.
|
|
1113
876
|
let runtime = await served(adapters, builtHead());
|
|
1114
|
-
// Already running this candidate (a new generation after a CI failure, or a lost answer): the release still
|
|
1115
|
-
// reserves its deploy, so its merge has a deploy to stand on.
|
|
1116
877
|
if (runtime !== null && rel !== undefined && j.authority && epoch !== null) {
|
|
1117
878
|
const authority = await rel.authority(j.task.id);
|
|
1118
879
|
if (authority !== null && authority.state === "open") {
|
|
1119
880
|
await personCiBeforeDeploy();
|
|
1120
881
|
await watch("deploy");
|
|
1121
|
-
// Every deploy reservation, whatever the journal saved: CI must still be green on the exact commit.
|
|
1122
882
|
await autoCiHolds("the deploy");
|
|
1123
883
|
await nightlyHolds("deploy");
|
|
1124
884
|
const reserved = await rel.reserve({ authority: j.authority.id, kind: "deploy", taskId: j.task.id, candidate: j.candidate.sha, epoch });
|
|
@@ -1130,13 +890,9 @@ export async function runRelease(options, adapters) {
|
|
|
1130
890
|
}
|
|
1131
891
|
}
|
|
1132
892
|
if (runtime === null) {
|
|
1133
|
-
// The last moment a moved head restarts; then the deploy reservation freezes the candidate in the store.
|
|
1134
|
-
// A person's release: every required check passed on the exact commit, read now (the approval may have come
|
|
1135
|
-
// while CI ran). A check that failed stops here, before anything is deployed.
|
|
1136
893
|
await personCiBeforeDeploy();
|
|
1137
894
|
await watch("deploy");
|
|
1138
895
|
await pinned();
|
|
1139
|
-
// Every deploy issued, whatever the journal saved (a retry after a rollback included): CI still green.
|
|
1140
896
|
await autoCiHolds("the deploy");
|
|
1141
897
|
await nightlyHolds("deploy");
|
|
1142
898
|
let operation, secret = "";
|
|
@@ -1151,8 +907,6 @@ export async function runRelease(options, adapters) {
|
|
|
1151
907
|
}
|
|
1152
908
|
j.deployAttempt = { stage: join(options.stateDir, "staged-upgrades", `browser-${j.candidate.sha.slice(0, 7)}-${randomUUID()}`) };
|
|
1153
909
|
intend("deploy");
|
|
1154
|
-
// The issuing fence, immediately before the deploy is spawned (review round 2): lease, epoch and the live
|
|
1155
|
-
// release again, in one transaction that marks the operation as issued by this process.
|
|
1156
910
|
if (operation !== undefined && !await rel.start(operation, epoch))
|
|
1157
911
|
throw new Stop("lease", "Another release coordinator took over this release; the deploy didn't start.");
|
|
1158
912
|
const result = await adapters.toolroll.deploy({ run: check.run, worktree: check.worktree, stage: j.deployAttempt.stage, ...(operation === undefined ? {} : { operation: { id: operation, secret } }) });
|
|
@@ -1163,7 +917,6 @@ export async function runRelease(options, adapters) {
|
|
|
1163
917
|
if (!/[\\/]dist$/.test(result.runtime))
|
|
1164
918
|
throw new Stop("deploy", `The deployment named ${result.runtime} as its runtime, which is not a dist folder.`);
|
|
1165
919
|
runtime = result.runtime;
|
|
1166
|
-
// Saved at once: everything after this (relinking, a rerun) uses the runtime the deployer named.
|
|
1167
920
|
j.deploy = { runtime, at: adapters.now().toISOString() };
|
|
1168
921
|
save();
|
|
1169
922
|
}
|
|
@@ -1220,11 +973,9 @@ export async function runRelease(options, adapters) {
|
|
|
1220
973
|
j.merge = { sha: pr.mergeCommit, tree: null };
|
|
1221
974
|
}
|
|
1222
975
|
else {
|
|
1223
|
-
// After the deploy reservation a moved head, a changed pull request or a stopped release stops it here.
|
|
1224
976
|
if (rel !== undefined && j.authority)
|
|
1225
977
|
await identity("merge", false);
|
|
1226
978
|
await pinned();
|
|
1227
|
-
// A squash merge only reproduces the gated (and CI-tested) tree when main hasn't moved past the branch's base.
|
|
1228
979
|
let main;
|
|
1229
980
|
try {
|
|
1230
981
|
main = await containsMain(adapters, j, "Nothing was merged");
|
|
@@ -1232,7 +983,6 @@ export async function runRelease(options, adapters) {
|
|
|
1232
983
|
catch (error) {
|
|
1233
984
|
if (!(error instanceof Stop) || error.reason !== "base-moved")
|
|
1234
985
|
throw error;
|
|
1235
|
-
// Past the deploy: the updated commit isn't what's running, so it starts over, with a person.
|
|
1236
986
|
const head = await updateFromMain();
|
|
1237
987
|
if (head === null)
|
|
1238
988
|
throw error;
|
|
@@ -1240,17 +990,11 @@ export async function runRelease(options, adapters) {
|
|
|
1240
990
|
save();
|
|
1241
991
|
throw new Stop("approval", `${j.branch} was behind main, so it's now at ${head.slice(0, 7)}. Nothing was merged. The new commit needs a person's approval: run \`toolroll release ${j.branch} --repo ${j.checkout} --new\`.`);
|
|
1242
992
|
}
|
|
1243
|
-
// Every release merges only where GitHub itself refuses a branch behind main.
|
|
1244
993
|
await mainProtection(adapters, j, j.auto?.state === "approved", "Nothing was merged");
|
|
1245
|
-
// The checks again, at the moment of merging: a rerun that failed since must not merge.
|
|
1246
994
|
const verdict = prChecksVerdict(await adapters.github.checks(j.github, j.candidate.sha), j.candidate.sha, REQUIRED_PR_CHECKS, { ...autoCap(), workflow: REQUIRED_PR_CHECKS_WORKFLOW });
|
|
1247
995
|
if (verdict.state !== "passed")
|
|
1248
996
|
await ciFailedAfterDeploy(`Pull request checks are no longer all passing on ${j.candidate.sha.slice(0, 7)}`);
|
|
1249
|
-
// GitHub's nightly lane debt (a bounded read), before main's last read so it doesn't widen that window; the
|
|
1250
|
-
// reservation below checks the stored debt again in its own transaction.
|
|
1251
997
|
await nightlyHolds("merge");
|
|
1252
|
-
// Main once more, from GitHub, the last thing before the merge is reserved: moved since the comparison, it
|
|
1253
|
-
// stops here (finding 4). GitHub's own up-to-date rule refuses the rest of the window.
|
|
1254
998
|
const now = await adapters.github.mainHead(j.github);
|
|
1255
999
|
if (now !== main)
|
|
1256
1000
|
throw new Stop("base-moved", `The branch is behind main; update it and push. Main moved to ${now.slice(0, 7)} while ${j.branch} was being merged, so what merges wouldn't be the tree CI tested. Nothing was merged: release the updated commit with \`toolroll release ${j.branch} --repo ${j.checkout} --new\`.`);
|
|
@@ -1265,7 +1009,6 @@ export async function runRelease(options, adapters) {
|
|
|
1265
1009
|
}
|
|
1266
1010
|
intend("merge");
|
|
1267
1011
|
const message = landedWords(j.landed ?? []).join("\n");
|
|
1268
|
-
// The issuing fence, immediately before gh is spawned (review round 2).
|
|
1269
1012
|
if (operation !== undefined && !await rel.start(operation, epoch))
|
|
1270
1013
|
throw new Stop("lease", "Another release coordinator took over this release; the merge didn't start.");
|
|
1271
1014
|
let merged;
|
|
@@ -1282,7 +1025,6 @@ export async function runRelease(options, adapters) {
|
|
|
1282
1025
|
j.merge = { sha: merged, tree: null };
|
|
1283
1026
|
}
|
|
1284
1027
|
save();
|
|
1285
|
-
// This also runs after discovering a merge whose response was lost. Never delete a reused branch.
|
|
1286
1028
|
await adapters.repo.deleteBranch(j.branch, j.candidate.sha);
|
|
1287
1029
|
advance("tree");
|
|
1288
1030
|
break;
|
|
@@ -1294,7 +1036,6 @@ export async function runRelease(options, adapters) {
|
|
|
1294
1036
|
merge.tree = tree;
|
|
1295
1037
|
if (tree !== j.candidate.tree)
|
|
1296
1038
|
throw new Stop("tree-mismatch", `Main's merge commit ${merge.sha.slice(0, 7)} has tree ${tree.slice(0, 12)}, not the gated ${j.candidate.tree.slice(0, 12)}: main changed what was checked. Nothing was tagged; the deployed build stays as it is.`);
|
|
1297
|
-
// The release's verified record (trusted-release-reports.md A1): the next release's change list starts here.
|
|
1298
1039
|
await tell(ready => ready.verified({ taskId: j.task.id, merge: merge.sha }));
|
|
1299
1040
|
advance("tag");
|
|
1300
1041
|
break;
|
|
@@ -1335,9 +1076,6 @@ export async function runRelease(options, adapters) {
|
|
|
1335
1076
|
}
|
|
1336
1077
|
case "homebrew": {
|
|
1337
1078
|
await publishHold();
|
|
1338
|
-
// Homebrew is finished apart from publication (pipeline-speed.md, P1): npm and the GitHub release are verified,
|
|
1339
|
-
// so the release is published. This run proposes the tap's change and reads its checks once; only a run that
|
|
1340
|
-
// resumes to finish Homebrew waits for them. Pending or failed, the state is kept and the run ends published.
|
|
1341
1079
|
const progress = await homebrewPass(finishingHomebrew);
|
|
1342
1080
|
j.homebrew = { pr: j.homebrew?.pr ?? null, head: j.homebrew?.head ?? null, merged: progress.state === "current" && j.homebrew?.head != null ? true : j.homebrew?.merged ?? false, state: progress.state, why: progress.why };
|
|
1343
1081
|
save();
|
|
@@ -1362,12 +1100,11 @@ export async function runRelease(options, adapters) {
|
|
|
1362
1100
|
say(`Released ${j.tag}: deployed, merged as ${j.merge.sha.slice(0, 7)}, tagged, published and ${j.homebrew?.state === "superseded" ? `left Homebrew as it is (${j.homebrew.why ?? "the tap names a newer version"})` : "on Homebrew"}.`);
|
|
1363
1101
|
else
|
|
1364
1102
|
say(`Published ${j.tag} (deployed, merged as ${j.merge.sha.slice(0, 7)}, tagged, on npm and GitHub); Homebrew ${left.state}${left.why === null ? "" : `: ${left.why}`}. Finish it with \`${resume}\`.`);
|
|
1365
|
-
// The automatic road's note, once: when this run published (a run that only finishes Homebrew already said it).
|
|
1366
1103
|
if (j.auto?.state === "approved" && !finishingHomebrew) {
|
|
1367
1104
|
try {
|
|
1368
1105
|
await rel?.auto?.released(j.task.id, j.tag);
|
|
1369
1106
|
}
|
|
1370
|
-
catch {
|
|
1107
|
+
catch { }
|
|
1371
1108
|
}
|
|
1372
1109
|
for (const line of landedWords(j.landed ?? []))
|
|
1373
1110
|
say(line);
|
|
@@ -1380,21 +1117,19 @@ export async function runRelease(options, adapters) {
|
|
|
1380
1117
|
try {
|
|
1381
1118
|
save();
|
|
1382
1119
|
}
|
|
1383
|
-
catch {
|
|
1120
|
+
catch { }
|
|
1384
1121
|
mark(journal.step, "failed", stop.message);
|
|
1385
|
-
// A person's release that stops tells them (trusted-release-reports.md A5); the automatic road keeps its own notices.
|
|
1386
1122
|
const ready = adapters.release?.ready;
|
|
1387
1123
|
if (ready !== undefined && journal.auto?.state !== "checking" && journal.auto?.state !== "approved") {
|
|
1388
1124
|
try {
|
|
1389
1125
|
await ready.stopped({ taskId: journal.task.id, step: journal.step, reason: stop.reason, message: stop.message });
|
|
1390
1126
|
}
|
|
1391
|
-
catch {
|
|
1127
|
+
catch { }
|
|
1392
1128
|
}
|
|
1393
1129
|
}
|
|
1394
1130
|
return { ok: false, reason: stop.reason, message: stop.message, step: journal?.step ?? step, journal, file, resume };
|
|
1395
1131
|
}
|
|
1396
1132
|
}
|
|
1397
|
-
/** The first run: everything checked before anything changes. */
|
|
1398
1133
|
async function begin(options, adapters, now) {
|
|
1399
1134
|
const { branch, checkout } = options;
|
|
1400
1135
|
if (["main", "master"].includes(branch))
|
|
@@ -1437,13 +1172,11 @@ async function begin(options, adapters, now) {
|
|
|
1437
1172
|
merge: null, tagged: null, published: null, homebrew: null, intents: {}, stopped: null, createdAt: at, updatedAt: at,
|
|
1438
1173
|
};
|
|
1439
1174
|
}
|
|
1440
|
-
/** A deployment stop; when it left an update pause before the swap, the guided way to lift it. */
|
|
1441
1175
|
function deployStop(reason, message, stop) {
|
|
1442
1176
|
if (stop.gate === undefined)
|
|
1443
1177
|
return new Stop(reason, message);
|
|
1444
1178
|
return new Stop("gate-held", `${message} New work is still paused by update ${stop.gate.id} (its journal stopped at ${stop.gate.phase}, before the swap). Check and lift that pause with \`toolroll release --release-gate ${stop.gate.id}\`, then rerun.`);
|
|
1445
1179
|
}
|
|
1446
|
-
/** The one runtime the launchd services run, when it records the gated commit; otherwise null. */
|
|
1447
1180
|
async function served(adapters, candidate) {
|
|
1448
1181
|
const installed = await adapters.toolroll.installed();
|
|
1449
1182
|
const runtimes = new Set(installed.services);
|
|
@@ -1452,7 +1185,6 @@ async function served(adapters, candidate) {
|
|
|
1452
1185
|
const [runtime] = runtimes;
|
|
1453
1186
|
return runtime !== undefined && await adapters.toolroll.runtimeCommit(runtime) === candidate ? runtime : null;
|
|
1454
1187
|
}
|
|
1455
|
-
/** The one runtime the services and both CLI names run, when it records the gated commit; otherwise null. */
|
|
1456
1188
|
async function deployed(adapters, candidate) {
|
|
1457
1189
|
const installed = await adapters.toolroll.installed();
|
|
1458
1190
|
const runtimes = new Set([...installed.services, ...installed.clis.map(one => one.runtime ?? "")]);
|
|
@@ -1461,20 +1193,7 @@ async function deployed(adapters, candidate) {
|
|
|
1461
1193
|
const [runtime] = runtimes;
|
|
1462
1194
|
return runtime !== undefined && runtime !== "" && await adapters.toolroll.runtimeCommit(runtime) === candidate ? runtime : null;
|
|
1463
1195
|
}
|
|
1464
|
-
/**
|
|
1465
|
-
* The gate's look at the pull request's required checks on the exact commit, before anything is filed or anyone is
|
|
1466
|
-
* asked to approve (#237): a required check that failed or was cancelled stops here; checks not started or still
|
|
1467
|
-
* running are named, and the gate waits for them; ones that never finish within the gate's limit stop here too. GitHub
|
|
1468
|
-
* not answering is waited out the same way, never taken for a pass. The ci step still checks again before merging.
|
|
1469
|
-
*/
|
|
1470
|
-
/**
|
|
1471
|
-
* The branch must contain main's head as GitHub's API answers now: CI tests the pull request's head commit,
|
|
1472
|
-
* so only a branch that already holds main merges into exactly the tested tree. Refused in plain words otherwise.
|
|
1473
|
-
*/
|
|
1474
1196
|
async function containsMain(adapters, j, nothing) {
|
|
1475
|
-
// GitHub's own answers (eval-harness review 1, finding 4): main's head and the comparison are read from its API by
|
|
1476
|
-
// this coordinator, never from refs/remotes/origin/main in a checkout a build can write. The checkout is still synced
|
|
1477
|
-
// for what the gate reads from it later.
|
|
1478
1197
|
await adapters.repo.sync(j.branch);
|
|
1479
1198
|
const main = await adapters.github.mainHead(j.github);
|
|
1480
1199
|
if (!/^[0-9a-f]{40}$/.test(main))
|
|
@@ -1483,13 +1202,8 @@ async function containsMain(adapters, j, nothing) {
|
|
|
1483
1202
|
return main;
|
|
1484
1203
|
throw new Stop("base-moved", `The branch is behind main; update it and push. ${j.branch} at ${j.candidate.sha.slice(0, 7)} doesn't contain main's head ${main.slice(0, 7)}, so what merges wouldn't be the tree CI tested. ${nothing}: release the updated commit with \`toolroll release ${j.branch} --repo ${j.checkout} --new\`.`);
|
|
1485
1204
|
}
|
|
1486
|
-
/**
|
|
1487
|
-
* GitHub must refuse a branch behind main for every release (eval-harness review 1, finding 4). A person's approval
|
|
1488
|
-
* cannot make the final main read and merge atomic, so absent or unreadable protection stops that release too.
|
|
1489
|
-
*/
|
|
1490
1205
|
async function mainProtection(adapters, j, auto, nothing) {
|
|
1491
1206
|
let protection, unread = null;
|
|
1492
|
-
// Couldn't read (after the adapter's network retries) is its own stop, never "doesn't hold" and never "holds".
|
|
1493
1207
|
try {
|
|
1494
1208
|
protection = await adapters.github.upToDateRequired(j.github);
|
|
1495
1209
|
}
|
|
@@ -1497,7 +1211,6 @@ async function mainProtection(adapters, j, auto, nothing) {
|
|
|
1497
1211
|
protection = null;
|
|
1498
1212
|
unread = String(error?.message ?? error).slice(0, 400);
|
|
1499
1213
|
}
|
|
1500
|
-
// The git lanes main's protection doesn't name yet are said, never refused (PROTECTION_REPORT_ONLY_CHECKS).
|
|
1501
1214
|
if (protection !== null && protection.notYetRequired.length > 0)
|
|
1502
1215
|
adapters.say(` Note: main's protection doesn't require ${protection.notYetRequired.join(", ")} yet; add ${protection.notYetRequired.length === 1 ? "it" : "them"} to its required checks.`);
|
|
1503
1216
|
if (protection?.effective === true)
|
|
@@ -1507,11 +1220,6 @@ async function mainProtection(adapters, j, auto, nothing) {
|
|
|
1507
1220
|
}
|
|
1508
1221
|
throw new Stop("base-unprotected", `main's protection doesn't hold: ${protection.missing.join("; ")}, so this release can't merge${auto ? " automatically" : ""}. ${nothing}. Restore effective main protection and try again.`);
|
|
1509
1222
|
}
|
|
1510
|
-
/**
|
|
1511
|
-
* Wait for every required pull request check on the candidate to pass; stop on one that failed. `pendingIsEnough` (the
|
|
1512
|
-
* automatic road's gate, pipeline-speed.md D2): checks still running are no reason to wait — returns false then, true
|
|
1513
|
-
* once they all passed. `nothing` says what hasn't happened yet when a check failed.
|
|
1514
|
-
*/
|
|
1515
1223
|
async function earlyChecks(adapters, j, wait, options = {}) {
|
|
1516
1224
|
const nothing = options.nothing ?? "Nothing was filed or sent for approval";
|
|
1517
1225
|
const sha = j.candidate.sha.slice(0, 7);
|
|
@@ -1552,33 +1260,18 @@ async function earlyChecks(adapters, j, wait, options = {}) {
|
|
|
1552
1260
|
throw new Stop("ci-missing", `Pull request checks on ${sha} didn't all finish in time${named === "" ? (unread ? " (GitHub didn't answer)" : "") : `: ${named}`}. ${nothing}. Start or rerun them on GitHub, then run this command again.`);
|
|
1553
1261
|
}
|
|
1554
1262
|
}
|
|
1555
|
-
/** A probe's failure that is only the network to GitHub failing for now (release-net.ts transientFailure: a timeout, a
|
|
1556
|
-
* connection or name failure, a 5xx, an answer cut short, a secondary rate limit), never a decision (a Stop), a
|
|
1557
|
-
* definitive answer or another error. */
|
|
1558
1263
|
export function transientNetworkError(error) {
|
|
1559
1264
|
if (error instanceof Stop || error instanceof Restart)
|
|
1560
1265
|
return false;
|
|
1561
1266
|
return transientFailure(String(error?.message ?? error)) !== null;
|
|
1562
1267
|
}
|
|
1563
|
-
/** The part of a network failure worth saying: its matching phrase. */
|
|
1564
1268
|
function networkWords(error) {
|
|
1565
1269
|
return transientFailure(String(error?.message ?? error))?.words ?? "a network failure";
|
|
1566
1270
|
}
|
|
1567
|
-
/**
|
|
1568
|
-
* The pull request's checks on exactly `head`, every attempt (the adapter asks GitHub for all of them, filter=all):
|
|
1569
|
-
* each reported attempt must be filed under `head` with a check-run id; a required check counts only from GitHub
|
|
1570
|
-
* Actions (an app that names a check alike can't stand in for it); attempts are grouped by the job they belong to — the
|
|
1571
|
-
* app, its check suite (a workflow run, whose re-runs stay in it) and the name — and every group is judged by its
|
|
1572
|
-
* latest attempt; every required check needs a group. With `auto` (an automatic approval), every other failed attempt on
|
|
1573
|
-
* the commit — an earlier attempt, or a job a newer run renamed or dropped — must be one GitHub's own job record shows ending before any workflow step ran (`beforeTests`: confirmed
|
|
1574
|
-
* infrastructure), and at most INFRA_RERUNS_PER_CANDIDATE of them on the commit; any other earlier failure — a test,
|
|
1575
|
-
* a typecheck, or one nothing explains — fails the verdict, so a person decides. The failures it tolerated are returned.
|
|
1576
|
-
*/
|
|
1577
1271
|
export function prChecksVerdict(runs, head, required, options = {}) {
|
|
1578
1272
|
const failed = [], waiting = [], failures = [];
|
|
1579
1273
|
const valid = [];
|
|
1580
1274
|
for (const run of runs) {
|
|
1581
|
-
// youiyoux's drift check from its own workflow neither holds nor fails a release (ADVISORY_PR_CHECKS).
|
|
1582
1275
|
const advisory = Object.hasOwn(ADVISORY_PR_CHECKS, run.name) ? ADVISORY_PR_CHECKS[run.name] : undefined;
|
|
1583
1276
|
if (advisory !== undefined && !required.includes(run.name) && run.app === "github-actions" && workflowIs(run.workflowPath, advisory))
|
|
1584
1277
|
continue;
|
|
@@ -1594,8 +1287,6 @@ export function prChecksVerdict(runs, head, required, options = {}) {
|
|
|
1594
1287
|
failed.push(`${run.name} (reported by ${run.app ?? "an unknown app"}, not GitHub Actions)`);
|
|
1595
1288
|
continue;
|
|
1596
1289
|
}
|
|
1597
|
-
// A required name counts only from the workflow that defines it: a job of the same name in another workflow (or
|
|
1598
|
-
// one whose workflow GitHub doesn't name) fails the verdict rather than stand in for it.
|
|
1599
1290
|
if (options.workflow !== undefined && required.includes(run.name)) {
|
|
1600
1291
|
const want = typeof options.workflow === "string" ? options.workflow : options.workflow[run.name];
|
|
1601
1292
|
if (want === undefined || !workflowIs(run.workflowPath, want)) {
|
|
@@ -1609,9 +1300,6 @@ export function prChecksVerdict(runs, head, required, options = {}) {
|
|
|
1609
1300
|
}
|
|
1610
1301
|
valid.push(run);
|
|
1611
1302
|
}
|
|
1612
|
-
// Supersession by trusted workflow identity (GitHub's workflow-run API, read by the adapter): a newer run of the same
|
|
1613
|
-
// workflow on this commit replaces the older ones — its jobs are the current ones. A suite whose workflow isn't known
|
|
1614
|
-
// is its own workflow (nothing supersedes it), and another app's suites stand on their own.
|
|
1615
1303
|
const workflowOf = (run) => run.app === "github-actions" && typeof run.workflow === "number" ? `w:${run.workflow}` : `s:${run.app ?? ""}:${run.suite ?? ""}`;
|
|
1616
1304
|
const current = new Map();
|
|
1617
1305
|
for (const run of valid) {
|
|
@@ -1620,22 +1308,17 @@ export function prChecksVerdict(runs, head, required, options = {}) {
|
|
|
1620
1308
|
if (was === undefined || (suite !== null && (was === null || suite > was)))
|
|
1621
1309
|
current.set(key, suite);
|
|
1622
1310
|
}
|
|
1623
|
-
// Jobs: a workflow and a name, every attempt in every suite of it; judged by the latest attempt in the current suite.
|
|
1624
1311
|
const groups = new Map();
|
|
1625
1312
|
for (const run of valid) {
|
|
1626
1313
|
const key = JSON.stringify([workflowOf(run), run.name]);
|
|
1627
1314
|
groups.set(key, [...(groups.get(key) ?? []), run]);
|
|
1628
1315
|
}
|
|
1629
1316
|
const judged = new Set();
|
|
1630
|
-
// The attempt each current job stands on (its latest in the current run); every other attempt on the commit is
|
|
1631
|
-
// history, whatever its job is called now.
|
|
1632
1317
|
const standing = new Set();
|
|
1633
1318
|
for (const attempts of groups.values()) {
|
|
1634
1319
|
const ordered = [...attempts].sort((a, b) => a.id - b.id);
|
|
1635
1320
|
const now = current.get(workflowOf(ordered[0])) ?? null;
|
|
1636
1321
|
const live = ordered.filter(one => (one.suite ?? null) === now);
|
|
1637
|
-
// A job only an older run had (the newer run no longer has it, or calls it something else) doesn't stand for a
|
|
1638
|
-
// required check; its failures are still history below.
|
|
1639
1322
|
if (live.length === 0)
|
|
1640
1323
|
continue;
|
|
1641
1324
|
const latest = live.at(-1), name = latest.name;
|
|
@@ -1645,9 +1328,6 @@ export function prChecksVerdict(runs, head, required, options = {}) {
|
|
|
1645
1328
|
waiting.push(`${name} (${latest.status})`);
|
|
1646
1329
|
continue;
|
|
1647
1330
|
}
|
|
1648
|
-
// Skipped is never success (test-matrix.md): GitHub's protection reads a skipped job as passing a merge, a release
|
|
1649
|
-
// never does. A documentation-only pull request skips the area lanes, and any pull request but a release-* branch's
|
|
1650
|
-
// skips Node 22, so a release needs every lane executed on its exact head.
|
|
1651
1331
|
if (latest.conclusion === "skipped" && required.includes(name)) {
|
|
1652
1332
|
failed.push(`${name} (skipped: a release needs it run on this exact commit; release from a branch named release-*, whose pull request runs every lane)`);
|
|
1653
1333
|
continue;
|
|
@@ -1657,11 +1337,6 @@ export function prChecksVerdict(runs, head, required, options = {}) {
|
|
|
1657
1337
|
continue;
|
|
1658
1338
|
}
|
|
1659
1339
|
}
|
|
1660
|
-
// Every failed attempt on the commit that no current job stands on — an earlier attempt of a job, a job a newer run
|
|
1661
|
-
// renamed, dropped, or never ran again — is classified before anything is superseded (eval-harness review 1, finding
|
|
1662
|
-
// 1): a renamed or vanished job never erases a failure. An automatic approval tolerates only confirmed
|
|
1663
|
-
// infrastructure (GitHub's job record shows the runner failing before any workflow step ran), and waits out any
|
|
1664
|
-
// earlier attempt still running.
|
|
1665
1340
|
const history = valid.filter(one => !standing.has(one));
|
|
1666
1341
|
if (options.auto === true) {
|
|
1667
1342
|
for (const one of history)
|
|
@@ -1688,10 +1363,6 @@ export function prChecksVerdict(runs, head, required, options = {}) {
|
|
|
1688
1363
|
return { state: "failed", failed };
|
|
1689
1364
|
return waiting.length > 0 ? { state: "pending", waiting } : { state: "passed", failures };
|
|
1690
1365
|
}
|
|
1691
|
-
/**
|
|
1692
|
-
* What a failed release check means and what happens next, by its class (check-failure.ts), in words. Only confirmed
|
|
1693
|
-
* infrastructure reruns on its own; nothing else is rerun to pass.
|
|
1694
|
-
*/
|
|
1695
1366
|
export function checkFailedWords(input) {
|
|
1696
1367
|
const short = input.sha.slice(0, 7), again = `\`toolroll release ${input.branch} --repo ${input.checkout} --new\``;
|
|
1697
1368
|
switch (input.class) {
|
|
@@ -1707,18 +1378,13 @@ export function checkFailedWords(input) {
|
|
|
1707
1378
|
return `The Full release check of ${short} did not pass (run ${input.run}): ${input.why}. Fix the branch and release the new commit with ${again}.`;
|
|
1708
1379
|
}
|
|
1709
1380
|
}
|
|
1710
|
-
/** Whether GitHub's workflow-run `path` names exactly `file` (it may carry the ref it ran from, after an `@`). */
|
|
1711
1381
|
export function workflowIs(path, file) {
|
|
1712
1382
|
if (typeof path !== "string")
|
|
1713
1383
|
return false;
|
|
1714
1384
|
if (path === file)
|
|
1715
1385
|
return true;
|
|
1716
|
-
// GitHub may append @ref, but ci.yml@evil.yml is also a valid *different* workflow filename. Multiple @ signs
|
|
1717
|
-
// likewise cannot distinguish that filename from a ref. Refuse ambiguous suffixes instead of granting its checks.
|
|
1718
1386
|
const ref = path.startsWith(`${file}@`) ? path.slice(file.length + 1) : "";
|
|
1719
1387
|
return /^[A-Za-z0-9._+/-]+$/.test(ref) && !/\.ya?ml$/i.test(ref);
|
|
1720
1388
|
}
|
|
1721
|
-
/** The words `toolroll release` reads as its own (release-cli.ts), never as a branch: such a branch is named with --branch. */
|
|
1722
1389
|
const RELEASE_WORDS = new Set(["status", "nightly", "carry", "revoke", "ask-every-commit", "unsandboxed-carry", "auto-approve", "publish-ok", "approve"]);
|
|
1723
|
-
/** How a person names this branch to `toolroll release` again. */
|
|
1724
1390
|
export function releaseBranchArg(branch) { return RELEASE_WORDS.has(branch) ? `--branch ${branch}` : branch; }
|