toolroll 0.9.103 → 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 +65 -0
- package/README.md +27 -27
- 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 +117 -103
- 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 +3 -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 +2 -16
- 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 +168 -0
- package/dist/local-owner.js +15 -80
- 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 +2 -17
- package/dist/operate-remote.js +0 -33
- package/dist/operate.js +280 -2304
- 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 +3 -18
- 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 +11 -30
- package/dist/public-check.js +0 -16
- package/dist/publish.js +1 -150
- package/dist/pull-request-flow.js +6 -74
- 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 +26 -103
- 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 +9 -28
- 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 +88 -566
- 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 +29 -564
- 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 +9 -86
- 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 +17 -497
- 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 +8 -133
- 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 +12 -227
- package/dist/server/tasks.js +37 -531
- 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 +8 -73
- 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 +66 -19
- 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 +91 -40
- package/dist/tui.js +54 -54
- 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 +5 -4
- 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 -318
- 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 -1972
- 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 -539
- 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 -41
- 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.d.ts +0 -124
- 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 -52
- 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 -156
- 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 -35
- 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 -1067
- 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 -80
- 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 -59
- 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 -754
- package/dist/server/render-settings.d.ts +0 -93
- package/dist/server/render-tasks.d.ts +0 -774
- 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 -342
- 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 -83
- 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 -30
- 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 -144
- 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/teardown-git.js
CHANGED
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Git for teardown (landed-cleanup.ts and the checkout removal it drives in worktree.ts), run by Toolroll's own
|
|
3
|
-
* process inside the shared repository a build can write to. A build can plant hooks in .git/hooks and settings in
|
|
4
|
-
* .git/config (or a worktree's config.worktree), so every teardown command runs hardened: an allowlisted environment
|
|
5
|
-
* with no system or global config (remote-main.ts's), no hooks, no fsmonitor, no ext transport, no prompts and no
|
|
6
|
-
* automatic maintenance.
|
|
7
|
-
*
|
|
8
|
-
* Settings that name a command, and includes (which could bring them in from a file nobody looked at), are not
|
|
9
|
-
* overridden but refused: before each command the repository's own config is read with includes off, and if it sets
|
|
10
|
-
* any of them the command never runs. The refusal is a failed git result, so every caller's existing doubt applies and
|
|
11
|
-
* nothing is removed.
|
|
12
|
-
*/
|
|
13
1
|
import { spawnSync } from "node:child_process";
|
|
14
2
|
import { accessSync, closeSync, constants as fsConstants, existsSync, fstatSync, lstatSync, mkdirSync, mkdtempSync, openSync, readdirSync, readFileSync, realpathSync, renameSync, rmSync, symlinkSync, writeFileSync, writeSync } from "node:fs";
|
|
15
3
|
import { randomBytes } from "node:crypto";
|
|
@@ -21,12 +9,10 @@ import { run } from "./exec.js";
|
|
|
21
9
|
import { ENV, ENV_ALLOWLIST } from "./remote-main.js";
|
|
22
10
|
import { WORKTREE_TIMEOUT_MS } from "./worktree.js";
|
|
23
11
|
import { FOLDER_DIDNT_ANSWER, folderAnswers } from "./folder-gate.js";
|
|
24
|
-
/** Fixed on every teardown command, ahead of its own arguments. */
|
|
25
12
|
export const TEARDOWN_FLAGS = [
|
|
26
13
|
"--no-optional-locks", "-c", "core.hooksPath=/dev/null", "-c", "core.fsmonitor=false", "-c", "protocol.ext.allow=never",
|
|
27
14
|
"-c", "credential.helper=", "-c", "gc.auto=0", "-c", "maintenance.auto=false", "-c", "submodule.recurse=false",
|
|
28
15
|
];
|
|
29
|
-
/** Exit code of a refused command (git's own fatal code, so no caller reads it as "not found" or "no"). */
|
|
30
16
|
export const REFUSED_CODE = 128;
|
|
31
17
|
const REFUSED_PREFIX = "Toolroll won't run git here: ";
|
|
32
18
|
const KNOWN_SECTIONS = new Map(Object.entries({
|
|
@@ -36,7 +22,6 @@ const KNOWN_SECTIONS = new Map(Object.entries({
|
|
|
36
22
|
"packedgitlimit", "packedgitwindowsize", "deltabasecachelimit", "multipackindex", "commitgraph", "splitindex", "warnambiguousrefs", "notesref",
|
|
37
23
|
"sparsecheckout", "sparsecheckoutcone", "filesreflocktimeout", "packedrefstimeout", "usereplacerefs", "fsync", "fsyncmethod", "fsyncobjectfiles",
|
|
38
24
|
"checkroundtripencoding", "protecthfs", "protectntfs", "logallrefupdates", "restrictinheritedhandles", "maxtreedepth", "createobject"] },
|
|
39
|
-
// A remote: never its helper programs; its URLs are checked apart (helperUrl).
|
|
40
25
|
remote: { allow: ["url", "pushurl", "fetch", "push", "mirror", "tagopt", "prune", "prunetags", "promisor", "partialclonefilter", "skipdefaultupdate",
|
|
41
26
|
"skipfetchall", "followremotehead", "serveroption", "proxy", "proxyauthmethod"] },
|
|
42
27
|
branch: "any", user: "any", init: "any", pull: "any", push: "any", fetch: "any", status: "any", color: "any", advice: "any", extensions: "any",
|
|
@@ -52,12 +37,9 @@ const KNOWN_SECTIONS = new Map(Object.entries({
|
|
|
52
37
|
submodule: { deny: ["update"] },
|
|
53
38
|
gc: { deny: ["recentobjectshook"] },
|
|
54
39
|
uploadpack: { deny: ["packobjectshook"] },
|
|
55
|
-
// git-lfs's own: lfsCommand decides (inert keys only); filter: git-lfs's exact values only (runsCommand).
|
|
56
40
|
lfs: "any",
|
|
57
41
|
ssh: { allow: ["variant"] },
|
|
58
42
|
}));
|
|
59
|
-
/** A remote URL git hands to a remote helper: `<helper>::…`, or a scheme git has no transport of its own for (it runs
|
|
60
|
-
* git-remote-<scheme>). scp-like `host:path`, `user@host:path` and plain paths are git's own. */
|
|
61
43
|
const OWN_SCHEMES = new Set(["https", "http", "ssh", "git", "file", "git+ssh", "ssh+git"]);
|
|
62
44
|
function helperUrl(value) {
|
|
63
45
|
const url = value.trim();
|
|
@@ -66,7 +48,6 @@ function helperUrl(value) {
|
|
|
66
48
|
const scheme = /^([A-Za-z][A-Za-z0-9+.-]*):\/\//.exec(url);
|
|
67
49
|
return scheme !== null && !OWN_SCHEMES.has(scheme[1].toLowerCase());
|
|
68
50
|
}
|
|
69
|
-
/** A config key's parts as git names them: section and variable lowercased, the subsection as it is (or null). */
|
|
70
51
|
function keyParts(key) {
|
|
71
52
|
const first = key.indexOf(".");
|
|
72
53
|
const last = key.lastIndexOf(".");
|
|
@@ -74,8 +55,6 @@ function keyParts(key) {
|
|
|
74
55
|
return { section: key.toLowerCase(), subsection: null, variable: "" };
|
|
75
56
|
return { section: key.slice(0, first).toLowerCase(), subsection: first === last ? null : key.slice(first + 1, last), variable: key.slice(last + 1).toLowerCase() };
|
|
76
57
|
}
|
|
77
|
-
/** git-lfs settings that name no program (where it fetches, what, whether it checks locks, how it signs in); any other
|
|
78
|
-
* `lfs.*` key in a checkout's own config could (extensions, custom and standalone transfer agents), so it's refused. */
|
|
79
58
|
const INERT_LFS_PLAIN = new Set(["url", "pushurl", "fetchinclude", "fetchexclude", "locksverify", "repositoryformatversion", "setlockablereadonly", "skipdownloaderrors", "concurrenttransfers"]);
|
|
80
59
|
const INERT_LFS_SUBSECTION = new Set(["access", "locksverify"]);
|
|
81
60
|
const lfsCommand = (key) => {
|
|
@@ -84,17 +63,11 @@ const lfsCommand = (key) => {
|
|
|
84
63
|
return false;
|
|
85
64
|
return subsection === null ? !INERT_LFS_PLAIN.has(variable) : !INERT_LFS_SUBSECTION.has(variable);
|
|
86
65
|
};
|
|
87
|
-
/** core.fsmonitor as a boolean is git's own daemon; anything else is a command to run. */
|
|
88
66
|
const BOOLEAN = /^(|true|false|yes|no|on|off|-?\d+)$/i;
|
|
89
|
-
/** Whether one setting can run a command (or bring in config nobody read), whatever scope it came from. git-lfs's own
|
|
90
|
-
* filters, exactly as `git lfs install` writes them (LFS_FILTER), are the one filter allowed, and only where the caller
|
|
91
|
-
* has also refused a `.lfsconfig` naming a git-lfs extension (`lfsChecked`): git-lfs reads that file as it runs. */
|
|
92
67
|
function runsCommand(key, value, lfsChecked) {
|
|
93
68
|
const { section, subsection, variable } = keyParts(key);
|
|
94
69
|
if (section === "core" && variable === "fsmonitor")
|
|
95
70
|
return !BOOLEAN.test(value.trim());
|
|
96
|
-
// A filter: whether it is required names no program; its commands only git-lfs's own, exactly, beside a checked
|
|
97
|
-
// .lfsconfig.
|
|
98
71
|
if (section === "filter")
|
|
99
72
|
return !((variable === "required" && BOOLEAN.test(value.trim())) || (lfsChecked && subsection === "lfs" && LFS_FILTER.get(`filter.lfs.${variable}`) === value));
|
|
100
73
|
if (section === "lfs")
|
|
@@ -110,10 +83,6 @@ function runsCommand(key, value, lfsChecked) {
|
|
|
110
83
|
return rule.deny.includes(variable);
|
|
111
84
|
return !rule.allow.includes(variable);
|
|
112
85
|
}
|
|
113
|
-
/** The command-running setting a `git config --list --show-scope -z` listing sets, or null. Only local and worktree
|
|
114
|
-
* scope count: teardown commands never read system or global config. `lfsChecked`: the caller refuses a checkout whose
|
|
115
|
-
* `.lfsconfig` names a git-lfs extension (lfsExtensionIn), so git-lfs's own exact filters may stand (runsCommand).
|
|
116
|
-
* Fails closed: a listing that can't be classified names a setting. */
|
|
117
86
|
export function commandSetting(listing, options = {}) {
|
|
118
87
|
try {
|
|
119
88
|
const fields = listing.split("\0");
|
|
@@ -134,18 +103,11 @@ export function commandSetting(listing, options = {}) {
|
|
|
134
103
|
return "a setting that couldn't be read";
|
|
135
104
|
}
|
|
136
105
|
}
|
|
137
|
-
/**
|
|
138
|
-
* What the plane's git on a build's checkout keeps of the operator's own (global and system) configuration: values,
|
|
139
|
-
* never commands — identity, line endings, ignore and case settings — and git-lfs's filters only as git-lfs itself
|
|
140
|
-
* installs them, exactly. Everything else there (filters, diff drivers, fsmonitor, signing and its key commands,
|
|
141
|
-
* whatever an include brings in) is left out, so nothing in it can run a file of the checkout's.
|
|
142
|
-
*/
|
|
143
106
|
const CARRIED_VALUES = new Set(["user.name", "user.email", "core.autocrlf", "core.eol", "core.safecrlf", "core.excludesfile", "core.ignorecase",
|
|
144
107
|
"core.precomposeunicode", "core.quotepath", "core.filemode", "core.symlinks", "core.longpaths"]);
|
|
145
108
|
const LFS_FILTER = new Map(Object.entries({
|
|
146
109
|
"filter.lfs.clean": "git-lfs clean -- %f", "filter.lfs.smudge": "git-lfs smudge -- %f", "filter.lfs.process": "git-lfs filter-process", "filter.lfs.required": "true",
|
|
147
110
|
}));
|
|
148
|
-
/** The `-c` settings that carry the operator's own values (CARRIED_VALUES, LFS_FILTER) from a global/system listing. */
|
|
149
111
|
export function carriedSettings(listing) {
|
|
150
112
|
const fields = listing.split("\0");
|
|
151
113
|
const carried = new Map();
|
|
@@ -163,13 +125,10 @@ export function carriedSettings(listing) {
|
|
|
163
125
|
}
|
|
164
126
|
return [...carried].flatMap(([key, value]) => ["-c", `${key}=${value}`]);
|
|
165
127
|
}
|
|
166
|
-
/** Why a teardown command was refused, or null when `result` isn't a refusal. */
|
|
167
128
|
export function refusal(result) {
|
|
168
129
|
return result.code === REFUSED_CODE && result.stderr.startsWith(REFUSED_PREFIX) ? result.stderr.slice(REFUSED_PREFIX.length).trim() : null;
|
|
169
130
|
}
|
|
170
131
|
const refused = (why) => ({ code: REFUSED_CODE, stdout: "", stderr: `${REFUSED_PREFIX}${why}\n`, timedOut: false, notFound: false });
|
|
171
|
-
/** Refuse nested repositories without asking Git to enter them or evaluate their config.
|
|
172
|
-
* Includes ignored/untracked repositories and bare repositories; never follows symlinks. */
|
|
173
132
|
function nestedRepository(path) {
|
|
174
133
|
const pending = [path];
|
|
175
134
|
while (pending.length > 0) {
|
|
@@ -184,18 +143,10 @@ function nestedRepository(path) {
|
|
|
184
143
|
}
|
|
185
144
|
return false;
|
|
186
145
|
}
|
|
187
|
-
/**
|
|
188
|
-
* Runs `work` with a write view of `cwd`'s repository (gitView): the view, and how to restore git's output. From a
|
|
189
|
-
* folder inside a checkout, the view is of the checkout git would find (checkoutRootOf); with none, git's own "not a
|
|
190
|
-
* git repository", nothing run. One whose `.git` or config can't be read as git reads it, or isn't bound to one
|
|
191
|
-
* repository (boundDirs; `binding.repo` when the caller has the project's), is refused; so is a command whose
|
|
192
|
-
* repository changed under it while git ran.
|
|
193
|
-
*/
|
|
194
146
|
async function inView(cwd, binding, work, after = true, lockTimeoutMs, doing, gitFile = "git") {
|
|
195
147
|
const root = checkoutRootOf(cwd);
|
|
196
148
|
if (root === null)
|
|
197
149
|
return NOT_A_REPOSITORY;
|
|
198
|
-
// One plane git command at a time on a checkout (git-views.ts withCheckoutLock: re-entrant along one call chain).
|
|
199
150
|
let key;
|
|
200
151
|
try {
|
|
201
152
|
key = realpathSync(root);
|
|
@@ -228,17 +179,9 @@ async function inView(cwd, binding, work, after = true, lockTimeoutMs, doing, gi
|
|
|
228
179
|
return refused(error instanceof Error ? error.message : "the checkout is busy");
|
|
229
180
|
}
|
|
230
181
|
}
|
|
231
|
-
/** The one way teardown runs git, including the target checkout immediately before removal. Every command runs
|
|
232
|
-
* against a write view of its repository (gitView), whose config is the one inspected and whose info is a copy, so a
|
|
233
|
-
* setting or attributes file an agent adds after the inspection is never read (a build's process can outlive its turn:
|
|
234
|
-
* on macOS containment is observational, src/containment.ts, and a sibling build shares the repository). A removal's
|
|
235
|
-
* target is bound to the same repository as the folder it is removed from. A removal without --force runs under the
|
|
236
|
-
* target's own view (its own config.worktree folded in), so git's last check of whether it is clean reads it as the
|
|
237
|
-
* target itself would. `binding.repo`: the project's main checkout, from the plane's records, when the caller has it. */
|
|
238
182
|
export function teardownGit(runner = run, binding = {}, lockTimeoutMs, gitFile = "git") {
|
|
239
183
|
const options = (cwd, env) => ({ cwd, envAllowlist: ENV_ALLOWLIST, env: { ...ENV, ...env }, timeoutMs: WORKTREE_TIMEOUT_MS, maxBuffer: 512 * 1024 * 1024 });
|
|
240
184
|
const configProblem = async (cwd, env) => {
|
|
241
|
-
// git-lfs's own filters may stand only beside a .lfsconfig that names no extension (commandSetting's lfsChecked).
|
|
242
185
|
if (lfsExtensionIn(env["GIT_WORK_TREE"] ?? cwd, gitFile))
|
|
243
186
|
return refused("the checkout's .lfsconfig sets a git-lfs key that can run a command");
|
|
244
187
|
const config = await runner("git", ["--no-optional-locks", "config", "--list", "--no-includes", "--show-scope", "-z"], options(cwd, env));
|
|
@@ -264,7 +207,6 @@ export function teardownGit(runner = run, binding = {}, lockTimeoutMs, gitFile =
|
|
|
264
207
|
const ran = async (env) => restore(await runner("git", [...TEARDOWN_FLAGS, ...WRITE_VIEW_FLAGS, ...safeArgs], options(cwd, env)), args);
|
|
265
208
|
if (!(removal || inspection || args.includes("checkout") || args.includes("clean")))
|
|
266
209
|
return ran(view.env);
|
|
267
|
-
// The checkout the command acts on, in its own view (bound to the same repository), checked first.
|
|
268
210
|
return inView(target, { repo: binding.repo ?? dirname(view.dirs.common) }, async (targetView) => {
|
|
269
211
|
if (removal) {
|
|
270
212
|
const targetProblem = await configProblem(target, targetView.env);
|
|
@@ -278,25 +220,18 @@ export function teardownGit(runner = run, binding = {}, lockTimeoutMs, gitFile =
|
|
|
278
220
|
catch {
|
|
279
221
|
return refused("the checkout couldn't be inspected for nested repositories");
|
|
280
222
|
}
|
|
281
|
-
// ls-files reads index entries only; it cannot run submodule filters. Even an uninitialized
|
|
282
|
-
// gitlink is kept, so worktree remove's internal status can never traverse it.
|
|
283
223
|
const index = await runner("git", [...TEARDOWN_FLAGS, ...WRITE_VIEW_FLAGS, "ls-files", "--stage", "-z"], options(target, targetView.env));
|
|
284
224
|
if (index.code !== 0)
|
|
285
225
|
return refused("the checkout's index couldn't be read");
|
|
286
226
|
if (index.stdout.split("\0").some(entry => entry.startsWith("160000 ")))
|
|
287
227
|
return refused("the checkout contains a gitlink");
|
|
288
|
-
// git's own clean check in a removal (a `status` it runs in the target) reads the config GIT_COMMON_DIR names:
|
|
289
|
-
// the target's view, inspected above, so it judges the target by the target's own settings.
|
|
290
228
|
return ran(removal && !forced ? { ...view.env, GIT_COMMON_DIR: targetView.env["GIT_COMMON_DIR"] } : view.env);
|
|
291
|
-
// A removed target has no git directory left to prove: the folder it was removed from is proven instead.
|
|
292
229
|
}, !removal, lockTimeoutMs, doing, gitFile);
|
|
293
230
|
}, true, lockTimeoutMs, teardownDoing(args), gitFile);
|
|
294
231
|
}
|
|
295
|
-
/** What teardown git is doing, for an incident's notice: removing a checkout, or looking one over to tidy it. */
|
|
296
232
|
function teardownDoing(args) {
|
|
297
233
|
return args.includes("worktree") && args.includes("remove") ? "removing an old checkout" : "tidying an old checkout";
|
|
298
234
|
}
|
|
299
|
-
/** What a build's git is doing, for an incident's notice. */
|
|
300
235
|
function checkoutDoing(args) {
|
|
301
236
|
if (args.includes("worktree"))
|
|
302
237
|
return args.includes("remove") ? "removing a checkout" : args.includes("add") ? "making a checkout" : "listing checkouts";
|
|
@@ -306,8 +241,6 @@ function checkoutDoing(args) {
|
|
|
306
241
|
return "updating a repository";
|
|
307
242
|
return "reading a build's checkout";
|
|
308
243
|
}
|
|
309
|
-
/** A setup call's time limit: its own five seconds, or less when a caller's deadline leaves less (never below 1 ms;
|
|
310
|
-
* a caller checks the deadline itself before calling). */
|
|
311
244
|
const setupTimeout = (limit) => limit === undefined ? 5_000 : Math.max(1, Math.min(5_000, limit()));
|
|
312
245
|
export function checkoutIncludes(checkout, gitFile = "git", limit) {
|
|
313
246
|
const dirs = gitDirsOf(checkout);
|
|
@@ -323,10 +256,7 @@ export function checkoutIncludes(checkout, gitFile = "git", limit) {
|
|
|
323
256
|
}
|
|
324
257
|
return false;
|
|
325
258
|
}
|
|
326
|
-
/** One config file, read only as the regular file it is (bounded), or null. */
|
|
327
259
|
function regularFile(path) {
|
|
328
|
-
// Opened without following a link and without blocking, then judged by what was opened: a FIFO swapped in after a
|
|
329
|
-
// look never hangs the read (eval-harness review 1, finding 7).
|
|
330
260
|
let fd = null;
|
|
331
261
|
try {
|
|
332
262
|
fd = openSync(path, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW | fsConstants.O_NONBLOCK);
|
|
@@ -343,13 +273,10 @@ function regularFile(path) {
|
|
|
343
273
|
closeSync(fd);
|
|
344
274
|
}
|
|
345
275
|
}
|
|
346
|
-
/** A checkout's git directory and common directory, as git finds them from its `.git` (a folder, or a one-line
|
|
347
|
-
* `gitdir: ` file); null when the pointer isn't one git would read the same way. */
|
|
348
276
|
function gitDirsOf(checkout, vouched = NO_VOUCHED) {
|
|
349
277
|
let gitdir = join(checkout, ".git");
|
|
350
278
|
try {
|
|
351
279
|
if (!lstatSync(gitdir).isDirectory()) {
|
|
352
|
-
// As git reads a .git file: "gitdir: " then the path, one line; anything else (more lines, stray space) refused.
|
|
353
280
|
const text = (regularFile(gitdir) ?? "").replace(/\r?\n$/, "");
|
|
354
281
|
if (!text.startsWith("gitdir: ") || /[\r\n]/.test(text))
|
|
355
282
|
return null;
|
|
@@ -362,12 +289,6 @@ function gitDirsOf(checkout, vouched = NO_VOUCHED) {
|
|
|
362
289
|
catch {
|
|
363
290
|
return null;
|
|
364
291
|
}
|
|
365
|
-
// Where the checkout's own files point (a build can write both): read, in the console, only while that folder
|
|
366
|
-
// answered a look lately, and never vouched for by the checkout pool's spelling (folder-gate.ts). Held back: not one
|
|
367
|
-
// git would read the same way, so every caller refuses.
|
|
368
|
-
// `vouched`: the very folders this view was made from, read again after git ran (settle). They answered moments ago
|
|
369
|
-
// and git just ran in them; the gate's staleness is no evidence about them. Anything they now point elsewhere is
|
|
370
|
-
// gated as ever, so a re-pointed `.git` or `commondir` is never read on the console's thread on its say.
|
|
371
292
|
if (gitdir !== join(checkout, ".git") && !vouched.has(gitdir) && !folderAnswers(gitdir, true))
|
|
372
293
|
return null;
|
|
373
294
|
const named = regularFile(join(gitdir, "commondir"))?.trim();
|
|
@@ -376,14 +297,8 @@ function gitDirsOf(checkout, vouched = NO_VOUCHED) {
|
|
|
376
297
|
return null;
|
|
377
298
|
return { gitdir, common };
|
|
378
299
|
}
|
|
379
|
-
/** What includeIn answers when Git didn't finish parsing the file in time: still a refusal, named as what it is. */
|
|
380
300
|
export const INCLUDE_PARSE_TIMED_OUT = "Git didn't finish reading it in time";
|
|
381
|
-
/** The include parse's own limit: a loaded machine (a CI runner's parallel test files) can take seconds to start git, and
|
|
382
|
-
* a refusal that names a slow machine an "unreadable file" sent two releases chasing a config that was fine. */
|
|
383
301
|
const INCLUDE_PARSE_MS = 15_000;
|
|
384
|
-
/** The include key one config file sets (lowercased, as git names it), "include" when only a plain reading finds one,
|
|
385
|
-
* "an unreadable file" when it can't be read as a plain file or parsed, or INCLUDE_PARSE_TIMED_OUT when the caller's
|
|
386
|
-
* deadline or the parse's own limit ran out first; null when it includes nothing. Every non-null answer refuses. */
|
|
387
302
|
function includeIn(path, gitFile = "git", limit) {
|
|
388
303
|
const text = regularFile(path);
|
|
389
304
|
if (text === null)
|
|
@@ -465,7 +380,6 @@ function boundDirs(checkout, binding = {}, vouched = NO_VOUCHED) {
|
|
|
465
380
|
fail("belongs to a git directory that names another checkout");
|
|
466
381
|
dirs = { checkout: top, gitdir, common, linked: true, spelled: [named.gitdir, named.common, gitdir, common] };
|
|
467
382
|
}
|
|
468
|
-
// The common folder is a main checkout's own `.git` folder, a real one.
|
|
469
383
|
if (basename(dirs.common) !== ".git")
|
|
470
384
|
fail("belongs to a repository that isn't a checkout's");
|
|
471
385
|
try {
|
|
@@ -476,10 +390,6 @@ function boundDirs(checkout, binding = {}, vouched = NO_VOUCHED) {
|
|
|
476
390
|
fail("belongs to a repository that isn't there");
|
|
477
391
|
}
|
|
478
392
|
if (binding.repo != null) {
|
|
479
|
-
// The anchor is the plane's own record, never a pointer file: the recorded project's main checkout, whose `.git`
|
|
480
|
-
// must be a real folder (not a link, holding no `commondir`); its real path is the only common folder accepted. A
|
|
481
|
-
// record that isn't such a checkout (a linked worktree, as agent-fence.ts trustedWorktreeBinding also refuses) or
|
|
482
|
-
// can't be read is refused, never taken as unbound.
|
|
483
393
|
let recorded = null;
|
|
484
394
|
try {
|
|
485
395
|
const dotgit = join(realpathSync(binding.repo), ".git");
|
|
@@ -496,24 +406,14 @@ function boundDirs(checkout, binding = {}, vouched = NO_VOUCHED) {
|
|
|
496
406
|
}
|
|
497
407
|
return dirs;
|
|
498
408
|
}
|
|
499
|
-
/** The shared git folder of a recorded project, read from disk and proven as boundDirs proves it: the project's own
|
|
500
|
-
* real `.git` folder, holding no `commondir`. No pointer file or `commondir` an agent can write decides it, and no git
|
|
501
|
-
* runs (a page visit reads this). Throws with the reason otherwise. */
|
|
502
409
|
export function recordedCommonDir(repo) {
|
|
503
410
|
return boundDirs(repo, { repo }).common;
|
|
504
411
|
}
|
|
505
|
-
/** What git keeps only per worktree and the plane never links: HEAD (git won't take it as a link) and the pointers. */
|
|
506
|
-
/** What the plane links of a worktree's own git folder (git writes them in place through the link: the index and its
|
|
507
|
-
* logs by lockfile, per-worktree refs and logs inside the folders), whether or not they exist yet; a rebase's,
|
|
508
|
-
* cherry-pick's or sequencer's state folder only when one is already there. */
|
|
509
412
|
const ADMIN_LINKED = ["index", "logs", "refs", "reftable"];
|
|
510
|
-
/** What git keeps in a common directory (its path.c common_list, and reftable), linked whether or not it exists yet. */
|
|
511
413
|
const COMMON_NAMES = ["branches", "gc.pid", "logs", "lost-found", "modules", "objects", "packed-refs", "reftable", "refs", "remotes", "rr-cache", "shallow", "svn", "worktrees"];
|
|
512
|
-
/** Where git incidents are recorded: beside the fenced views folder (git-incident.ts). */
|
|
513
414
|
export function gitIncidentRecord() {
|
|
514
415
|
return join(dirname(ensureGitViewsRoot(realpathSync(homedir()))), "git-incidents.jsonl");
|
|
515
416
|
}
|
|
516
|
-
/** `doing`: what the plane was doing, in a person's words ("tidying an old checkout"), for an incident's notice. */
|
|
517
417
|
function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
518
418
|
const dirs = boundDirs(checkout, binding);
|
|
519
419
|
const root = ensureGitViewsRoot(realpathSync(homedir()));
|
|
@@ -529,7 +429,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
529
429
|
const configPath = join(view, "config");
|
|
530
430
|
writeFileSync(configPath, config, { mode: 0o600 });
|
|
531
431
|
const base = { cwd: "/", encoding: "utf8", killSignal: "SIGKILL", env: { PATH: process.env["PATH"] ?? "", GIT_CONFIG_NOSYSTEM: "1", GIT_CONFIG_GLOBAL: "/dev/null", HOME: "/nonexistent" } };
|
|
532
|
-
// Each call's limit is worked out as it starts, from what is left of a caller's deadline.
|
|
533
432
|
const plainNow = () => {
|
|
534
433
|
if (limit !== undefined && limit() <= 0)
|
|
535
434
|
throw new Error("the read's deadline passed");
|
|
@@ -540,7 +439,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
540
439
|
if (flag.status !== 0 && flag.status !== 1)
|
|
541
440
|
throw new Error("the checkout's git config couldn't be read");
|
|
542
441
|
if (flag.stdout.trim() === "true") {
|
|
543
|
-
// Git would also read the worktree's config.worktree, which the agent can still change: folded in as it is now.
|
|
544
442
|
const worktree = join(dirs.gitdir, "config.worktree");
|
|
545
443
|
const own = existsSync(worktree) ? regularFile(worktree) : "";
|
|
546
444
|
if (own === null)
|
|
@@ -558,7 +456,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
558
456
|
if (include !== null)
|
|
559
457
|
throw new Error(`the checkout's git config includes another file (${include})`);
|
|
560
458
|
mkdirSync(join(view, "info"));
|
|
561
|
-
// A main checkout's sparse-checkout patterns are in its own (common) info folder; a linked one's in its admin's.
|
|
562
459
|
for (const name of kind === "write" ? ["exclude", "attributes", "sparse-checkout"] : ["exclude", "sparse-checkout"]) {
|
|
563
460
|
if (name === "sparse-checkout" && dirs.linked)
|
|
564
461
|
continue;
|
|
@@ -566,7 +463,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
566
463
|
if (!existsSync(path))
|
|
567
464
|
continue;
|
|
568
465
|
const text = regularFile(path);
|
|
569
|
-
// A write that dropped the operator's exclude or attributes could stage what they keep out: refused instead.
|
|
570
466
|
if (text === null && kind === "write")
|
|
571
467
|
throw new Error(`the checkout's info/${name} couldn't be read as a plain file`);
|
|
572
468
|
if (text !== null)
|
|
@@ -578,32 +474,25 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
578
474
|
try {
|
|
579
475
|
mkdirSync(folder);
|
|
580
476
|
}
|
|
581
|
-
catch {
|
|
477
|
+
catch { }
|
|
582
478
|
}
|
|
583
479
|
try {
|
|
584
480
|
for (const id of readdirSync(folder))
|
|
585
481
|
priorWorktrees.add(id);
|
|
586
482
|
}
|
|
587
|
-
catch {
|
|
483
|
+
catch { }
|
|
588
484
|
}
|
|
589
485
|
for (const name of new Set([...readdirSync(dirs.common), ...COMMON_NAMES])) {
|
|
590
486
|
if (name === "config" || name === "info" || name === "hooks" || name === "commondir")
|
|
591
487
|
continue;
|
|
592
488
|
symlinkSync(join(dirs.common, name), join(view, name));
|
|
593
489
|
}
|
|
594
|
-
// GIT_DIR is the plane's too (git's ref store reads `commondir` from GIT_DIR as it goes, empirically on 2.50.1):
|
|
595
|
-
// its `commondir` names the view and its `gitdir` this checkout, both the plane's; HEAD is a copy (git won't take
|
|
596
|
-
// it as a link) carried back after the run; the worktree's other files are linked (the index and logs even before
|
|
597
|
-
// they exist), so git's lockfiles write them in place.
|
|
598
|
-
// (A folder under a dangling link can't be made by git: the worktree's `logs` is made first, as git would.)
|
|
599
490
|
if (kind === "write" && !existsSync(join(dirs.gitdir, "logs"))) {
|
|
600
491
|
try {
|
|
601
492
|
mkdirSync(join(dirs.gitdir, "logs"));
|
|
602
493
|
}
|
|
603
|
-
catch {
|
|
494
|
+
catch { }
|
|
604
495
|
}
|
|
605
|
-
// Only what git needs of the worktree's own folder is linked (ADMIN_LINKED, and a split index's shared files), each
|
|
606
|
-
// checked to be a real entry directly in it, never a link (Codex review of a0fa135d).
|
|
607
496
|
const linked = [...ADMIN_LINKED, ...readdirSync(dirs.gitdir).filter(name => name.startsWith("sharedindex."))];
|
|
608
497
|
for (const name of new Set(linked)) {
|
|
609
498
|
const path = join(dirs.gitdir, name);
|
|
@@ -622,9 +511,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
622
511
|
const head = regularFile(join(dirs.gitdir, "HEAD"));
|
|
623
512
|
if (head === null)
|
|
624
513
|
throw new Error("the checkout's HEAD couldn't be read as a plain file");
|
|
625
|
-
// The worktree's own state files (WORKTREE_STATE: HEAD, a merge's, cherry-pick's, rebase's or bisect's pseudo-refs
|
|
626
|
-
// and messages) are copies (git won't take them as links), carried back after the run; its state folders, when
|
|
627
|
-
// there, are linked.
|
|
628
514
|
for (const name of WORKTREE_STATE) {
|
|
629
515
|
const path = join(dirs.gitdir, name);
|
|
630
516
|
if (!existsSync(path) && name !== "HEAD")
|
|
@@ -651,7 +537,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
651
537
|
}
|
|
652
538
|
writeFileSync(join(admin, "commondir"), `${view}\n`, { mode: 0o600 });
|
|
653
539
|
writeFileSync(join(admin, "gitdir"), `${join(dirs.checkout, ".git")}\n`, { mode: 0o600 });
|
|
654
|
-
// A main checkout's own info (its sparse-checkout) is the view's frozen one; a linked one's is its own.
|
|
655
540
|
symlinkSync(dirs.linked ? join(dirs.gitdir, "info") : join(view, "info"), join(admin, "info"));
|
|
656
541
|
if (!pinned(dirs).ok)
|
|
657
542
|
throw new Error("the checkout's repository has a folder that is a link");
|
|
@@ -660,7 +545,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
660
545
|
dispose();
|
|
661
546
|
throw error;
|
|
662
547
|
}
|
|
663
|
-
// The folders down to the worktree's own, as they are now: carry-back writes only while each is still the same one.
|
|
664
548
|
let anchor;
|
|
665
549
|
try {
|
|
666
550
|
anchor = anchorOf(dirs.gitdir);
|
|
@@ -669,9 +553,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
669
553
|
dispose();
|
|
670
554
|
throw new Error("the checkout's repository has a folder that is a link");
|
|
671
555
|
}
|
|
672
|
-
// Where git names a view (rev-parse --git-dir, --git-common-dir), the caller is told the repository's own folder;
|
|
673
|
-
// where `worktree list` names the common view as the main worktree, that worktree (git's rule: the common dir less
|
|
674
|
-
// `/.git`).
|
|
675
556
|
const mainWorktree = dirname(dirs.common);
|
|
676
557
|
const restore = (output, args) => {
|
|
677
558
|
if (!output.includes(view) && !output.includes(admin))
|
|
@@ -682,8 +563,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
682
563
|
const settle = () => {
|
|
683
564
|
const now = pinned(dirs);
|
|
684
565
|
let bound = false;
|
|
685
|
-
// The same proof as before git ran, of the same folders: re-read past the console's folder gate only where they are
|
|
686
|
-
// the very ones this view was made from (vouched), so a gate whose answer went stale mid-run is never read as a swap.
|
|
687
566
|
try {
|
|
688
567
|
const again = boundDirs(checkout, binding, new Set(dirs.spelled));
|
|
689
568
|
bound = again.gitdir === dirs.gitdir && again.common === dirs.common;
|
|
@@ -692,7 +571,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
692
571
|
bound = false;
|
|
693
572
|
}
|
|
694
573
|
if (!now.ok || !bound) {
|
|
695
|
-
// Too late to prevent: recorded and told (git-incident.ts), never rolled back where the swap leads.
|
|
696
574
|
if (kind === "write") {
|
|
697
575
|
gitIncident({ checkout: dirs.checkout, repository: dirs.common, swapped: now.swapped.length > 0 ? now.swapped.map(({ path, leadsTo }) => ({ path, leadsTo })) : [{ path: join(dirs.checkout, ".git"), leadsTo: null }],
|
|
698
576
|
cause: now.swapped.length > 0 ? "swapped" : "rebound", ...(doing === undefined ? {} : { doing }), record: gitIncidentRecord() });
|
|
@@ -700,8 +578,6 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
700
578
|
return "the checkout's repository changed while git ran";
|
|
701
579
|
}
|
|
702
580
|
if (kind === "write") {
|
|
703
|
-
// The worktree's own state git rewrote in the plane's GIT_DIR goes back to it, and what it removed is removed
|
|
704
|
-
// there; anything else git left there the plane can't keep, and says so.
|
|
705
581
|
const left = readdirSync(admin).filter(name => !initial.has(name) && !WORKTREE_STATE.includes(name) && !["commondir", "gitdir", "info"].includes(name));
|
|
706
582
|
try {
|
|
707
583
|
carryBack(admin, dirs.gitdir, initial, anchor);
|
|
@@ -722,37 +598,16 @@ function gitView(checkout, kind, binding = {}, gitFile = "git", limit, doing) {
|
|
|
722
598
|
};
|
|
723
599
|
return { env: { GIT_DIR: admin, GIT_COMMON_DIR: view, GIT_WORK_TREE: dirs.checkout }, restore, dispose, dirs, settle };
|
|
724
600
|
}
|
|
725
|
-
/** A worktree's own state files git may write (git's per-worktree names: HEAD and the pseudo-refs and messages of a
|
|
726
|
-
* merge, cherry-pick, revert, rebase or bisect), and its state folders. */
|
|
727
601
|
const WORKTREE_STATE = ["HEAD", "ORIG_HEAD", "MERGE_HEAD", "MERGE_MSG", "MERGE_MODE", "MERGE_RR", "AUTO_MERGE", "FETCH_HEAD", "COMMIT_EDITMSG",
|
|
728
602
|
"CHERRY_PICK_HEAD", "REVERT_HEAD", "REBASE_HEAD", "SQUASH_MSG", "TAG_EDITMSG", "BISECT_LOG", "BISECT_START", "BISECT_TERMS", "BISECT_EXPECTED_REV",
|
|
729
603
|
"BISECT_ANCESTORS_OK", "BISECT_NAMES", "BISECT_RUN", "BISECT_HEAD"];
|
|
730
604
|
const WORKTREE_STATE_DIRS = ["sequencer", "rebase-merge", "rebase-apply"];
|
|
731
|
-
/**
|
|
732
|
-
* Whether every path git may write through a view is still the repository's own (Codex review of a0fa135d: git
|
|
733
|
-
* writes deeper than the top-level folders, through a link at `refs/heads/x`, `logs/…` or `objects/xx` as well). The
|
|
734
|
-
* walk, by lstat, never following a link: every name of the common folder git may write (COMMON_NAMES: refs, logs,
|
|
735
|
-
* reftable, packed-refs, worktrees with each worktree's own folder, rr-cache, modules, …) all the way down, HEAD and
|
|
736
|
-
* the index; the worktree's own state (WORKTREE_STATE: its HEAD, index, refs, logs, a merge's, rebase's or bisect's
|
|
737
|
-
* state, a split index's shared files); and the object store (the common `objects`, and a submodule git directory's
|
|
738
|
-
* own under modules/): its fan-out folders' entries for links, `info` and `pack` all the way down, but not each loose
|
|
739
|
-
* object (a big repository has very many, and hard-linked objects are legitimate). Any link is refused, so is a folder
|
|
740
|
-
* that can't be listed, and so is any file walked deep with a second hard link (git appends to a log in place), but for
|
|
741
|
-
* another checkout's index (siblingIndexes: still never a link). The exemptions are by place only: an `objects` anywhere else (under refs/, logs/, worktrees/) is walked like the rest. For each one found, where it leads (for an incident's record).
|
|
742
|
-
*
|
|
743
|
-
* Checked when the view is made and again after git ran; between the two, a process that outlived the agent's turn
|
|
744
|
-
* can still swap one of these for a link and have git write through it mid-command. That window is an accepted
|
|
745
|
-
* residual: git takes paths, not handles. Seen after the run, it is an incident (git-incident.ts).
|
|
746
|
-
*/
|
|
747
605
|
function pinned(dirs) {
|
|
748
606
|
const swapped = [];
|
|
749
607
|
const seen = new Set();
|
|
750
608
|
let budget = 400_000;
|
|
751
609
|
const stores = objectStores(dirs.common);
|
|
752
610
|
const siblings = siblingIndexes(dirs);
|
|
753
|
-
/** `deep`: every entry all the way down, each file held to one hard link. `shallow`: the folder's own entries
|
|
754
|
-
* checked for links only. `store`: an object store (objects/: its fan-out folders shallow, `info` and `pack` deep
|
|
755
|
-
* without the hard-link test). A link, or a folder that can't be listed, is swapped. */
|
|
756
611
|
const check = (path, mode) => {
|
|
757
612
|
if (seen.has(path))
|
|
758
613
|
return;
|
|
@@ -777,9 +632,6 @@ function pinned(dirs) {
|
|
|
777
632
|
swapped.push({ path, leadsTo: real });
|
|
778
633
|
return;
|
|
779
634
|
}
|
|
780
|
-
// Another checkout's own index, by exact place (siblingIndexes): held to being no link, but a second name is not
|
|
781
|
-
// counted. A tool in that checkout may hard-link it for a moment (Claude Code's security-guidance plugin does, to
|
|
782
|
-
// diff against a copy), and git never writes another checkout's index, nor any index in place.
|
|
783
635
|
if (held.isFile() && mode === "deep" && held.nlink > 1 && !siblings.has(path)) {
|
|
784
636
|
swapped.push({ path, leadsTo: null });
|
|
785
637
|
return;
|
|
@@ -787,7 +639,6 @@ function pinned(dirs) {
|
|
|
787
639
|
if (!held.isDirectory())
|
|
788
640
|
return;
|
|
789
641
|
let entries;
|
|
790
|
-
// A folder that can't be listed hides what's in it: it counts as swapped (fail closed).
|
|
791
642
|
try {
|
|
792
643
|
entries = readdirSync(path);
|
|
793
644
|
}
|
|
@@ -802,19 +653,16 @@ function pinned(dirs) {
|
|
|
802
653
|
if (lstatSync(child).isSymbolicLink())
|
|
803
654
|
check(child, "shallow");
|
|
804
655
|
}
|
|
805
|
-
catch {
|
|
656
|
+
catch { }
|
|
806
657
|
continue;
|
|
807
658
|
}
|
|
808
659
|
if (mode === "store") {
|
|
809
660
|
check(child, name === "info" || name === "pack" ? "deep-unlinked" : "shallow");
|
|
810
661
|
continue;
|
|
811
662
|
}
|
|
812
|
-
// The object store exemption by exact place, never by name (stores, enumerated before the walk).
|
|
813
663
|
check(child, stores.has(child) ? "store" : mode);
|
|
814
664
|
}
|
|
815
665
|
};
|
|
816
|
-
// The common folder's every name git may write, all the way down (refs, logs, reftable, packed-refs, worktrees with
|
|
817
|
-
// each worktree's own folder, rr-cache, modules, the rest of COMMON_NAMES), and the worktree's own state.
|
|
818
666
|
for (const name of COMMON_NAMES)
|
|
819
667
|
if (name !== "objects")
|
|
820
668
|
check(join(dirs.common, name), "deep");
|
|
@@ -830,14 +678,10 @@ function pinned(dirs) {
|
|
|
830
678
|
catch {
|
|
831
679
|
swapped.push({ path: dirs.gitdir, leadsTo: null });
|
|
832
680
|
}
|
|
833
|
-
// The object store: the folder and its fan-out folders for links (not each loose object: a big repository has very
|
|
834
|
-
// many, and `clone --local` hard-links them legitimately; git writes a new object to a fresh temporary file linked
|
|
835
|
-
// into place, never through an existing one), `info` and `pack` all the way down.
|
|
836
681
|
for (const store of stores)
|
|
837
682
|
check(store, "store");
|
|
838
683
|
if (budget <= 0)
|
|
839
684
|
swapped.push({ path: dirs.common, leadsTo: null });
|
|
840
|
-
// A path that is no longer its own real path (a folder on the way swapped) counts too.
|
|
841
685
|
for (const path of [dirs.common, dirs.gitdir]) {
|
|
842
686
|
try {
|
|
843
687
|
if (realpathSync(path) !== path)
|
|
@@ -849,12 +693,6 @@ function pinned(dirs) {
|
|
|
849
693
|
}
|
|
850
694
|
return { ok: swapped.length === 0, swapped };
|
|
851
695
|
}
|
|
852
|
-
/**
|
|
853
|
-
* The object stores the walk exempts from its full check, enumerated before it, never decided by a name met on the
|
|
854
|
-
* way: the common `objects`, and `<gitdir>/objects` for each submodule git directory under modules/ — a folder with
|
|
855
|
-
* its own config, HEAD, refs/ and objects/, reached through no component named refs, logs, reftable, objects, info,
|
|
856
|
-
* worktrees or hooks (so `modules/x/refs/objects` with a planted HEAD is no store).
|
|
857
|
-
*/
|
|
858
696
|
function objectStores(common) {
|
|
859
697
|
const stores = new Set([join(common, "objects")]);
|
|
860
698
|
const NOT_A_PATH = new Set(["refs", "logs", "reftable", "objects", "info", "worktrees", "hooks"]);
|
|
@@ -890,16 +728,6 @@ function objectStores(common) {
|
|
|
890
728
|
visit(join(common, "modules"), 0);
|
|
891
729
|
return stores;
|
|
892
730
|
}
|
|
893
|
-
/**
|
|
894
|
-
* The index files of the repository's other checkouts, by exact place, enumerated before the walk: `index` directly in
|
|
895
|
-
* each worktree folder of the common `worktrees` that isn't this checkout's own git directory, and, for a linked
|
|
896
|
-
* checkout, the main checkout's `index` in the common folder. The walk still refuses any of them that is a link; it
|
|
897
|
-
* only doesn't count a second hard link to one (pinned). The view links only this checkout's own index, and git writes
|
|
898
|
-
* an index only by renaming a new file over it, so a hard link at another checkout's can't take a write of the plane's
|
|
899
|
-
* anywhere. Measured (Nov 2026): Claude Code's security-guidance plugin hard-links the index of the checkout a session
|
|
900
|
-
* runs in to a temporary copy for up to seconds at a time, and a release gate that ran meanwhile in another checkout of
|
|
901
|
-
* the repository was stopped as an incident naming that checkout's index.
|
|
902
|
-
*/
|
|
903
731
|
function siblingIndexes(dirs) {
|
|
904
732
|
const indexes = new Set();
|
|
905
733
|
if (dirs.linked)
|
|
@@ -908,7 +736,7 @@ function siblingIndexes(dirs) {
|
|
|
908
736
|
try {
|
|
909
737
|
ids = readdirSync(join(dirs.common, "worktrees"));
|
|
910
738
|
}
|
|
911
|
-
catch {
|
|
739
|
+
catch { }
|
|
912
740
|
for (const id of ids) {
|
|
913
741
|
const folder = join(dirs.common, "worktrees", id);
|
|
914
742
|
if (folder !== dirs.gitdir)
|
|
@@ -929,8 +757,6 @@ function anchorOf(path) {
|
|
|
929
757
|
}
|
|
930
758
|
class AnchorMoved extends Error {
|
|
931
759
|
}
|
|
932
|
-
/** Throws AnchorMoved unless every folder of `anchor` is still the one it was (Node has no openat, so each component
|
|
933
|
-
* is looked at again right before each rename or unlink). */
|
|
934
760
|
function holdAnchor(anchor) {
|
|
935
761
|
for (const one of anchor) {
|
|
936
762
|
let held;
|
|
@@ -944,9 +770,6 @@ function holdAnchor(anchor) {
|
|
|
944
770
|
throw new AnchorMoved(one.path);
|
|
945
771
|
}
|
|
946
772
|
}
|
|
947
|
-
/** Carry the WORKTREE_STATE files git rewrote or removed in the plane's GIT_DIR back to the worktree's own folder: a
|
|
948
|
-
* new file of a random name, created exclusively (never through a link), then renamed into place; before each rename
|
|
949
|
-
* or unlink, every folder down to the worktree's own is proven the same one it was when the view was made. */
|
|
950
773
|
function carryBack(admin, gitdir, initial, anchor) {
|
|
951
774
|
for (const name of WORKTREE_STATE) {
|
|
952
775
|
const here = join(admin, name);
|
|
@@ -959,7 +782,6 @@ function carryBack(admin, gitdir, initial, anchor) {
|
|
|
959
782
|
}
|
|
960
783
|
const was = initial.get(name);
|
|
961
784
|
if (held === null) {
|
|
962
|
-
// Removed by git: removed in the worktree's own folder too (a merge's state once it concluded).
|
|
963
785
|
if (initial.get(name) != null) {
|
|
964
786
|
holdAnchor(anchor);
|
|
965
787
|
rmSync(join(gitdir, name), { force: true });
|
|
@@ -990,19 +812,6 @@ function carryBack(admin, gitdir, initial, anchor) {
|
|
|
990
812
|
}
|
|
991
813
|
}
|
|
992
814
|
}
|
|
993
|
-
/**
|
|
994
|
-
* A worktree `worktree add` made through a view, pointed at its repository instead of the view. Before git 2.48 the new
|
|
995
|
-
* checkout's `.git` file names the common directory as given (the view, removed right after the run: every later
|
|
996
|
-
* command in that checkout would find no repository); later versions name its real path, and this finds nothing to do.
|
|
997
|
-
* Only a worktree folder this run made (not there when the view was made) whose checkout's `.git` is a plain file
|
|
998
|
-
* reading exactly `gitdir: <view>/worktrees/<id>` (a name private to this run, in a folder every fence denies) is
|
|
999
|
-
* rewritten: a new file created exclusively (never through a link) and renamed into place, then bound to the repository
|
|
1000
|
-
* (boundDirs) as any checkout is. Before it writes, the repository's own record of the worktree must name this very
|
|
1001
|
-
* checkout and repository, and every folder down to the checkout is anchored (anchorOf) and proven the same one before
|
|
1002
|
-
* the open, the re-read and the rename, as carryBack does. A failure after the rename isn't undone (the old content
|
|
1003
|
-
* names a view that no longer exists, so the checkout is unusable either way); it refuses. Null when every such
|
|
1004
|
-
* checkout is bound, or why one isn't.
|
|
1005
|
-
*/
|
|
1006
815
|
function relinkAdded(view, common, prior) {
|
|
1007
816
|
let ids;
|
|
1008
817
|
try {
|
|
@@ -1032,7 +841,6 @@ function relinkAdded(view, common, prior) {
|
|
|
1032
841
|
} };
|
|
1033
842
|
if (read()?.trim() !== stale)
|
|
1034
843
|
continue;
|
|
1035
|
-
// The repository's record of this worktree names this checkout and this repository, before anything is written.
|
|
1036
844
|
const admin = join(common, "worktrees", id);
|
|
1037
845
|
let recorded;
|
|
1038
846
|
try {
|
|
@@ -1062,7 +870,6 @@ function relinkAdded(view, common, prior) {
|
|
|
1062
870
|
finally {
|
|
1063
871
|
closeSync(fd);
|
|
1064
872
|
}
|
|
1065
|
-
// Checked again at the moment of use: the same folders, and still the plain file git wrote.
|
|
1066
873
|
holdAnchor(anchor);
|
|
1067
874
|
if (read()?.trim() !== stale) {
|
|
1068
875
|
rmSync(temporary, { force: true });
|
|
@@ -1084,8 +891,6 @@ function relinkAdded(view, common, prior) {
|
|
|
1084
891
|
}
|
|
1085
892
|
return null;
|
|
1086
893
|
}
|
|
1087
|
-
/** The checkout git would find from `cwd`: the nearest folder, `cwd` or above, with a `.git`; null when there is
|
|
1088
|
-
* none (git's own "not a git repository"). A `.git` that can't even be looked at counts as found (the view refuses it). */
|
|
1089
894
|
function checkoutRootOf(cwd) {
|
|
1090
895
|
for (let dir = resolve(cwd);; dir = dirname(dir)) {
|
|
1091
896
|
try {
|
|
@@ -1101,14 +906,7 @@ function checkoutRootOf(cwd) {
|
|
|
1101
906
|
}
|
|
1102
907
|
}
|
|
1103
908
|
const NOT_A_REPOSITORY = { code: 128, stdout: "", stderr: "fatal: not a git repository (or any of the parent directories): .git\n", timedOut: false, notFound: false };
|
|
1104
|
-
/** Settings fixed on every write through a view: `worktree add` records absolute paths (relative ones would need a
|
|
1105
|
-
* config write, which a view keeps); no transport at all (a caller that fetches allows its one protocol by name, as the
|
|
1106
|
-
* nightly check's local fetch does with protocol.file.allow); and no split index (its shared index files would be
|
|
1107
|
-
* written in the plane's GIT_DIR). */
|
|
1108
909
|
export const WRITE_VIEW_FLAGS = ["-c", "worktree.useRelativePaths=false", "-c", "protocol.allow=never", "-c", "core.splitIndex=false"];
|
|
1109
|
-
/** Whether the checkout's .lfsconfig (read as git parses it, that file only) sets any git-lfs key that could name a
|
|
1110
|
-
* program (anything but INERT_LFS). A file that
|
|
1111
|
-
* isn't a plain one, or doesn't parse, counts as naming one. */
|
|
1112
910
|
export function lfsExtensionIn(checkout, gitFile = "git", limit) {
|
|
1113
911
|
const path = join(checkout, ".lfsconfig");
|
|
1114
912
|
try {
|
|
@@ -1123,14 +921,8 @@ export function lfsExtensionIn(checkout, gitFile = "git", limit) {
|
|
|
1123
921
|
const parsed = spawnSync(gitFile, ["config", "--file", path, "--no-includes", "--name-only", "--list", "-z"], { cwd: "/", encoding: "utf8", timeout: setupTimeout(limit), killSignal: "SIGKILL", env: { PATH: process.env["PATH"] ?? "", GIT_CONFIG_NOSYSTEM: "1", GIT_CONFIG_GLOBAL: "/dev/null", HOME: "/nonexistent" } });
|
|
1124
922
|
return parsed.status !== 0 || parsed.stdout.split("\0").filter(Boolean).some(name => lfsCommand(name) || ["include", "includeif"].includes(keyParts(name).section));
|
|
1125
923
|
}
|
|
1126
|
-
/** The hardened runners' own reads before the caller's command (the checkout's config listing): their own bounds, never
|
|
1127
|
-
* the caller's. A caller's small `maxBuffer` is for its own command's output (builder.ts reads one ls-tree line with
|
|
1128
|
-
* 2 KiB): inherited, it failed the config listing once a project's .git/config grew past 2 KiB (one [branch] section per
|
|
1129
|
-
* work branch), and every prepared release check then failed as "its config couldn't be read" (runs 3316–3324). */
|
|
1130
924
|
export const CONFIG_READ_BYTES = 16 * 1024 * 1024;
|
|
1131
925
|
export const CONFIG_READ_MS = 30_000;
|
|
1132
|
-
/** What of a caller's options an internal read keeps: where it runs and with what environment and containment —
|
|
1133
|
-
* never its time limit, output limit, stdin or output callbacks. */
|
|
1134
926
|
function internalOptions(options, env) {
|
|
1135
927
|
const { cwd, envAllowlist, omitEnv, fence, fenceGrants, confinement, processGroup, owner, signal } = options ?? {};
|
|
1136
928
|
return { ...(cwd === undefined ? {} : { cwd }), ...(envAllowlist === undefined ? {} : { envAllowlist }), ...(omitEnv === undefined ? {} : { omitEnv }),
|
|
@@ -1138,29 +930,21 @@ function internalOptions(options, env) {
|
|
|
1138
930
|
...(processGroup === undefined ? {} : { processGroup }), ...(owner === undefined ? {} : { owner }), ...(signal === undefined ? {} : { signal }),
|
|
1139
931
|
env, timeoutMs: CONFIG_READ_MS, maxBuffer: CONFIG_READ_BYTES };
|
|
1140
932
|
}
|
|
1141
|
-
/** Why the checkout's config listing failed, in words, for the refusal: git's own first line, or what stopped it. */
|
|
1142
933
|
function listingFailure(result) {
|
|
1143
934
|
if (result.timedOut)
|
|
1144
935
|
return `its config couldn't be read (the read ran past ${CONFIG_READ_MS / 1000} s)`;
|
|
1145
936
|
const said = `${result.stderr}`.split("\n").map(line => line.trim()).find(line => line !== "");
|
|
1146
937
|
return `its config couldn't be read${said === undefined ? ` (git exited ${result.code})` : ` (${said.slice(0, 300)})`}`;
|
|
1147
938
|
}
|
|
1148
|
-
/** Every command runs against a view of the checkout's repository (gitView) whose config and info are copies the
|
|
1149
|
-
* plane made, inspected there, so neither can change between the inspection and the run. `mode` "read" is for reading
|
|
1150
|
-
* a checkout an agent may still be writing (the code page): every command also takes readFlags(), and the view holds
|
|
1151
|
-
* no info/attributes. "build" is the plane's staging and committing of a build's work, which writes the repository
|
|
1152
|
-
* through the view (gitView). */
|
|
1153
939
|
export function checkoutGit(inner = run, mode = "build", binding = {}) {
|
|
1154
940
|
return async (file, args, options) => {
|
|
1155
941
|
if (file !== "git")
|
|
1156
942
|
return inner(file, args, options);
|
|
1157
943
|
const cwd = options?.cwd;
|
|
1158
|
-
// In the console, a checkout whose folder hasn't answered a look lately is not read on its thread (folder-gate.ts).
|
|
1159
944
|
if (cwd !== undefined && !folderAnswers(cwd))
|
|
1160
945
|
return refused(FOLDER_DIDNT_ANSWER);
|
|
1161
946
|
if (cwd === undefined || checkoutIncludes(cwd))
|
|
1162
947
|
return refused("the checkout's git config includes another file, or couldn't be read as a plain file");
|
|
1163
|
-
// git-lfs also reads .lfsconfig from the checkout: one that names an extension (a command it would run) is refused.
|
|
1164
948
|
if (lfsExtensionIn(cwd))
|
|
1165
949
|
return refused("the checkout's .lfsconfig sets a git-lfs key that can run a command");
|
|
1166
950
|
const once = async () => {
|
|
@@ -1173,21 +957,16 @@ export function checkoutGit(inner = run, mode = "build", binding = {}) {
|
|
|
1173
957
|
}
|
|
1174
958
|
try {
|
|
1175
959
|
const viewed = { ...options, env: { ...(options?.env ?? {}), ...view.env } };
|
|
1176
|
-
// The checkout's own config may name no command. Read with this runner's own bounds (internalOptions).
|
|
1177
960
|
const own = await inner("git", ["--no-optional-locks", "config", "--list", "--show-scope", "-z"], internalOptions(options, viewed.env));
|
|
1178
961
|
if (own.code !== 0)
|
|
1179
962
|
return refused(listingFailure(own));
|
|
1180
963
|
const key = commandSetting(own.stdout, { lfsChecked: true });
|
|
1181
964
|
if (key !== null)
|
|
1182
965
|
return refused(`the checkout's git config sets ${key}, which can run a command`);
|
|
1183
|
-
// A git without --no-lazy-fetch: a repository that could fetch lazily is refused, from the view's frozen config.
|
|
1184
966
|
if (!lazyFetchSupported() && lazyFetchSetting(own.stdout) !== null)
|
|
1185
967
|
return refused(PARTIAL_CLONE_REFUSAL);
|
|
1186
|
-
// The operator's own config contributes values only (carriedSettings); git then reads no global or system config.
|
|
1187
|
-
// A read carries no filter: it reads attributes from the empty tree anyway.
|
|
1188
968
|
const carried = mode === "read" ? withoutFilters(carriedSettings(own.stdout)) : carriedSettings(own.stdout);
|
|
1189
969
|
const env = { ...viewed.env, GIT_CONFIG_NOSYSTEM: "1", GIT_CONFIG_GLOBAL: "/dev/null" };
|
|
1190
|
-
// Never into a submodule or nested repository, whose own config this never read: status and diff skip them.
|
|
1191
970
|
const safeArgs = withoutUnsupportedFlags(args);
|
|
1192
971
|
const command = safeArgs.findIndex(arg => arg === "status" || arg === "diff");
|
|
1193
972
|
if (command >= 0 && !safeArgs.includes("--ignore-submodules=all"))
|
|
@@ -1205,7 +984,6 @@ export function checkoutGit(inner = run, mode = "build", binding = {}) {
|
|
|
1205
984
|
};
|
|
1206
985
|
if (mode !== "build")
|
|
1207
986
|
return once();
|
|
1208
|
-
// A write, one at a time on a checkout (git-views.ts withCheckoutLock: re-entrant along one call chain).
|
|
1209
987
|
try {
|
|
1210
988
|
return await withCheckoutLock(realpathSync(homedir()), realpathSync(cwd), once);
|
|
1211
989
|
}
|
|
@@ -1215,30 +993,13 @@ export function checkoutGit(inner = run, mode = "build", binding = {}) {
|
|
|
1215
993
|
};
|
|
1216
994
|
}
|
|
1217
995
|
const withoutFilters = (carried) => carried.filter((one, at, all) => !(one.startsWith("filter.") || (one === "-c" && all[at + 1]?.startsWith("filter."))));
|
|
1218
|
-
/**
|
|
1219
|
-
* Flags for reading a checkout an agent writes while a page waits (docs/plans/get-side-effects.md). Command-line
|
|
1220
|
-
* settings win over anything the checkout's config says, even one changed after it was inspected: no fsmonitor, hooks,
|
|
1221
|
-
* pager or credential helper; no network (lazy fetch off, every protocol refused); and attributes read from the empty
|
|
1222
|
-
* tree, so no filter or textconv a .gitattributes names can run. A diff also takes --no-ext-diff --no-textconv.
|
|
1223
|
-
*/
|
|
1224
996
|
export const PAGE_READ_FLAGS = [
|
|
1225
997
|
"--no-lazy-fetch", "--attr-source=4b825dc642cb6eb9a060e54bf8d69288fbee4904",
|
|
1226
998
|
"-c", "protocol.allow=never", "-c", "core.pager=cat", "-c", "core.alternateRefsCommand=", "-c", "core.attributesFile=/dev/null",
|
|
1227
999
|
];
|
|
1228
|
-
/** The read flags, for every read of an agent-written checkout, whatever the HTTP method (security review of
|
|
1229
|
-
* 01bf3114): the worktree's attributes come from the empty tree. Git still reads the repository's info/attributes and
|
|
1230
|
-
* its config as it starts, so the flags alone don't stop a filter planted in both after the inspection: every read
|
|
1231
|
-
* also runs against a view of the checkout's repository (gitView; checkoutGitSync, checkoutGit "read"), whose config and info are the plane's. The cost is cosmetic: a checkout's line-ending or encoding rules are not applied, so
|
|
1232
|
-
* a file they would normalize can read as changed (fail closed: shipping then asks for a clean commit). */
|
|
1233
1000
|
export function readFlags(gitFile = "git") {
|
|
1234
1001
|
return lazyFetchSupported(gitFile) ? PAGE_READ_FLAGS : PAGE_READ_FLAGS.filter(flag => flag !== "--no-lazy-fetch");
|
|
1235
1002
|
}
|
|
1236
|
-
/**
|
|
1237
|
-
* checkoutGit, synchronously, for reads a page shows from a checkout an agent writes (docs/plans/get-side-effects.md):
|
|
1238
|
-
* the same refusals (an include, an .lfsconfig extension, a config key that can run a command), no system or global
|
|
1239
|
-
* config, the operator's own values carried, PAGE_READ_FLAGS and a view of the checkout's repository (gitView: they hold even if its config
|
|
1240
|
-
* or info/attributes change after they were read), submodules skipped, bounded. A refusal throws.
|
|
1241
|
-
*/
|
|
1242
1003
|
export function checkoutGitSync(cwd, args, options = {}) {
|
|
1243
1004
|
const ran = viewedGitSync(cwd, args, options);
|
|
1244
1005
|
if (ran.status !== 0)
|
|
@@ -1247,14 +1008,11 @@ export function checkoutGitSync(cwd, args, options = {}) {
|
|
|
1247
1008
|
}
|
|
1248
1009
|
export function viewedGitSync(cwd, args, options = {}) {
|
|
1249
1010
|
const gitFile = options.git ?? "git";
|
|
1250
|
-
// `deadline` (absolute, wall-clock ms): every subprocess here, setup included, gets only what is left of it, and an
|
|
1251
|
-
// expired deadline throws before the next one starts or after the last one ran.
|
|
1252
1011
|
const deadline = options.deadline;
|
|
1253
1012
|
const limit = deadline === undefined ? undefined : () => deadline - Date.now();
|
|
1254
1013
|
const expire = () => { if (limit !== undefined && limit() <= 0)
|
|
1255
1014
|
throw new Error("the read's deadline passed"); };
|
|
1256
1015
|
expire();
|
|
1257
|
-
// In the console, a checkout whose folder hasn't answered a look lately is not read on its thread (folder-gate.ts).
|
|
1258
1016
|
if (!folderAnswers(cwd))
|
|
1259
1017
|
throw new Error(FOLDER_DIDNT_ANSWER);
|
|
1260
1018
|
if (checkoutIncludes(cwd, gitFile, limit))
|
|
@@ -1263,13 +1021,11 @@ export function viewedGitSync(cwd, args, options = {}) {
|
|
|
1263
1021
|
if (lfsExtensionIn(cwd, gitFile, limit))
|
|
1264
1022
|
throw new Error("the checkout's .lfsconfig sets a git-lfs key that can run a command");
|
|
1265
1023
|
expire();
|
|
1266
|
-
// Its config and info/attributes as read once, in a folder of the plane's own: neither can change before git runs.
|
|
1267
1024
|
const view = gitView(cwd, "read", options.binding, gitFile, limit);
|
|
1268
1025
|
try {
|
|
1269
1026
|
const env = { PATH: process.env["PATH"] ?? "", HOME: process.env["HOME"] ?? "", LANG: "C", GIT_CONFIG_NOSYSTEM: "1", GIT_CONFIG_GLOBAL: "/dev/null", GIT_TERMINAL_PROMPT: "0", ...view.env };
|
|
1270
1027
|
const timeoutNow = () => { expire(); return limit === undefined ? options.timeoutMs ?? 60_000 : Math.max(1, Math.min(options.timeoutMs ?? 60_000, limit())); };
|
|
1271
1028
|
const fixed = { cwd, env, encoding: "utf8", killSignal: "SIGKILL", maxBuffer: options.maxBuffer ?? 1_048_576, stdio: ["ignore", "pipe", "pipe"] };
|
|
1272
|
-
// Its own bounds, never the caller's output limit (CONFIG_READ_BYTES); a caller's deadline still holds.
|
|
1273
1029
|
const own = spawnSync(gitFile, ["--no-optional-locks", "config", "--list", "--show-scope", "-z"], { ...fixed, maxBuffer: CONFIG_READ_BYTES,
|
|
1274
1030
|
timeout: limit === undefined ? CONFIG_READ_MS : Math.max(1, Math.min(CONFIG_READ_MS, limit())) });
|
|
1275
1031
|
if (own.status !== 0)
|
|
@@ -1277,21 +1033,17 @@ export function viewedGitSync(cwd, args, options = {}) {
|
|
|
1277
1033
|
const key = commandSetting(own.stdout, { lfsChecked: true });
|
|
1278
1034
|
if (key !== null)
|
|
1279
1035
|
throw new Error(`the checkout's git config sets ${key}, which can run a command`);
|
|
1280
|
-
// A git without --no-lazy-fetch: a repository that could fetch lazily is refused, from the view's frozen config.
|
|
1281
1036
|
if (!lazyFetchSupported(gitFile) && lazyFetchSetting(own.stdout) !== null)
|
|
1282
1037
|
throw new Error(PARTIAL_CLONE_REFUSAL);
|
|
1283
1038
|
const safeArgs = withoutUnsupportedFlags(args, gitFile);
|
|
1284
1039
|
const command = safeArgs.findIndex(arg => arg === "status" || arg === "diff");
|
|
1285
1040
|
if (command >= 0 && !safeArgs.includes("--ignore-submodules=all"))
|
|
1286
1041
|
safeArgs.splice(command + 1, 0, "--ignore-submodules=all");
|
|
1287
|
-
// An external diff program is named by config, which may change after it was read: never used here.
|
|
1288
1042
|
if (command >= 0 && safeArgs[command] === "diff")
|
|
1289
1043
|
safeArgs.splice(command + 1, 0, "--no-ext-diff", "--no-textconv");
|
|
1290
|
-
// The operator's own values, but no filter: PAGE_READ_FLAGS reads attributes from the empty tree anyway.
|
|
1291
1044
|
const carried = withoutFilters(carriedSettings(own.stdout));
|
|
1292
1045
|
const argv = [...TEARDOWN_FLAGS, ...readFlags(gitFile), "-c", "diff.ignoreSubmodules=all", ...carried, ...safeArgs];
|
|
1293
1046
|
if (options.buffer === true) {
|
|
1294
|
-
// stdin is the caller's own bytes when given (cat-file --batch), else closed.
|
|
1295
1047
|
const ran = spawnSync(gitFile, argv, { ...fixed, timeout: timeoutNow(), encoding: "buffer", ...(options.input === undefined ? {} : { input: options.input, stdio: ["pipe", "pipe", "pipe"] }) });
|
|
1296
1048
|
const why = view.settle();
|
|
1297
1049
|
if (why !== null)
|
|
@@ -1310,12 +1062,6 @@ export function viewedGitSync(cwd, args, options = {}) {
|
|
|
1310
1062
|
view.dispose();
|
|
1311
1063
|
}
|
|
1312
1064
|
}
|
|
1313
|
-
/**
|
|
1314
|
-
* checkoutGit ("build": the repository written through its view) for callers that name the repository with a leading
|
|
1315
|
-
* `git -C <dir>` instead of a cwd: worktree add and remove in a project's repository, a merge in a checkout of it.
|
|
1316
|
-
* The project's repository is shared with every build, which can write its config, info and hooks; nothing here runs
|
|
1317
|
-
* what they name. Anything but git goes to `inner` as given.
|
|
1318
|
-
*/
|
|
1319
1065
|
export function hardenedGit(inner = run, mode = "build", binding = {}) {
|
|
1320
1066
|
const hardened = checkoutGit(inner, mode, binding);
|
|
1321
1067
|
return (file, args, options) => {
|
|
@@ -1330,15 +1076,8 @@ export function hardenedGit(inner = run, mode = "build", binding = {}) {
|
|
|
1330
1076
|
return hardened("git", rest, { ...options, ...(cwd === undefined ? {} : { cwd }) });
|
|
1331
1077
|
};
|
|
1332
1078
|
}
|
|
1333
|
-
/**
|
|
1334
|
-
* Git older than 2.45 has no `--no-lazy-fetch` (and no GIT_NO_LAZY_FETCH): there, every hardened read leaves the flag
|
|
1335
|
-
* out and instead refuses a repository whose config makes lazy fetching possible (lazyFetchSetting), while
|
|
1336
|
-
* `protocol.allow=never` stays on every read and write, so a lazy fetch that slipped past would still find no
|
|
1337
|
-
* transport. Asked once per process, as the plane's other plain git probes run: no system or global config.
|
|
1338
|
-
*/
|
|
1339
1079
|
const lazyFetchByGit = new Map();
|
|
1340
1080
|
let lazyFetchOverride;
|
|
1341
|
-
/** The git executable `file` names, as the real path it runs (a bare name looked up on PATH), or `file` itself. */
|
|
1342
1081
|
function gitExecutablePath(file) {
|
|
1343
1082
|
const candidates = file.includes("/") ? [file] : (process.env["PATH"] ?? "").split(delimiter).filter(dir => isAbsolute(dir)).map(dir => join(dir, file));
|
|
1344
1083
|
for (const candidate of candidates) {
|
|
@@ -1346,12 +1085,10 @@ function gitExecutablePath(file) {
|
|
|
1346
1085
|
accessSync(candidate, fsConstants.X_OK);
|
|
1347
1086
|
return realpathSync(candidate);
|
|
1348
1087
|
}
|
|
1349
|
-
catch {
|
|
1088
|
+
catch { }
|
|
1350
1089
|
}
|
|
1351
1090
|
return file;
|
|
1352
1091
|
}
|
|
1353
|
-
/** Asked once per git executable (eval-harness review 2, follow-up): a fixed git given to viewedGitSync is probed
|
|
1354
|
-
* itself, never answered for by the one PATH names. */
|
|
1355
1092
|
export function lazyFetchSupported(gitFile = "git") {
|
|
1356
1093
|
if (lazyFetchOverride !== undefined)
|
|
1357
1094
|
return lazyFetchOverride;
|
|
@@ -1365,23 +1102,12 @@ export function lazyFetchSupported(gitFile = "git") {
|
|
|
1365
1102
|
}
|
|
1366
1103
|
return known;
|
|
1367
1104
|
}
|
|
1368
|
-
/** For tests: forget the probes' answers, or set one for every executable (null forgets). */
|
|
1369
1105
|
export function setLazyFetchSupportedForTest(value) { lazyFetchOverride = value ?? undefined; lazyFetchByGit.clear(); }
|
|
1370
|
-
/** The words for a partial clone refused on a git without `--no-lazy-fetch`. */
|
|
1371
1106
|
export const PARTIAL_CLONE_REFUSAL = "this project is a partial clone; protected reads need git 2.45 or newer";
|
|
1372
|
-
/** `--no-lazy-fetch` where the installed git has it, else nothing (and lazyFetchSetting refuses partial clones). */
|
|
1373
1107
|
export function noLazyFetch() { return lazyFetchSupported() ? ["--no-lazy-fetch"] : []; }
|
|
1374
|
-
/** A caller's own arguments with `--no-lazy-fetch` taken out when the installed git doesn't know it. */
|
|
1375
1108
|
function withoutUnsupportedFlags(args, gitFile = "git") {
|
|
1376
1109
|
return lazyFetchSupported(gitFile) ? [...args] : args.filter(arg => arg !== "--no-lazy-fetch");
|
|
1377
1110
|
}
|
|
1378
|
-
/**
|
|
1379
|
-
* The repository setting (local or worktree scope of a `git config --list --show-scope -z` listing) that makes lazy
|
|
1380
|
-
* fetching possible, or null: `extensions.partialClone` set at all, any `remote.<name>.promisor` not plainly false, or
|
|
1381
|
-
* any `remote.<name>.partialCloneFilter` set (git makes that remote a promisor). Fails closed: a listing that can't be
|
|
1382
|
-
* read names a setting. `remote.<name>.vcs` (a foreign-VCS helper) is named too, though the classifier already refuses
|
|
1383
|
-
* it (commandSetting: not in the remote allowlist), as it does every `protocol.*` key and every include.
|
|
1384
|
-
*/
|
|
1385
1111
|
export function lazyFetchSetting(listing) {
|
|
1386
1112
|
try {
|
|
1387
1113
|
const fields = listing.split("\0");
|
|
@@ -1407,23 +1133,9 @@ export function lazyFetchSetting(listing) {
|
|
|
1407
1133
|
return "a setting that couldn't be read";
|
|
1408
1134
|
}
|
|
1409
1135
|
}
|
|
1410
|
-
/**
|
|
1411
|
-
* For the reads that run git directly on a repository rather than through a view: with `--no-lazy-fetch` they run as
|
|
1412
|
-
* they always have (the flag stops any fetch). Without it, they must not check a repository's config and then run git
|
|
1413
|
-
* on it (the config could change in between, or an include could set what the check never saw): `inner`, wrapped so
|
|
1414
|
-
* every git command runs through a frozen read view (checkoutGit "read"), whose own config listing (includes refused,
|
|
1415
|
-
* command and protocol settings refused, a partial clone refused) is the config git then runs with.
|
|
1416
|
-
*/
|
|
1417
1136
|
export function lazyFetchSafeGit(inner = run) {
|
|
1418
|
-
// On every git version (eval-harness review 1, finding 7): with --no-lazy-fetch the direct read still took the
|
|
1419
|
-
// repository's config and its includes as git found them, and an include naming a FIFO could hang the plane.
|
|
1420
1137
|
return checkoutGit(inner, "read");
|
|
1421
1138
|
}
|
|
1422
|
-
/**
|
|
1423
|
-
* The checkout a folder sits in, for choosing a folder (easy-start): the nearest parent holding a `.git`, then read
|
|
1424
|
-
* through checkoutGitSync, so a config that includes another file (a FIFO), or sets a command, is refused and the read
|
|
1425
|
-
* is bounded. Null when there is no checkout or it can't be read that way.
|
|
1426
|
-
*/
|
|
1427
1139
|
export function checkoutTop(dir, timeoutMs = 10_000) {
|
|
1428
1140
|
let at;
|
|
1429
1141
|
try {
|