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-adapters.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The world `toolroll release` acts on (release.ts): the gate checkout through git, GitHub through the signed-in `gh`,
|
|
3
|
-
* the npm registry over HTTPS, the installed Toolroll through its own CLI (`--json`) and launchd definitions, and the
|
|
4
|
-
* Homebrew tap through `gh`. Each call is bounded; none asks for or stores a credential — `gh`, npm and Toolroll use
|
|
5
|
-
* the sign-ins this machine already has.
|
|
6
|
-
*/
|
|
7
1
|
import { execFile, spawnSync } from "node:child_process";
|
|
8
2
|
import { createHash } from "node:crypto";
|
|
9
3
|
import { existsSync, lstatSync, mkdtempSync, readdirSync, readFileSync, realpathSync, rmSync } from "node:fs";
|
|
@@ -14,7 +8,6 @@ import { fileURLToPath } from "node:url";
|
|
|
14
8
|
import { parse as parseYaml } from "yaml";
|
|
15
9
|
import { sleep } from "./sleep.js";
|
|
16
10
|
import { callLabel, readOnlyCall, retryCall, retryingExec, writeWithRecheck } from "./release-net.js";
|
|
17
|
-
// Loaded on first use, like the store: a static import prints Node's SQLite warning before the CLI can quiet it.
|
|
18
11
|
const sqlite = () => createRequire(import.meta.url)("node:sqlite");
|
|
19
12
|
import { PROTECTION_MINIMUM_CHECKS, PROTECTION_REPORT_ONLY_CHECKS } from "./release.js";
|
|
20
13
|
import { activeUpdateWork } from "./desktop-update-gate.js";
|
|
@@ -43,22 +36,18 @@ import { extractCommit } from "./commit-extract.js";
|
|
|
43
36
|
import { teardownGit, refusal as gitRefusal } from "./teardown-git.js";
|
|
44
37
|
import { RELEASE_REMOTE, releaseConfigProblem, releaseGitArgs, releaseGitEnv, releaseRemote, releaseTools } from "./release-git.js";
|
|
45
38
|
export { RELEASE_PATH, RELEASE_REMOTE, releaseConfigProblem, releaseGitArgs, releaseGitEnv, releaseRemote, releaseTools } from "./release-git.js";
|
|
46
|
-
/** A child process, its output kept whole; a missing program or a time limit is exit 127 or 124, never a throw. */
|
|
47
39
|
export const exec = (command, args, options = {}) => new Promise(done => {
|
|
48
40
|
const child = execFile(command, [...args], { cwd: options.cwd, env: options.env ?? process.env, timeout: options.timeoutMs ?? 120_000, maxBuffer: 64 * 1024 * 1024, encoding: "utf8" }, (error, stdout, stderr) => {
|
|
49
41
|
const failure = error;
|
|
50
42
|
const code = failure === null ? 0 : failure.code === "ENOENT" ? 127 : failure.killed === true ? 124 : typeof failure.code === "number" ? failure.code : 1;
|
|
51
43
|
done({ code, stdout: String(stdout ?? ""), stderr: String(stderr ?? "") });
|
|
52
44
|
});
|
|
53
|
-
// `input`: written on the child's stdin, then closed (a secret that must never ride in argv).
|
|
54
45
|
child.stdin?.on("error", () => { });
|
|
55
46
|
if (options.input !== undefined)
|
|
56
47
|
child.stdin?.end(options.input);
|
|
57
48
|
else
|
|
58
49
|
child.stdin?.end();
|
|
59
50
|
});
|
|
60
|
-
/** Without NODE_OPTIONS, which a test runner or debugger may have left for this process. */
|
|
61
|
-
/** This runtime's own CLI (dist/bin.js beside this module) when it has one; from source, `toolroll` as installed. */
|
|
62
51
|
const ownCli = () => {
|
|
63
52
|
const bin = join(dirname(fileURLToPath(import.meta.url)), "bin.js");
|
|
64
53
|
return existsSync(bin) ? [process.execPath, bin] : ["toolroll"];
|
|
@@ -68,7 +57,6 @@ const cleanEnv = (extra = {}) => {
|
|
|
68
57
|
delete env["NODE_OPTIONS"];
|
|
69
58
|
return env;
|
|
70
59
|
};
|
|
71
|
-
/** A failed call, in the words every release stop uses: what, its exit code and the last lines it printed. */
|
|
72
60
|
const failed = (result, what) => new Error(`${what} failed (exit ${result.code}): ${(result.stderr || result.stdout).trim().split("\n").slice(-3).join(" ")}`);
|
|
73
61
|
const must = async (run, what) => {
|
|
74
62
|
const result = await run;
|
|
@@ -76,12 +64,10 @@ const must = async (run, what) => {
|
|
|
76
64
|
throw failed(result, what);
|
|
77
65
|
return result.stdout;
|
|
78
66
|
};
|
|
79
|
-
/** owner/name from an https or ssh GitHub remote. */
|
|
80
67
|
export function githubSlug(url) {
|
|
81
68
|
const match = /github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?\/?$/.exec(url.trim());
|
|
82
69
|
return match === null ? null : `${match[1]}/${match[2]}`;
|
|
83
70
|
}
|
|
84
|
-
/** The runtime (a `dist` folder, resolved) each launchd service of Toolroll runs: its definition names `<dist>/cli.js`. */
|
|
85
71
|
export function serviceRuntimes(agents = join(homedir(), "Library", "LaunchAgents")) {
|
|
86
72
|
let names = [];
|
|
87
73
|
try {
|
|
@@ -98,7 +84,6 @@ export function serviceRuntimes(agents = join(homedir(), "Library", "LaunchAgent
|
|
|
98
84
|
}
|
|
99
85
|
return [...new Set(found)];
|
|
100
86
|
}
|
|
101
|
-
/** The runtime each CLI name resolves to on PATH: the `dist` folder its `bin.js` sits in, or null when not linked there. */
|
|
102
87
|
export function cliRuntimes(path = process.env["PATH"] ?? "", names = ["toolroll", "standing-orders"]) {
|
|
103
88
|
return names.map(name => {
|
|
104
89
|
for (const dir of path.split(delimiter).filter(Boolean)) {
|
|
@@ -119,7 +104,6 @@ catch {
|
|
|
119
104
|
} };
|
|
120
105
|
const object = (value) => (value !== null && typeof value === "object" && !Array.isArray(value) ? value : {});
|
|
121
106
|
const textOr = (value) => (typeof value === "string" && value !== "" ? value : null);
|
|
122
|
-
/** `task show --json`, read as the release needs it. */
|
|
123
107
|
export function gateStateOf(answer, accounts = []) {
|
|
124
108
|
if (answer["ok"] !== true)
|
|
125
109
|
return { exists: false, candidate: null, scopeDigest: null, approval: null, result: null, failed: null, completion: null };
|
|
@@ -134,11 +118,9 @@ export function gateStateOf(answer, accounts = []) {
|
|
|
134
118
|
const completion = object(assignment["completion"]);
|
|
135
119
|
const approvedAt = textOr(scope["approvedAt"]), approvedBy = textOr(scope["approvedBy"]), approvedDigest = textOr(scope["approvedDigest"]);
|
|
136
120
|
const account = accounts.map(object).find(one => one["name"] === approvedBy);
|
|
137
|
-
// A newer finished build than the result, with no result of its own, failed before its check could seal one.
|
|
138
121
|
const failed = newest !== undefined && newest["finishedAt"] != null && newest["outcome"] !== "built" && newest["outcome"] !== "no-change" && Number(newest["id"]) !== resultRun
|
|
139
122
|
? `run ${String(newest["id"])} ended ${String(newest["outcome"] ?? "without an outcome")}` : null;
|
|
140
123
|
const worktree = runs.find(run => run["id"] === resultRun)?.["worktree"];
|
|
141
|
-
// Queued again or still building past the result shown (a regate): that result is the one before the rerun.
|
|
142
124
|
const state = object(answer["task"])["state"];
|
|
143
125
|
const pending = resultRun !== null && (state === "queued" || state === "running" || (newest !== undefined && newest["finishedAt"] == null && Number(newest["id"]) > resultRun));
|
|
144
126
|
return {
|
|
@@ -161,14 +143,12 @@ export function gateStateOf(answer, accounts = []) {
|
|
|
161
143
|
completion: textOr(completion["digest"]) === null ? null : { actor: String(completion["actor"]), at: String(completion["at"]), digest: String(completion["digest"]) },
|
|
162
144
|
};
|
|
163
145
|
}
|
|
164
|
-
/** Every process on this machine (`ps`): pid and full command line. */
|
|
165
146
|
export function processes() {
|
|
166
147
|
const listed = spawnSync("/bin/ps", ["-axww", "-o", "pid=,command="], { encoding: "utf8", maxBuffer: 64 * 1024 * 1024 });
|
|
167
148
|
if (listed.status !== 0)
|
|
168
149
|
throw new Error(`ps failed: ${listed.stderr.trim()}`);
|
|
169
150
|
return listed.stdout.split("\n").map(line => /^\s*(\d+)\s+(.*)$/.exec(line)).filter(match => match !== null).map(match => ({ pid: Number(match[1]), command: match[2] }));
|
|
170
151
|
}
|
|
171
|
-
/** The final line of deploy-browser's output that is a JSON object: its `runtime` (a dist folder), when it has one. */
|
|
172
152
|
export function deployedRuntime(stdout) {
|
|
173
153
|
const last = stdout.trim().split("\n").reverse().find(line => line.startsWith("{"));
|
|
174
154
|
try {
|
|
@@ -179,8 +159,6 @@ export function deployedRuntime(stdout) {
|
|
|
179
159
|
return null;
|
|
180
160
|
}
|
|
181
161
|
}
|
|
182
|
-
/** What a deployment's stage says about the update pause: its id and phase when the journal is before the swap and the
|
|
183
|
-
* live database's pause is that deployment's. `owner` reads the live pause's owner. */
|
|
184
162
|
export function stageGate(stage, owner) {
|
|
185
163
|
let journal;
|
|
186
164
|
try {
|
|
@@ -192,7 +170,6 @@ export function stageGate(stage, owner) {
|
|
|
192
170
|
const id = textOr(journal["id"]), phase = textOr(journal["phase"]);
|
|
193
171
|
return id !== null && phase !== null && BEFORE_SWAP.includes(phase) && owner() === id ? { id, phase } : null;
|
|
194
172
|
}
|
|
195
|
-
/** The recorded repository for a gate checkout, from the plane's database; throws in plain words when there is none. */
|
|
196
173
|
export function recordedReleaseRepo(database, checkout) {
|
|
197
174
|
const real = (path) => { try {
|
|
198
175
|
return realpathSync(path);
|
|
@@ -234,7 +211,6 @@ export function recordedReleaseRepo(database, checkout) {
|
|
|
234
211
|
}
|
|
235
212
|
return { checkout: at, gitDir, remote, ...parsed };
|
|
236
213
|
}
|
|
237
|
-
/** How many times, and how far apart, a merged branch's deletion is looked for after the push lost a race. */
|
|
238
214
|
export const BRANCH_GONE_LOOKS = 5;
|
|
239
215
|
export const BRANCH_GONE_PAUSE_MS = 2_000;
|
|
240
216
|
export function releaseAdapters(options) {
|
|
@@ -247,18 +223,11 @@ export function releaseAdapters(options) {
|
|
|
247
223
|
const tools = options.tools ?? releaseTools();
|
|
248
224
|
const gitEnv = releaseGitEnv();
|
|
249
225
|
const say = options.say ?? ((line) => { process.stdout.write(`${line}\n`); });
|
|
250
|
-
/** A short network failure on the way to GitHub (release-net.ts): reads are asked again for up to ~3 minutes; a
|
|
251
|
-
* write never is, unless GitHub says it didn't happen (writeWithRecheck). */
|
|
252
226
|
const net = { say, sleep: options.sleep ?? sleep, ...(options.now === undefined ? {} : { now: options.now }) };
|
|
253
227
|
const reads = retryingExec(run, net);
|
|
254
|
-
// Never a PATH lookup or the checkout's Git config: gh by its absolute path, from a neutral folder, naming the repo.
|
|
255
|
-
// Reads ride out a short network failure; anything that isn't provably a read passes straight through (readOnlyCall).
|
|
256
228
|
const gh = (...args) => reads(tools.gh, args, { cwd: "/", env: gitEnv });
|
|
257
|
-
/** A write by gh, never retried by itself. */
|
|
258
229
|
const ghWrite = (remainingMs, ...args) => run(tools.gh, args, { cwd: "/", env: gitEnv, timeoutMs: Math.min(120_000, remainingMs) });
|
|
259
230
|
const ghJson = async (what, ...args) => JSON.parse(await must(gh(...args), what));
|
|
260
|
-
// The build running this release, never a PATH lookup: until the link step, `toolroll` on PATH is still the previous
|
|
261
|
-
// build, which refuses a database the deployment migrated, so a release resumed after its deploy couldn't read its task.
|
|
262
231
|
const cli = options.cli ?? ownCli();
|
|
263
232
|
const toolroll = async (...args) => {
|
|
264
233
|
const result = await run(cli[0], [...cli.slice(1), ...args, "--json"], { env: cleanEnv(), timeoutMs: 120_000 });
|
|
@@ -270,8 +239,6 @@ export function releaseAdapters(options) {
|
|
|
270
239
|
}
|
|
271
240
|
};
|
|
272
241
|
const refused = (answer) => `${String(answer["message"] ?? answer["reason"] ?? "refused")}`;
|
|
273
|
-
/** gh for every CI and merge-base read (auto-approve-green.md): found only in the system's own folders, never the
|
|
274
|
-
* caller's PATH (a test hands its own). */
|
|
275
242
|
const ciGh = options.tools?.gh ?? releaseTools("").gh;
|
|
276
243
|
const observeCi = async (sha) => {
|
|
277
244
|
const observedAt = (options.now ?? (() => new Date()))().toISOString();
|
|
@@ -281,18 +248,11 @@ export function releaseAdapters(options) {
|
|
|
281
248
|
};
|
|
282
249
|
const database = options.database ?? databasePath(process.env, homedir());
|
|
283
250
|
let recorded = options.releaseRepo ?? null;
|
|
284
|
-
/** The recorded repository, read once (chat-management.md §0a.2). */
|
|
285
251
|
const releaseRepo = () => recorded ??= recordedReleaseRepo(database, checkout);
|
|
286
|
-
/**
|
|
287
|
-
* The coordinator's one way to run Git (§0a.2): on the recorded Git directory, hardened, with an allowlisted
|
|
288
|
-
* environment and the absolute Git. Every attempt uses the shared runner's private view: the audited config is
|
|
289
|
-
* the exact copy Git reads, so a build cannot redirect a command after its config was checked.
|
|
290
|
-
*/
|
|
291
252
|
const git = async (...args) => {
|
|
292
253
|
const repo = releaseRepo();
|
|
293
254
|
const full = [...releaseGitArgs(repo, tools), ...args];
|
|
294
255
|
const stop = (why) => new Error(`Toolroll won't run Git in ${repo.checkout} for a release: ${why}. Remove it from the project's Git config, then rerun.`);
|
|
295
|
-
// The checkout's config is read again right before EVERY attempt, a retried one included (checked at the moment of use).
|
|
296
256
|
const once = async (remainingMs = 120_000) => {
|
|
297
257
|
const now = () => (options.now ?? (() => new Date()))().getTime();
|
|
298
258
|
const started = now();
|
|
@@ -305,8 +265,6 @@ export function releaseAdapters(options) {
|
|
|
305
265
|
throw stop(`its Git config sets ${setting}, which a release doesn't run with (it could run a command, or change where Git connects or what it sends)`);
|
|
306
266
|
};
|
|
307
267
|
if (options.releaseRepo === undefined) {
|
|
308
|
-
// The shared runner pins both Git directories and freezes config/info in the plane's fenced view folder.
|
|
309
|
-
// Its private paths replace releaseGitArgs' first two directory flags; the recorded remote stays fixed.
|
|
310
268
|
const viewed = teardownGit(async (_command, argv, runOptions) => {
|
|
311
269
|
const timeoutMs = left();
|
|
312
270
|
if (timeoutMs <= 0)
|
|
@@ -323,7 +281,6 @@ export function releaseAdapters(options) {
|
|
|
323
281
|
throw stop(why);
|
|
324
282
|
return result;
|
|
325
283
|
}
|
|
326
|
-
// Injected repository/exec fixtures have no on-disk checkout, but exercise the same config policy per attempt.
|
|
327
284
|
if (left() <= 0)
|
|
328
285
|
return { code: 124, stdout: "", stderr: "the network retry budget ran out" };
|
|
329
286
|
const listing = await run(tools.git, [`--git-dir=${repo.gitDir}`, "--no-optional-locks", "config", "--list", "--no-includes", "--show-scope", "-z"], { cwd: "/", env: gitEnv, timeoutMs: left() });
|
|
@@ -332,10 +289,8 @@ export function releaseAdapters(options) {
|
|
|
332
289
|
return { code: 124, stdout: "", stderr: "the network retry budget ran out" };
|
|
333
290
|
return run(tools.git, full, { cwd: repo.checkout, env: gitEnv, timeoutMs: left() });
|
|
334
291
|
};
|
|
335
|
-
// ls-remote and fetch ride out a short network failure; a push or a local command is never retried (readOnlyCall).
|
|
336
292
|
return readOnlyCall(tools.git, full) === null ? once() : retryCall(once, callLabel(tools.git, full), net);
|
|
337
293
|
};
|
|
338
|
-
/** The remote every fetch, look and push names: the recorded URL, defined only on the command line. */
|
|
339
294
|
const remoteUrl = () => RELEASE_REMOTE;
|
|
340
295
|
const liveOwner = () => {
|
|
341
296
|
if (!existsSync(database))
|
|
@@ -349,13 +304,10 @@ export function releaseAdapters(options) {
|
|
|
349
304
|
}
|
|
350
305
|
};
|
|
351
306
|
const tail = (result) => (result.stderr || result.stdout).trim().split("\n").slice(-4).join(" ") || `exit ${result.code}`;
|
|
352
|
-
/** A deployment that stopped: in words, with the pause it left when that pause is before the swap. */
|
|
353
307
|
const stopped = (stage, message) => {
|
|
354
308
|
const gate = stageGate(stage, liveOwner);
|
|
355
309
|
return gate === null ? { ok: false, message } : { ok: false, message, gate };
|
|
356
310
|
};
|
|
357
|
-
/** The deployment gate in this runtime (deploy-gate.ts): a person's approval, the passing check, the exact completed
|
|
358
|
-
* result. Its answer names the approved commit and the project it belongs to, from the plane's own records. */
|
|
359
311
|
const proveCandidate = (runId) => {
|
|
360
312
|
if (!existsSync(database))
|
|
361
313
|
return { ok: false, message: "The plane's database isn't here, so the candidate can't be proven." };
|
|
@@ -370,7 +322,6 @@ export function releaseAdapters(options) {
|
|
|
370
322
|
db.close();
|
|
371
323
|
}
|
|
372
324
|
};
|
|
373
|
-
/** The run's recorded commit and project, for recovery (which needs no approval). */
|
|
374
325
|
const recordedCommit = (runId) => {
|
|
375
326
|
if (!existsSync(database))
|
|
376
327
|
return null;
|
|
@@ -386,13 +337,6 @@ export function releaseAdapters(options) {
|
|
|
386
337
|
db.close();
|
|
387
338
|
}
|
|
388
339
|
};
|
|
389
|
-
/**
|
|
390
|
-
* The approved commit, written by this runtime into a fresh folder it owns (commit-extract.ts): every regular file of
|
|
391
|
-
* that full SHA, read byte for byte from the PROJECT's own Git directory as Toolroll records it (realpath, a real
|
|
392
|
-
* directory — never the candidate worktree's `.git` pointer or anything in that worktree), with no filter, attribute,
|
|
393
|
-
* replacement object, lazy fetch, hook or outside config, and no symlink or submodule. The deployment script runs
|
|
394
|
-
* from here, so nothing changed, flagged, swapped or untracked in the worktree, nor its Git pointer, changes what runs.
|
|
395
|
-
*/
|
|
396
340
|
const extractApproved = async (repo, head) => {
|
|
397
341
|
let gitDir;
|
|
398
342
|
try {
|
|
@@ -412,13 +356,11 @@ export function releaseAdapters(options) {
|
|
|
412
356
|
}
|
|
413
357
|
return { ok: true, dir, gitDir };
|
|
414
358
|
};
|
|
415
|
-
/** The approved commit's own deployment script, from the pristine extraction; the worktree is only its --source. */
|
|
416
359
|
const deployScript = async (worktree, stage, runId, commit, extra, input) => {
|
|
417
360
|
const extracted = await extractApproved(commit.repo, commit.head);
|
|
418
361
|
if (!extracted.ok)
|
|
419
362
|
return { code: 1, stdout: "", stderr: extracted.message };
|
|
420
363
|
try {
|
|
421
|
-
// The script node runs is the extraction's own regular file, by its real path inside the folder.
|
|
422
364
|
let script;
|
|
423
365
|
try {
|
|
424
366
|
script = realpathSync(join(extracted.dir, "scripts", "deploy-browser.mjs"));
|
|
@@ -440,22 +382,16 @@ export function releaseAdapters(options) {
|
|
|
440
382
|
const release = storeReleaseAdapter(() => openStore(database), store => store.close(), options.now ?? (() => new Date()), undefined, { observe: sha => observeCi(sha), mergeBase: (base, sha) => readMergeBase(reads, ciGh, releaseRepo().slug, base, sha),
|
|
441
383
|
upToDateRequired: () => readUpToDateRequired(reads, ciGh, releaseRepo().slug), evidenceRoot: join(dirname(database), "evidence"),
|
|
442
384
|
macosCases: sha => macosCasesOf(run, ciGh, releaseRepo().slug, sha),
|
|
443
|
-
|
|
444
|
-
// executor protects that reporting channel, production releases must take the person's approval road.
|
|
445
|
-
reportsProtected: false },
|
|
446
|
-
// A boundary's one bounded read of GitHub's nightly: plain exec, never the release's long retries (20 s in all).
|
|
447
|
-
githubReads(run, ciGh));
|
|
385
|
+
reportsProtected: false }, githubReads(run, ciGh));
|
|
448
386
|
return {
|
|
449
387
|
...(existsSync(database) ? { release, progress: releaseProgressRecorder(() => openStore(database), store => store.close()) } : {}),
|
|
450
388
|
now: options.now ?? (() => new Date()),
|
|
451
389
|
sleep: options.sleep ?? sleep,
|
|
452
390
|
say,
|
|
453
391
|
repo: {
|
|
454
|
-
// The recorded owner/name, never the checkout's origin.
|
|
455
392
|
async github() { return releaseRepo().slug; },
|
|
456
393
|
async sync(branch) {
|
|
457
394
|
await must(git("fetch", "--quiet", "--no-tags", remoteUrl(), "+refs/heads/main:refs/remotes/origin/main"), "git fetch main");
|
|
458
|
-
// A merged branch may be gone from GitHub; its commit is already here.
|
|
459
395
|
await git("fetch", "--quiet", "--no-tags", remoteUrl(), `+refs/heads/${branch}:refs/remotes/origin/${branch}`);
|
|
460
396
|
const current = (await git("symbolic-ref", "--quiet", "--short", "HEAD")).stdout.trim();
|
|
461
397
|
if (current === "main") {
|
|
@@ -483,8 +419,6 @@ export function releaseAdapters(options) {
|
|
|
483
419
|
const pushed = await git("push", "--no-verify", `--force-with-lease=${ref}:${head}`, remoteUrl(), `:${ref}`);
|
|
484
420
|
if (pushed.code === 0)
|
|
485
421
|
return;
|
|
486
|
-
// GitHub may delete a merged branch itself between the look and the push; gone is what was wanted. Its refs can
|
|
487
|
-
// lag the deletion by a few seconds, so look a few times before calling it a failure.
|
|
488
422
|
for (let look = 0; look < BRANCH_GONE_LOOKS; look++) {
|
|
489
423
|
if (look > 0)
|
|
490
424
|
await pause(BRANCH_GONE_PAUSE_MS);
|
|
@@ -503,7 +437,6 @@ export function releaseAdapters(options) {
|
|
|
503
437
|
toolroll: {
|
|
504
438
|
async installed() { return { services: serviceRuntimes(), clis: cliRuntimes() }; },
|
|
505
439
|
async runtimeCommit(runtime) {
|
|
506
|
-
// deploy-browser writes this beside node_modules, not in the package's own manifest (whose version can repeat).
|
|
507
440
|
try {
|
|
508
441
|
const candidate = object(JSON.parse(readFileSync(join(runtime, "..", "..", "..", "package.json"), "utf8")))["candidate"];
|
|
509
442
|
return typeof candidate === "string" && /^[0-9a-f]{40}$/.test(candidate) ? candidate : null;
|
|
@@ -540,7 +473,6 @@ export function releaseAdapters(options) {
|
|
|
540
473
|
async busy() {
|
|
541
474
|
const db = new (sqlite().DatabaseSync)(database, { readOnly: true });
|
|
542
475
|
try {
|
|
543
|
-
// Match the deploy guard, including unfinished runs whose claim is gone. Keep one read snapshot.
|
|
544
476
|
db.exec("BEGIN");
|
|
545
477
|
const work = activeUpdateWork(db);
|
|
546
478
|
const tasks = db.prepare(`SELECT DISTINCT external_id FROM task_ref WHERE id IN (
|
|
@@ -556,15 +488,9 @@ export function releaseAdapters(options) {
|
|
|
556
488
|
}
|
|
557
489
|
},
|
|
558
490
|
async deploy({ run: runId, worktree, stage, operation }) {
|
|
559
|
-
// Approval policy §1.7: this runtime proves the candidate FIRST — a person approved it, its exact result passed
|
|
560
|
-
// the approved check and is complete, and the checkout is exactly that commit — before anything from the
|
|
561
|
-
// candidate's checkout runs. The candidate's own script never decides its own deployment.
|
|
562
491
|
const proven = proveCandidate(runId);
|
|
563
492
|
if (!proven.ok)
|
|
564
493
|
return stopped(stage, proven.message);
|
|
565
|
-
// The approved commit's own deployment, extracted by this runtime: drain, backup, rehearsal, swap, health. Its
|
|
566
|
-
// last JSON line names the runtime it installed; the CLI names are moved to it by the release's link step.
|
|
567
|
-
// The operation the coordinator reserved, adopted by the deploy run with its secret on stdin (never in argv).
|
|
568
494
|
const result = await deployScript(worktree, stage, runId, proven, ["--yes", ...(operation === undefined ? [] : ["--operation", operation.id])], operation?.secret);
|
|
569
495
|
const runtime = deployedRuntime(result.stdout);
|
|
570
496
|
if (result.code !== 0 || runtime === null)
|
|
@@ -572,16 +498,11 @@ export function releaseAdapters(options) {
|
|
|
572
498
|
return { ok: true, runtime };
|
|
573
499
|
},
|
|
574
500
|
async recoverDeploy({ run: runId, worktree, stage }) {
|
|
575
|
-
// Before prepare saves deployment.json, staging has not touched the service or admission gate.
|
|
576
501
|
if (!existsSync(join(stage, "deployment.json")))
|
|
577
502
|
return { ok: true };
|
|
578
|
-
// A deployment that outlived a killed release is still at work: recovering under it would race it.
|
|
579
503
|
const running = (options.processes ?? processes)().filter(one => one.command.includes("deploy-browser.mjs") && one.command.includes(stage));
|
|
580
504
|
if (running.length > 0)
|
|
581
505
|
return { ok: false, message: `the deployment is still running (process ${running.map(one => one.pid).join(", ")}); let it finish, then rerun` };
|
|
582
|
-
// The new service was started (the phase table's "forward" rows, deploy-phase.ts): the release resumes it
|
|
583
|
-
// forward with the deployment's own finish (health, both consoles, leases, then the pause lifted).
|
|
584
|
-
// Finishing deploys, so the candidate is proven first, as for a deploy.
|
|
585
506
|
const journalPhase = () => { try {
|
|
586
507
|
return object(JSON.parse(readFileSync(join(stage, "deployment.json"), "utf8")))["phase"];
|
|
587
508
|
}
|
|
@@ -600,10 +521,6 @@ export function releaseAdapters(options) {
|
|
|
600
521
|
}
|
|
601
522
|
else
|
|
602
523
|
why = proven.message;
|
|
603
|
-
// Once the new service was recorded as started, a journal alone never rolls it back: the release stops here.
|
|
604
|
-
// Still at "starting" (killed while waiting for the new service; finish only looks, and it did not find it
|
|
605
|
-
// running): the deployment's own recovery puts the previous service back, and only when it proves the new
|
|
606
|
-
// one gone. That needs no approval of the candidate, exactly as below.
|
|
607
524
|
if (journalPhase() !== "starting")
|
|
608
525
|
return stopped(stage, why);
|
|
609
526
|
const recorded = recordedCommit(runId);
|
|
@@ -614,14 +531,12 @@ export function releaseAdapters(options) {
|
|
|
614
531
|
return { ok: true };
|
|
615
532
|
return stopped(stage, `${why} The previous service was not put back either: ${tail(back)}`);
|
|
616
533
|
}
|
|
617
|
-
// Recovery needs no approval, but it runs only the recorded commit's own script, extracted by this runtime.
|
|
618
534
|
const recorded = recordedCommit(runId);
|
|
619
535
|
if (recorded === null)
|
|
620
536
|
return stopped(stage, `Run ${runId} names no commit to recover with.`);
|
|
621
537
|
const result = await deployScript(worktree, stage, runId, recorded, ["--phase", "recover"]);
|
|
622
538
|
if (result.code === 0)
|
|
623
539
|
return { ok: true };
|
|
624
|
-
// Killed while preparing, before it paused anything: nothing to undo (its journal is kept).
|
|
625
540
|
const journal = (() => { try {
|
|
626
541
|
return object(JSON.parse(readFileSync(join(stage, "deployment.json"), "utf8")));
|
|
627
542
|
}
|
|
@@ -633,7 +548,6 @@ export function releaseAdapters(options) {
|
|
|
633
548
|
return stopped(stage, `${tail(result)} (the deployment journal is at ${String(journal["phase"] ?? "an unreadable phase")}; ${join(stage, "deployment.json")})`);
|
|
634
549
|
},
|
|
635
550
|
async deploymentIdle(stage) {
|
|
636
|
-
// Whatever the stage: no deployment is running, and no update pause is held.
|
|
637
551
|
if ((options.processes ?? processes)().some(one => one.command.includes("deploy-browser.mjs")))
|
|
638
552
|
return false;
|
|
639
553
|
if (liveOwner() !== null)
|
|
@@ -641,10 +555,8 @@ export function releaseAdapters(options) {
|
|
|
641
555
|
if (stage === null)
|
|
642
556
|
return false;
|
|
643
557
|
const journalFile = join(stage, "deployment.json");
|
|
644
|
-
// Never prepared: staging touched neither the service nor the update pause.
|
|
645
558
|
if (!existsSync(journalFile))
|
|
646
559
|
return true;
|
|
647
|
-
// Its journal lock is free (nothing holds the journal), and it stopped where nothing changed, or finished.
|
|
648
560
|
try {
|
|
649
561
|
acquireDeploymentLock(journalFile, 0).release();
|
|
650
562
|
}
|
|
@@ -676,7 +588,6 @@ export function releaseAdapters(options) {
|
|
|
676
588
|
}));
|
|
677
589
|
return prs.find(one => one.state === "open") ?? prs.filter(one => one.state === "merged").sort((a, b) => b.number - a.number)[0] ?? null;
|
|
678
590
|
},
|
|
679
|
-
// Every attempt (filter=all), with its app, check suite and commit: the release judges each job by its latest attempt.
|
|
680
591
|
async checks(repo, sha, options) { return readCheckRuns(reads, ciGh, repo, sha, options); },
|
|
681
592
|
async complete(repo, sha) { return readSuitesComplete(reads, ciGh, repo, sha); },
|
|
682
593
|
async mainHead(repo) { return readMainHead(reads, ciGh, repo); },
|
|
@@ -684,9 +595,6 @@ export function releaseAdapters(options) {
|
|
|
684
595
|
async updateBranch(repo, pr, expectedHead) { return updatePullRequestBranch(reads, ciGh, repo, pr, expectedHead); },
|
|
685
596
|
async upToDateRequired(repo) { return readMainProtection(reads, ciGh, repo); },
|
|
686
597
|
async merge(repo, pr, head, message) {
|
|
687
|
-
// The squash commit's message lists every commit that landed after the approval (release-once.md). Never asked
|
|
688
|
-
// again under stale approval/lease/CI checks: reconcile a lost answer, but another write needs a fresh
|
|
689
|
-
// coordinator pass through those guards. A PR still being open proves none of them.
|
|
690
598
|
return writeWithRecheck(`merging #${pr}`, { ...net, maxAttempts: 1 }, {
|
|
691
599
|
write: remaining => ghWrite(remaining, "api", "-X", "PUT", `repos/${repo}/pulls/${pr}/merge`, "-f", "merge_method=squash", "-f", `sha=${head}`, ...(message === undefined ? [] : ["-f", `commit_message=${message}`])),
|
|
692
600
|
accept: result => {
|
|
@@ -726,9 +634,6 @@ export function releaseAdapters(options) {
|
|
|
726
634
|
homebrew: {
|
|
727
635
|
repo: tap,
|
|
728
636
|
async checked(head) {
|
|
729
|
-
// Only a workflow that runs on pull requests (or pushes) puts checks on the tap's change; apps that open a
|
|
730
|
-
// check suite and never run it don't count. Workflows are read as the change has them and as the tap's default
|
|
731
|
-
// branch has them (pull_request_target runs from there); a file this can't read counts as checking.
|
|
732
637
|
for (const ref of [head, await defaultBranch()]) {
|
|
733
638
|
const listed = await gh("api", `repos/${tap}/contents/.github/workflows?ref=${encodeURIComponent(ref)}`, "--jq", ".[] | select(.type == \"file\") | .path");
|
|
734
639
|
if (listed.code !== 0) {
|
|
@@ -749,7 +654,6 @@ export function releaseAdapters(options) {
|
|
|
749
654
|
return false;
|
|
750
655
|
},
|
|
751
656
|
async statuses(head) {
|
|
752
|
-
// The older commit-status API, which some CI reports through instead of checks; newest first, so reversed.
|
|
753
657
|
const out = await must(gh("api", "--paginate", `repos/${tap}/commits/${head}/statuses?per_page=100`, "--jq", ".[] | {context, state}"), "gh api statuses");
|
|
754
658
|
return out.split("\n").filter(Boolean).map(line => object(JSON.parse(line))).reverse().map((one) => {
|
|
755
659
|
const state = String(one["state"]);
|
|
@@ -761,11 +665,9 @@ export function releaseAdapters(options) {
|
|
|
761
665
|
const current = await formulaAt(branch);
|
|
762
666
|
if (current.text.includes(`-${version}.tgz`))
|
|
763
667
|
return { kind: "current" };
|
|
764
|
-
// Ordering (pipeline-speed.md, P1): a tap already on a later version is never moved back by an older release.
|
|
765
668
|
const named = formulaVersion(current.text);
|
|
766
669
|
if (named !== null && versionAfter(named, version))
|
|
767
670
|
return { kind: "newer", version: named };
|
|
768
|
-
// Only a change from the tap's own branch counts: a fork's pull request of the same branch name never does.
|
|
769
671
|
const open = (await ghJson("gh pr list", "pr", "list", "--repo", tap, "--head", brewBranch(version), "--state", "open", "--json", "number,headRefOid,headRepository,headRepositoryOwner,isCrossRepository"));
|
|
770
672
|
const own = open.filter(one => tapOwnHead(one, tap));
|
|
771
673
|
if (own.length > 1)
|
|
@@ -787,11 +689,9 @@ export function releaseAdapters(options) {
|
|
|
787
689
|
throw new Error("The tap current version is unreadable or newer; no downgrade was proposed.");
|
|
788
690
|
const next = bumpFormula(current.text, tarball, sha256);
|
|
789
691
|
const branch = brewBranch(version);
|
|
790
|
-
// A branch left by an earlier attempt is reused.
|
|
791
692
|
const made = await gh("api", "-X", "POST", `repos/${tap}/git/refs`, "-f", `ref=refs/heads/${branch}`, "-f", `sha=${baseSha}`);
|
|
792
693
|
if (made.code !== 0 && !/Reference already exists/.test(made.stderr + made.stdout))
|
|
793
694
|
throw new Error(`creating ${tap} ${branch}: ${made.stderr.trim()}`);
|
|
794
|
-
// A branch left by an earlier attempt starts again from the base (security scan): none of its history is kept.
|
|
795
695
|
if (made.code !== 0)
|
|
796
696
|
await must(gh("api", "-X", "PATCH", `repos/${tap}/git/refs/heads/${branch}`, "-f", `sha=${baseSha}`, "-F", "force=true"), `resetting ${tap} ${branch}`);
|
|
797
697
|
const onBranch = await formulaAt(branch);
|
|
@@ -803,12 +703,9 @@ export function releaseAdapters(options) {
|
|
|
803
703
|
return { pr: Number(opened["number"]), head: String(opened["headRefOid"]) };
|
|
804
704
|
},
|
|
805
705
|
async verified(pr, head, version) {
|
|
806
|
-
// The change at exactly `head` is the tap's own, and its formula is exactly today's formula with npm's published
|
|
807
|
-
// tarball and that tarball's own sha256: nothing else is ever merged.
|
|
808
706
|
const view = object(await ghJson("gh pr view", "pr", "view", String(pr), "--repo", tap, "--json", "number,headRefOid,headRefName,baseRefName,headRepository,headRepositoryOwner,isCrossRepository,state"));
|
|
809
707
|
const base = await defaultBranch();
|
|
810
708
|
const baseHead = String(object(object(await ghJson("gh api git/ref", "api", `repos/${tap}/git/ref/heads/${base}`))["object"])["sha"]);
|
|
811
|
-
// The whole change against the tap's default branch head: its merge base, its commits and every file it touches.
|
|
812
709
|
const compare = object(await ghJson("gh api compare", "api", `repos/${tap}/compare/${encodeURIComponent(baseHead)}...${encodeURIComponent(head)}`));
|
|
813
710
|
const tarball = `https://registry.npmjs.org/toolroll/-/toolroll-${version}.tgz`;
|
|
814
711
|
const response = await get(tarball, { signal: AbortSignal.timeout(60_000) });
|
|
@@ -835,7 +732,6 @@ export function releaseAdapters(options) {
|
|
|
835
732
|
},
|
|
836
733
|
},
|
|
837
734
|
};
|
|
838
|
-
/** A tag's commit as GitHub answers now (an annotated tag: the commit it names), or null when there is no such tag. */
|
|
839
735
|
async function readTag(repo, tag, bounded = net) {
|
|
840
736
|
const read = (path) => retryingExec(run, bounded)(tools.gh, ["api", path], { cwd: "/", env: gitEnv });
|
|
841
737
|
const result = await read(`repos/${repo}/git/ref/tags/${tag}`);
|
|
@@ -849,8 +745,6 @@ export function releaseAdapters(options) {
|
|
|
849
745
|
return String(target["sha"]);
|
|
850
746
|
return String(object(object(JSON.parse(await must(read(`repos/${repo}/git/tags/${String(target["sha"])}`), "gh api git/tags")))["object"])["sha"]);
|
|
851
747
|
}
|
|
852
|
-
/** Whether a pull request is merged from exactly `head` (its merge commit), still open at `head` (not merged), or
|
|
853
|
-
* anything else — read after a merge's answer was lost. */
|
|
854
748
|
async function pullMergedAt(repo, pr, head, base, bounded, message) {
|
|
855
749
|
const read = async (path) => object(JSON.parse(await must(retryingExec(run, bounded)(tools.gh, ["api", path], { cwd: "/", env: gitEnv }), "gh api merge recovery")));
|
|
856
750
|
const pull = await read(`repos/${repo}/pulls/${pr}`);
|
|
@@ -858,7 +752,6 @@ export function releaseAdapters(options) {
|
|
|
858
752
|
if (at !== head || object(pull["base"])["ref"] !== base)
|
|
859
753
|
return { state: "other", why: `#${pr} is no longer open at ${head.slice(0, 7)} into ${base}` };
|
|
860
754
|
if (pull["merged"] === true && pull["state"] === "closed" && typeof commit === "string" && /^[0-9a-f]{40}$/.test(commit)) {
|
|
861
|
-
// Another caller may have merged it. Only the same squash result counts, never merely "merged=true".
|
|
862
755
|
const source = await read(`repos/${repo}/git/commits/${head}`);
|
|
863
756
|
const merged = await read(`repos/${repo}/git/commits/${commit}`);
|
|
864
757
|
const tree = object(source["tree"])["sha"], parents = merged["parents"];
|
|
@@ -881,15 +774,8 @@ export function releaseAdapters(options) {
|
|
|
881
774
|
}
|
|
882
775
|
}
|
|
883
776
|
const brewBranch = (version) => `toolroll-${version}`;
|
|
884
|
-
/**
|
|
885
|
-
* Why a tap change isn't exactly the formula bump this release proposed (security scan), or null when it is: the tap's
|
|
886
|
-
* own open pull request number `pr` at exactly `head`, from its version branch into the default branch; compared with
|
|
887
|
-
* the default branch's head it is one commit on top of exactly that head, changing exactly one file, the formula; and
|
|
888
|
-
* the formula there is exactly today's with npm's published tarball and that tarball's own sha256.
|
|
889
|
-
*/
|
|
890
777
|
export function tapChangeProblem(input) {
|
|
891
778
|
const { tap, pr, head, version, view, compare } = input;
|
|
892
|
-
// State may have changed since the coordinator checked it. Judge the immutable base used for this comparison.
|
|
893
779
|
if (input.baseVersion === null)
|
|
894
780
|
return `${tap} current version cannot be read`;
|
|
895
781
|
if (versionAfter(input.baseVersion, version))
|
|
@@ -911,7 +797,6 @@ export function tapChangeProblem(input) {
|
|
|
911
797
|
return `${tap} #${pr}'s formula isn't npm's ${version} tarball with its sha256 ${input.sha256.slice(0, 12)}`;
|
|
912
798
|
return null;
|
|
913
799
|
}
|
|
914
|
-
/** Whether a pull request's head is a branch of the tap itself (never a fork's). */
|
|
915
800
|
export function tapOwnHead(pr, tap) {
|
|
916
801
|
const [owner, name] = tap.split("/");
|
|
917
802
|
const repo = pr["headRepository"], who = pr["headRepositoryOwner"];
|
|
@@ -920,12 +805,10 @@ export function tapOwnHead(pr, tap) {
|
|
|
920
805
|
return pr["isCrossRepository"] === false && typeof repoName === "string" && typeof ownerLogin === "string"
|
|
921
806
|
&& repoName.toLowerCase() === (name ?? "").toLowerCase() && ownerLogin.toLowerCase() === (owner ?? "").toLowerCase();
|
|
922
807
|
}
|
|
923
|
-
/** The version a formula's tarball url names (`…/toolroll-<x.y.z>.tgz`), or null. */
|
|
924
808
|
export function formulaVersion(text) {
|
|
925
809
|
const found = /^\s*url "[^"]*-(\d+\.\d+\.\d+)\.tgz"/m.exec(text);
|
|
926
810
|
return found === null ? null : found[1];
|
|
927
811
|
}
|
|
928
|
-
/** Whether version `a` comes after `b` (both x.y.z). */
|
|
929
812
|
export function versionAfter(a, b) {
|
|
930
813
|
const pa = a.split(".").map(Number), pb = b.split(".").map(Number);
|
|
931
814
|
for (let i = 0; i < 3; i++)
|
|
@@ -933,13 +816,7 @@ export function versionAfter(a, b) {
|
|
|
933
816
|
return (pa[i] ?? 0) > (pb[i] ?? 0);
|
|
934
817
|
return false;
|
|
935
818
|
}
|
|
936
|
-
/** The events that put checks on a change. */
|
|
937
819
|
const CHANGE_EVENTS = new Set(["pull_request", "pull_request_target", "push", "merge_group"]);
|
|
938
|
-
/**
|
|
939
|
-
* Whether a workflow's triggers (its top-level `on:` as a name, a list or a map) include a change to the repository.
|
|
940
|
-
* A file that doesn't parse, or whose triggers aren't one of those shapes, counts as running, so the release waits
|
|
941
|
-
* rather than skipping checks it owes.
|
|
942
|
-
*/
|
|
943
820
|
export function workflowRunsOnChange(text) {
|
|
944
821
|
let parsed;
|
|
945
822
|
try {
|
|
@@ -951,7 +828,6 @@ export function workflowRunsOnChange(text) {
|
|
|
951
828
|
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
|
|
952
829
|
return true;
|
|
953
830
|
const workflow = parsed;
|
|
954
|
-
// YAML 1.1 readers take a bare `on` for true; either key names the triggers.
|
|
955
831
|
const on = "on" in workflow ? workflow["on"] : workflow["true"];
|
|
956
832
|
const events = typeof on === "string" ? [on]
|
|
957
833
|
: Array.isArray(on) ? on
|
|
@@ -961,13 +837,11 @@ export function workflowRunsOnChange(text) {
|
|
|
961
837
|
return true;
|
|
962
838
|
return events.some(one => CHANGE_EVENTS.has(one));
|
|
963
839
|
}
|
|
964
|
-
/** The formula with its first `url` and `sha256` replaced; anything else is left exactly as it was. */
|
|
965
840
|
export function bumpFormula(text, url, sha256) {
|
|
966
841
|
if (!/^\s*url "[^"]*"/m.test(text) || !/^\s*sha256 "[0-9a-f]{64}"/m.test(text))
|
|
967
842
|
throw new Error("the formula has no url and sha256 lines to update");
|
|
968
843
|
return text.replace(/^(\s*url ")[^"]*(")/m, `$1${url}$2`).replace(/^(\s*sha256 ")[0-9a-f]{64}(")/m, `$1${sha256}$2`);
|
|
969
844
|
}
|
|
970
|
-
/** The plane's person-approval answer from `task show --json`, read strictly: anything malformed is no person. */
|
|
971
845
|
function personAnswerOf(value) {
|
|
972
846
|
if (value === undefined)
|
|
973
847
|
return {};
|
|
@@ -976,17 +850,7 @@ function personAnswerOf(value) {
|
|
|
976
850
|
return { person: { ok: true, method: read["method"] } };
|
|
977
851
|
return { person: { ok: false, why: typeof read["why"] === "string" ? read["why"] : "the plane's answer about who approved it can't be read" } };
|
|
978
852
|
}
|
|
979
|
-
|
|
980
|
-
* The release's authority record through a store (release-once.md): what `toolroll release` reads and writes for its
|
|
981
|
-
* lease, its carries and its operations. `open` hands a store for each call and `done` lets it go.
|
|
982
|
-
*/
|
|
983
|
-
export function storeReleaseAdapter(open, done, now, runner,
|
|
984
|
-
/** Releases that approve themselves (auto-approve-green.md): the plane's own look at CI on a commit, and where the
|
|
985
|
-
* check receipts are kept. Absent: no automatic approval, every release asks a person. */
|
|
986
|
-
auto,
|
|
987
|
-
/** GitHub's nightly (nightly-github.ts): the plane's own gh reads for a boundary's one bounded read. Absent: nothing
|
|
988
|
-
* is read at the boundary, and the stored debt still holds inside every reservation. */
|
|
989
|
-
nightlyReads) {
|
|
853
|
+
export function storeReleaseAdapter(open, done, now, runner, auto, nightlyReads) {
|
|
990
854
|
const withStore = (body) => { const store = open(); try {
|
|
991
855
|
return body(store);
|
|
992
856
|
}
|
|
@@ -995,15 +859,12 @@ nightlyReads) {
|
|
|
995
859
|
} };
|
|
996
860
|
return {
|
|
997
861
|
...(auto === undefined ? {} : { auto: autoReleaseAdapter(withStore, now, auto) }),
|
|
998
|
-
// One-tap release approval (trusted-release-reports.md, slice A): ids and the coordinator's own readings only; the
|
|
999
|
-
// plane decides from its own records whether anything is written.
|
|
1000
862
|
ready: {
|
|
1001
863
|
async asked(taskId) { withStore(store => { noteReleaseReady(store, { taskId, now: now() }); }); },
|
|
1002
864
|
async ci(input) { withStore(store => { recordReleaseCi(store, { ...input, now: now() }); }); },
|
|
1003
865
|
async stopped(input) { withStore(store => { noteReleaseStopped(store, { ...input, now: now() }); }); },
|
|
1004
866
|
async verified(input) { withStore(store => { recordVerifiedRelease(store, { ...input, now: now() }); }); },
|
|
1005
867
|
},
|
|
1006
|
-
// After a failed release check, and before a pass is taken: the plane's own classification (check-failure.ts).
|
|
1007
868
|
...(auto === undefined ? {} : {
|
|
1008
869
|
async recheck(taskId) {
|
|
1009
870
|
return withStore(store => {
|
|
@@ -1012,8 +873,6 @@ nightlyReads) {
|
|
|
1012
873
|
});
|
|
1013
874
|
},
|
|
1014
875
|
async fencedCoverage(_taskId, run, candidate) {
|
|
1015
|
-
// Today's road, read first and answered at once: a check that ran unsandboxed skips nothing for this reason. A run
|
|
1016
|
-
// from before stamps (a release resumed across an update) is judged by the level its dispatch recorded.
|
|
1017
876
|
const asked = withStore(store => {
|
|
1018
877
|
if (store.runCheckAccess(run) === "unsandboxed")
|
|
1019
878
|
return null;
|
|
@@ -1100,8 +959,6 @@ nightlyReads) {
|
|
|
1100
959
|
},
|
|
1101
960
|
};
|
|
1102
961
|
}
|
|
1103
|
-
/** The plane's automatic release approval through a store (release-auto.ts): what `toolroll release` asks. It hands the
|
|
1104
|
-
* plane ids only; the plane reads CI itself (`observe`) right before it seals. */
|
|
1105
962
|
function autoReleaseAdapter(withStore, now, auto) {
|
|
1106
963
|
const reportProblem = () => auto.reportsProtected === true ? null
|
|
1107
964
|
: "CI test reports aren't protected from candidate writes, so a person must approve this release";
|
|
@@ -1119,8 +976,6 @@ function autoReleaseAdapter(withStore, now, auto) {
|
|
|
1119
976
|
const problem = reportProblem();
|
|
1120
977
|
if (problem !== null)
|
|
1121
978
|
return { ok: false, why: problem };
|
|
1122
|
-
// The comparison base for what the release changes: GitHub's own merge base of the candidate with the release's
|
|
1123
|
-
// base branch (its signed terms), read by the plane — never a task branch or a build's recorded base.
|
|
1124
979
|
const branch = withStore(store => store.getScope(input.taskId)?.releaseTerms?.base ?? null);
|
|
1125
980
|
if (branch === null)
|
|
1126
981
|
return { ok: false, why: "only a release task is approved automatically" };
|
|
@@ -1146,7 +1001,6 @@ function autoReleaseAdapter(withStore, now, auto) {
|
|
|
1146
1001
|
return { ok: false, why: unprotected };
|
|
1147
1002
|
}
|
|
1148
1003
|
let ci = null, problem = "";
|
|
1149
|
-
// A short network failure is asked again a few times; GitHub not answering is never a pass.
|
|
1150
1004
|
for (let attempt = 0; attempt < 3 && ci === null; attempt++) {
|
|
1151
1005
|
try {
|
|
1152
1006
|
ci = await auto.observe(input.candidate);
|
|
@@ -1173,10 +1027,8 @@ function autoReleaseAdapter(withStore, now, auto) {
|
|
|
1173
1027
|
async giveUp(taskId, why) { withStore(store => giveUpAutoApproval(store, { taskId, why, now: now() })); },
|
|
1174
1028
|
async ciRunning(taskId, candidate) { withStore(store => noteCiRunning(store, { taskId, candidate, now: now() })); },
|
|
1175
1029
|
async ciPassed(taskId, candidate, ask) {
|
|
1176
|
-
// Reconcile the plane's record, not journal flags; without a pending row there is nothing to lift.
|
|
1177
1030
|
if (!withStore(store => releaseCiHoldOf(store, taskId) !== null || releaseCiRunningOf(store, taskId) !== null))
|
|
1178
1031
|
return { ok: true };
|
|
1179
|
-
// The plane reads CI itself; a short network failure is asked again a few times, and unreadable is never a pass.
|
|
1180
1032
|
let ci = null, problem = "";
|
|
1181
1033
|
for (let attempt = 0; attempt < 3 && ci === null; attempt++) {
|
|
1182
1034
|
try {
|
|
@@ -1197,31 +1049,19 @@ function autoReleaseAdapter(withStore, now, auto) {
|
|
|
1197
1049
|
async publishHeld(taskId) { return withStore(store => autoPublishHeld(store, taskId)); },
|
|
1198
1050
|
};
|
|
1199
1051
|
}
|
|
1200
|
-
/** The environment every CI read runs gh with: no caller PATH, host, config folder or proxy override. */
|
|
1201
1052
|
function ciEnv() {
|
|
1202
1053
|
const kept = Object.fromEntries(["HOME", "LANG", "LC_ALL", "TMPDIR", "USER", "LOGNAME", "GH_TOKEN", "GITHUB_TOKEN"].flatMap(name => process.env[name] === undefined ? [] : [[name, process.env[name]]]));
|
|
1203
1054
|
return { ...kept, PATH: "/usr/bin:/bin", GH_HOST: "github.com", GH_PROMPT_DISABLED: "1", GH_NO_UPDATE_NOTIFIER: "1" };
|
|
1204
1055
|
}
|
|
1205
|
-
|
|
1206
|
-
* Every check run GitHub holds for one commit — every attempt, not only the latest (`filter=all`; GitHub's default
|
|
1207
|
-
* lists only the latest of each), every page — with its id, app, check suite and the commit it is filed under, oldest
|
|
1208
|
-
* first. A row that doesn't parse stops the read: a partial answer is never taken for the whole.
|
|
1209
|
-
*/
|
|
1210
|
-
export async function readCheckRuns(run, gh, repo, sha,
|
|
1211
|
-
/** A release tag (pipeline-speed.md, item 3): a push of exactly this tag binds its workflow file too. */
|
|
1212
|
-
options = {}) {
|
|
1056
|
+
export async function readCheckRuns(run, gh, repo, sha, options = {}) {
|
|
1213
1057
|
if (options.tag !== undefined && !/^v\d+\.\d+\.\d+$/.test(options.tag))
|
|
1214
1058
|
throw new Error("not a release tag");
|
|
1215
1059
|
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo) || !/^[0-9a-f]{40}$/.test(sha))
|
|
1216
1060
|
throw new Error("not a repository and commit GitHub can be asked about");
|
|
1217
1061
|
const out = await must(run(gh, ["api", "--hostname", "github.com", "--paginate", `repos/${repo}/commits/${sha}/check-runs?filter=all&per_page=100`,
|
|
1218
1062
|
"--jq", ".check_runs[] | {id, name, status, conclusion, app: .app.slug, suite: .check_suite.id, head: .head_sha}"], { cwd: "/", env: ciEnv() }), "gh api check-runs");
|
|
1219
|
-
// Which workflow each check suite is a run of (GitHub's workflow-run API): a newer run of a workflow supersedes its
|
|
1220
|
-
// older runs on this commit (release.ts prChecksVerdict).
|
|
1221
1063
|
const flows = await must(run(gh, ["api", "--hostname", "github.com", "--paginate", `repos/${repo}/actions/runs?head_sha=${sha}&per_page=100`,
|
|
1222
1064
|
"--jq", ".workflow_runs[] | {suite: .check_suite_id, workflow: .workflow_id, path: .path, head: .head_sha, event: .event, branch: .head_branch, bases: [(.pull_requests // [])[] | .base.ref], prs: [(.pull_requests // [])[] | {number, repo: .base.repo.url}]}"], { cwd: "/", env: ciEnv() }), "gh api actions/runs");
|
|
1223
|
-
// A pull request's base can be edited after its runs: a run counts only if no pull request it belongs to ever had its
|
|
1224
|
-
// base changed (GitHub's timeline), so a run made against another base can't later read as a run into main.
|
|
1225
1065
|
const retargeted = new Map();
|
|
1226
1066
|
const everRetargeted = async (pr) => {
|
|
1227
1067
|
const known = retargeted.get(pr);
|
|
@@ -1239,7 +1079,6 @@ options = {}) {
|
|
|
1239
1079
|
return changed;
|
|
1240
1080
|
};
|
|
1241
1081
|
const workflowOf = new Map();
|
|
1242
|
-
// Each suite's workflow file: a required check counts only from the workflow that defines it (release.ts).
|
|
1243
1082
|
const pathOf = new Map();
|
|
1244
1083
|
for (const line of flows.split("\n").filter(Boolean)) {
|
|
1245
1084
|
const one = object(JSON.parse(line));
|
|
@@ -1249,11 +1088,6 @@ options = {}) {
|
|
|
1249
1088
|
if (known !== undefined && (known !== Number(one["workflow"]) || pathOf.get(Number(one["suite"])) !== one["path"]))
|
|
1250
1089
|
throw new Error("GitHub named two workflows for one check suite");
|
|
1251
1090
|
workflowOf.set(Number(one["suite"]), Number(one["workflow"]));
|
|
1252
|
-
// Only a run on a pull request into main, or a push to main, binds its workflow file: a pull request into another
|
|
1253
|
-
// branch reads that branch's workflow and join verifier, which the candidate may control (security scan of the
|
|
1254
|
-
// join). Any other run keeps no path, so no required check counts from it.
|
|
1255
|
-
// Each pull request the run belongs to must be this repository's own (a number from another repository names a
|
|
1256
|
-
// different pull request here): any other refuses the run.
|
|
1257
1091
|
const prs = (Array.isArray(one["prs"]) ? one["prs"] : []).map(pr => (pr !== null && typeof pr === "object" ? pr : {}));
|
|
1258
1092
|
const ours = prs.length > 0 && prs.every(pr => Number.isSafeInteger(pr["number"]) && pr["repo"] === `https://api.github.com/repos/${repo}`);
|
|
1259
1093
|
const untouched = one["event"] !== "pull_request" || (ours && !(await Promise.all(prs.map(pr => everRetargeted(Number(pr["number"]))))).some(Boolean));
|
|
@@ -1270,8 +1104,6 @@ options = {}) {
|
|
|
1270
1104
|
});
|
|
1271
1105
|
if (new Set(runs.map(one => one.id)).size !== runs.length)
|
|
1272
1106
|
throw new Error("GitHub answered the same check run twice");
|
|
1273
|
-
// Each unsuccessful GitHub Actions attempt: whether GitHub's own job record (a check run's id is its job's) shows it
|
|
1274
|
-
// ending before any of the workflow's own steps ran. Only that ever counts as the runner's failure; unreadable is no.
|
|
1275
1107
|
for (const one of runs) {
|
|
1276
1108
|
if (one.app !== "github-actions" || one.status !== "completed" || one.conclusion === "success" || one.conclusion === "skipped" || one.conclusion === "neutral")
|
|
1277
1109
|
continue;
|
|
@@ -1279,7 +1111,6 @@ options = {}) {
|
|
|
1279
1111
|
}
|
|
1280
1112
|
return runs.sort((a, b) => a.id - b.id);
|
|
1281
1113
|
}
|
|
1282
|
-
/** GitHub's job record for one check run (its job), read strictly: null when it can't be read whole. */
|
|
1283
1114
|
export async function readJobBeforeTests(run, gh, repo, id) {
|
|
1284
1115
|
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo) || !Number.isSafeInteger(id) || id <= 0)
|
|
1285
1116
|
return null;
|
|
@@ -1307,12 +1138,6 @@ export async function readJobBeforeTests(run, gh, repo, id) {
|
|
|
1307
1138
|
return failedBeforeTests({ id, status: String(job["status"]), conclusion: textOr(job["conclusion"]),
|
|
1308
1139
|
steps: steps.map(one => ({ number: Number(one["number"]), name: String(one["name"]), status: String(one["status"]), conclusion: textOr(one["conclusion"]) })) });
|
|
1309
1140
|
}
|
|
1310
|
-
/**
|
|
1311
|
-
* GitHub's REST API as GitHub's nightly reads it (nightly-github.ts): GET only, github.com only, a repository path, the
|
|
1312
|
-
* plane's own gh with the allowlisted environment, each call bounded by its caller's deadline. A background read rides
|
|
1313
|
-
* out a short network failure (release-net.ts, within that call's own share of the deadline); a boundary's read is
|
|
1314
|
-
* plain exec. Never an answer that isn't GitHub's whole JSON.
|
|
1315
|
-
*/
|
|
1316
1141
|
export function githubReads(run, gh, options = {}) {
|
|
1317
1142
|
return async (path, timeoutMs) => {
|
|
1318
1143
|
if (!/^repos\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_./?&=%-]+$/.test(path) || timeoutMs <= 0)
|
|
@@ -1335,7 +1160,6 @@ export function githubReads(run, gh, options = {}) {
|
|
|
1335
1160
|
}
|
|
1336
1161
|
};
|
|
1337
1162
|
}
|
|
1338
|
-
/** GitHub lists check runs from at most the latest 1000 check suites of a commit: the history is whole only below that. */
|
|
1339
1163
|
export const CHECK_SUITE_CEILING = 1000;
|
|
1340
1164
|
export async function readSuitesComplete(run, gh, repo, sha) {
|
|
1341
1165
|
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo) || !/^[0-9a-f]{40}$/.test(sha))
|
|
@@ -1344,7 +1168,6 @@ export async function readSuitesComplete(run, gh, repo, sha) {
|
|
|
1344
1168
|
const total = Number(out.stdout.trim());
|
|
1345
1169
|
return out.code === 0 && out.stdout.trim() !== "" && Number.isSafeInteger(total) && total >= 0 && total < CHECK_SUITE_CEILING;
|
|
1346
1170
|
}
|
|
1347
|
-
/** GitHub's merge base of `sha` with branch `base` (the compare API), read by the plane. */
|
|
1348
1171
|
export async function readMergeBase(run, gh, repo, base, sha) {
|
|
1349
1172
|
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo) || !/^[0-9a-f]{40}$/.test(sha) || !/^[A-Za-z0-9._/-]+$/.test(base) || base.includes(".."))
|
|
1350
1173
|
throw new Error("not a repository, branch and commit GitHub can be asked about");
|
|
@@ -1353,10 +1176,6 @@ export async function readMergeBase(run, gh, repo, base, sha) {
|
|
|
1353
1176
|
throw new Error("GitHub named no merge base");
|
|
1354
1177
|
return out;
|
|
1355
1178
|
}
|
|
1356
|
-
/**
|
|
1357
|
-
* Main's head as GitHub has it now (eval-harness review 1, finding 4): read by the plane's own gh from GitHub's API,
|
|
1358
|
-
* never from a ref in a checkout a build can write.
|
|
1359
|
-
*/
|
|
1360
1179
|
export async function readMainHead(run, gh, repo, branch = "main") {
|
|
1361
1180
|
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo) || !/^[A-Za-z0-9._/-]+$/.test(branch) || branch.includes(".."))
|
|
1362
1181
|
throw new Error("not a repository and branch GitHub can be asked about");
|
|
@@ -1366,14 +1185,12 @@ export async function readMainHead(run, gh, repo, branch = "main") {
|
|
|
1366
1185
|
throw new Error(`GitHub named no commit for ${branch}`);
|
|
1367
1186
|
return match[1];
|
|
1368
1187
|
}
|
|
1369
|
-
/** GitHub's own "Update branch", with its expected head: a push that got there first refuses. */
|
|
1370
1188
|
export async function updatePullRequestBranch(run, gh, repo, pr, expectedHead) {
|
|
1371
1189
|
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo) || !Number.isSafeInteger(pr) || pr < 1 || !/^[0-9a-f]{40}$/.test(expectedHead))
|
|
1372
1190
|
return { ok: false, why: "not a pull request GitHub can be asked to update" };
|
|
1373
1191
|
const ran = await run(gh, ["api", "--hostname", "github.com", "--method", "PUT", `repos/${repo}/pulls/${pr}/update-branch`, "-f", `expected_head_sha=${expectedHead}`], { cwd: "/", env: ciEnv() });
|
|
1374
1192
|
return ran.code === 0 ? { ok: true } : { ok: false, why: (ran.stderr.trim().split("\n")[0] ?? "").slice(0, 200) || `gh exited ${ran.code}` };
|
|
1375
1193
|
}
|
|
1376
|
-
/** Whether `sha` already holds `ancestor` (GitHub's compare: `sha` is not behind it), as GitHub answers now. */
|
|
1377
1194
|
export async function readContains(run, gh, repo, sha, ancestor) {
|
|
1378
1195
|
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo) || !/^[0-9a-f]{40}$/.test(sha) || !/^[0-9a-f]{40}$/.test(ancestor))
|
|
1379
1196
|
throw new Error("not a repository and commits GitHub can be asked about");
|
|
@@ -1389,24 +1206,11 @@ export async function readContains(run, gh, repo, sha, ancestor) {
|
|
|
1389
1206
|
throw new Error("GitHub's comparison couldn't be read");
|
|
1390
1207
|
return answer[1] === 0 && (answer[0] === "ahead" || answer[0] === "identical");
|
|
1391
1208
|
}
|
|
1392
|
-
/**
|
|
1393
|
-
* Main's protection, judged for the principal that merges (eval-harness review 2, finding 1; review 1, finding 4): the
|
|
1394
|
-
* plane's own gh, which merges as the same account. A layer holds only when it requires branches to be up to date, names
|
|
1395
|
-
* a non-empty set of required checks covering PROTECTION_MINIMUM_CHECKS, bound to GitHub Actions (app 15368), and
|
|
1396
|
-
* can't be bypassed by that account:
|
|
1397
|
-
* classic protection with "Do not allow bypassing the above settings" (`enforce_admins`); an active ruleset whose
|
|
1398
|
-
* bypass list reads whole, names no role, team or organization admin, and says this account never bypasses it. Read
|
|
1399
|
-
* only — Toolroll never changes a repository's settings. A layer that can't be read never holds. When no layer holds
|
|
1400
|
-
* and one couldn't be read (gh failed for a reason other than "not protected", or its answer didn't parse), the read
|
|
1401
|
-
* throws ProtectionUnreadable: "couldn't read GitHub" is never reported as "protection doesn't hold", and never as
|
|
1402
|
-
* holding. Null only for a repository or branch name GitHub can't be asked about.
|
|
1403
|
-
*/
|
|
1404
1209
|
export async function readMainProtection(run, gh, repo, branch = "main") {
|
|
1405
1210
|
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repo) || !/^[A-Za-z0-9._/-]+$/.test(branch) || branch.includes(".."))
|
|
1406
1211
|
return null;
|
|
1407
1212
|
const missing = [];
|
|
1408
1213
|
const held = [];
|
|
1409
|
-
/** What couldn't be read at all, and the words gh gave. */
|
|
1410
1214
|
const unread = [];
|
|
1411
1215
|
const words = (out) => (out.stderr || out.stdout).trim().split("\n").slice(-1)[0]?.slice(0, 160) || `exit ${out.code}`;
|
|
1412
1216
|
const judge = (where, strict, checks, bound, bypass) => {
|
|
@@ -1444,14 +1248,13 @@ export async function readMainProtection(run, gh, repo, branch = "main") {
|
|
|
1444
1248
|
};
|
|
1445
1249
|
const actionsChecks = (list, appKey) => Array.isArray(list)
|
|
1446
1250
|
? list.flatMap(one => { const check = object(one); return check[appKey] === 15368 && typeof check["context"] === "string" ? [check["context"]] : []; }) : [];
|
|
1447
|
-
// Classic branch protection, read whole. Context names alone allow an arbitrary writer to supply their status.
|
|
1448
1251
|
const classic = await run(gh, ["api", "--hostname", "github.com", `repos/${repo}/branches/${branch}/protection`], { cwd: "/", env: ciEnv() });
|
|
1449
1252
|
if (classic.code === 0) {
|
|
1450
1253
|
let answer = null;
|
|
1451
1254
|
try {
|
|
1452
1255
|
answer = JSON.parse(classic.stdout);
|
|
1453
1256
|
}
|
|
1454
|
-
catch {
|
|
1257
|
+
catch { }
|
|
1455
1258
|
const p = object(answer), checks = p["required_status_checks"];
|
|
1456
1259
|
if (answer === null || typeof answer !== "object" || Array.isArray(answer))
|
|
1457
1260
|
unread.push("classic protection (its answer didn't parse)");
|
|
@@ -1460,7 +1263,6 @@ export async function readMainProtection(run, gh, repo, branch = "main") {
|
|
|
1460
1263
|
else {
|
|
1461
1264
|
const rsc = object(checks), contexts = names(rsc["contexts"] ?? [], ""), apps = names(rsc["checks"] ?? [], "context");
|
|
1462
1265
|
const admins = p["enforce_admins"];
|
|
1463
|
-
// GitHub answered, but without the settings this judges: read, and not holding.
|
|
1464
1266
|
if (contexts === null || apps === null || typeof rsc["strict"] !== "boolean" || admins === undefined || admins === null || typeof object(admins)["enabled"] !== "boolean")
|
|
1465
1267
|
missing.push("classic protection: GitHub's answer doesn't say which checks it requires or whether administrators can bypass it");
|
|
1466
1268
|
else {
|
|
@@ -1470,7 +1272,6 @@ export async function readMainProtection(run, gh, repo, branch = "main") {
|
|
|
1470
1272
|
}
|
|
1471
1273
|
else if (!notProtected(classic))
|
|
1472
1274
|
unread.push(`classic protection (${words(classic)})`);
|
|
1473
|
-
// Rulesets: every active rule requiring status checks on the branch, then its ruleset's enforcement and bypass list.
|
|
1474
1275
|
const rules = await run(gh, ["api", "--hostname", "github.com", "--paginate", `repos/${repo}/rules/branches/${branch}`,
|
|
1475
1276
|
"--jq", ".[] | select(.type == \"required_status_checks\") | @json"], { cwd: "/", env: ciEnv() });
|
|
1476
1277
|
if (rules.code !== 0)
|
|
@@ -1516,7 +1317,6 @@ export async function readMainProtection(run, gh, repo, branch = "main") {
|
|
|
1516
1317
|
const actors = set["bypass_actors"];
|
|
1517
1318
|
if (!Array.isArray(actors))
|
|
1518
1319
|
bypass.push("its bypass list couldn't be read");
|
|
1519
|
-
// Only a deploy key never merges as this account; a role, team, app or organization admin might.
|
|
1520
1320
|
else if (actors.some(one => object(one)["actor_type"] !== "DeployKey"))
|
|
1521
1321
|
bypass.push("its bypass list names a role, team, app or organization admin");
|
|
1522
1322
|
judge(where, params["strict_required_status_checks_policy"] === true, checks, actionsChecks(params["required_status_checks"], "integration_id"), bypass);
|
|
@@ -1532,7 +1332,6 @@ export async function readMainProtection(run, gh, repo, branch = "main") {
|
|
|
1532
1332
|
missing.push("main has no branch protection or ruleset requiring status checks");
|
|
1533
1333
|
return { effective: false, missing, notYetRequired: [] };
|
|
1534
1334
|
}
|
|
1535
|
-
/** Main's protection couldn't be read from GitHub (after the network retries): not "doesn't hold", and never "holds". */
|
|
1536
1335
|
export class ProtectionUnreadable extends Error {
|
|
1537
1336
|
unread;
|
|
1538
1337
|
constructor(unread) {
|
|
@@ -1540,7 +1339,6 @@ export class ProtectionUnreadable extends Error {
|
|
|
1540
1339
|
this.unread = unread;
|
|
1541
1340
|
}
|
|
1542
1341
|
}
|
|
1543
|
-
/** Whether main's protection holds, as a yes/no (release-auto.ts sealAutoGreen): null when it can't be read. */
|
|
1544
1342
|
export async function readUpToDateRequired(run, gh, repo, branch = "main") {
|
|
1545
1343
|
let protection;
|
|
1546
1344
|
try {
|
|
@@ -1553,11 +1351,9 @@ export async function readUpToDateRequired(run, gh, repo, branch = "main") {
|
|
|
1553
1351
|
}
|
|
1554
1352
|
return protection === null ? null : protection.effective;
|
|
1555
1353
|
}
|
|
1556
|
-
/** Whether a workflow run is the push of exactly this release tag (its workflow file is the tagged commit's own, on main). */
|
|
1557
1354
|
function tagTriggered(run, tag) {
|
|
1558
1355
|
return tag !== undefined && run["event"] === "push" && run["branch"] === tag;
|
|
1559
1356
|
}
|
|
1560
|
-
/** Whether a workflow run was triggered on main: a push to main, or a pull request whose every base is main. */
|
|
1561
1357
|
function mainTriggered(run) {
|
|
1562
1358
|
const bases = Array.isArray(run["bases"]) ? run["bases"] : [];
|
|
1563
1359
|
if (run["event"] === "push")
|
|
@@ -1566,8 +1362,6 @@ function mainTriggered(run) {
|
|
|
1566
1362
|
return bases.length > 0 && bases.every(base => base === "main");
|
|
1567
1363
|
return false;
|
|
1568
1364
|
}
|
|
1569
|
-
/** The release's step record (store.ts release_step, v146) through a store opened for each entry: a failure to open or
|
|
1570
|
-
* write is swallowed, so recording never stops or changes the release. */
|
|
1571
1365
|
export function releaseProgressRecorder(open, done) {
|
|
1572
1366
|
return entry => {
|
|
1573
1367
|
let store = null;
|
|
@@ -1575,19 +1369,17 @@ export function releaseProgressRecorder(open, done) {
|
|
|
1575
1369
|
store = open();
|
|
1576
1370
|
recordReleaseStep(store, entry);
|
|
1577
1371
|
}
|
|
1578
|
-
catch {
|
|
1372
|
+
catch { }
|
|
1579
1373
|
finally {
|
|
1580
1374
|
if (store !== null) {
|
|
1581
1375
|
try {
|
|
1582
1376
|
done(store);
|
|
1583
1377
|
}
|
|
1584
|
-
catch {
|
|
1378
|
+
catch { }
|
|
1585
1379
|
}
|
|
1586
1380
|
}
|
|
1587
1381
|
};
|
|
1588
1382
|
}
|
|
1589
|
-
/** The macOS CI's cases on exactly `sha`: the newest pull-request run of ci.yml there, each shard's newest attempt. Null
|
|
1590
|
-
* when they can't all be read. The folder is this function's own, removed before it returns. */
|
|
1591
1383
|
async function macosCasesOf(run, gh, slug, sha) {
|
|
1592
1384
|
const folder = mkdtempSync(join(tmpdir(), "so-macos-ci-"));
|
|
1593
1385
|
try {
|