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/agent-fence.js
CHANGED
|
@@ -1,26 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The agent fence: what no build, plan, scout or repair agent may read or write, whatever its permission mode. Agents
|
|
3
|
-
* run as the operator's own OS user, so without it an agent could read the approver's remembered login
|
|
4
|
-
* (`up-login.txt`), runner and coordinator tokens, provider keys, project tool secrets, other runs' evidence, or the
|
|
5
|
-
* live database — and use them to approve its own work. The fence closes that at the operating system, not in the
|
|
6
|
-
* model's instructions.
|
|
7
|
-
*
|
|
8
|
-
* The sandbox itself is Anthropic's sandbox-runtime (sandbox-runtime.ts): every macOS Seatbelt profile and every Linux
|
|
9
|
-
* bubblewrap + seccomp invocation is generated by its code, with its baseline, its mandatory write denies (shell
|
|
10
|
-
* profiles, .git/hooks, .vscode, .mcp.json and the rest) and its limits. This module decides only the few static rules
|
|
11
|
-
* Toolroll passes it (srtTermsOf): Toolroll's own state and database denied to read and write; the build's own
|
|
12
|
-
* checkout writable; other tasks' checkouts read, never written; the project's read-deny list; under policy v1 (an
|
|
13
|
-
* approval sealed before 0.9.70) the home configuration denied by name; a sign-ins check's exact files read again; the
|
|
14
|
-
* run's proxy as its only way out when its network is confined. On macOS every launch also gets a pseudo-terminal of its
|
|
15
|
-
* own and no other terminal, a project check's launch Chromium's own service, and only a build's agent the keychain
|
|
16
|
-
* (sandbox-runtime.ts seatbeltRulesFor, static rules).
|
|
17
|
-
*
|
|
18
|
-
* Codex (every platform) fences its own agent's commands with its own sandbox: a permission profile with the same
|
|
19
|
-
* denies (codexFenceArgv). Claude also gets Read/Edit deny rules for its own file tools.
|
|
20
|
-
*
|
|
21
|
-
* A build's fence also holds its task boundary (`taskBoundary`): under v1 the home configuration and the repositories
|
|
22
|
-
* beside its own; under v2 only the primary checkout write-denied.
|
|
23
|
-
*/
|
|
24
1
|
import { INSTANCE_DIR } from "./console-instance.js";
|
|
25
2
|
import { ACP_AGENTS, ACP_PROVIDER_IDS } from "./acp-agents.js";
|
|
26
3
|
import { spawnSync } from "node:child_process";
|
|
@@ -39,7 +16,6 @@ import { SEATBELT_PROBE, sandboxRuntimeProblem, srtSpawn } from "./sandbox-runti
|
|
|
39
16
|
import { protectedStorageDenies, protectedStorageNames } from "./protected-storage.js";
|
|
40
17
|
import { ensureSecretsDir, legacyLoginFileOf, SECRETS_DIR, secretsDirOf } from "./login-secrets.js";
|
|
41
18
|
import { getDefaultWritePaths } from "@anthropic-ai/sandbox-runtime";
|
|
42
|
-
/** Names that are secrets wherever the database lives (used when its folder is shared with other things). */
|
|
43
19
|
const SENSITIVE_NAME = /(^up-login\.txt$|token|secret|login|password|credential|vapid|keys?\b|\.pem$|\.key$|^backups$|^evidence$|^remote$|^sign-in\.json$|^monitoring\.json$)/i;
|
|
44
20
|
function real(path) {
|
|
45
21
|
try {
|
|
@@ -55,7 +31,6 @@ function inside(child, parent) {
|
|
|
55
31
|
}
|
|
56
32
|
export class CheckoutBindingError extends Error {
|
|
57
33
|
}
|
|
58
|
-
/** One small file read only as the regular file it is: never through a link, never blocking on a FIFO; null otherwise. */
|
|
59
34
|
function regularText(path) {
|
|
60
35
|
let fd = null;
|
|
61
36
|
try {
|
|
@@ -82,8 +57,6 @@ export function trustedWorktreeBinding(repository, worktree, poolRoots = []) {
|
|
|
82
57
|
const fail = () => new CheckoutBindingError("The checkout's Git pointer was changed or its trusted binding could not be verified.");
|
|
83
58
|
const registry = join(main, ".git", "worktrees");
|
|
84
59
|
try {
|
|
85
|
-
// The registry may legitimately contain the destination of an attacker link.
|
|
86
|
-
// Check the recorded name before accepting that destination as this run's checkout.
|
|
87
60
|
if (realpathSync(worktree) !== join(realpathSync(dirname(worktree)), basename(worktree)))
|
|
88
61
|
throw fail();
|
|
89
62
|
for (const root of poolRoots) {
|
|
@@ -92,8 +65,6 @@ export function trustedWorktreeBinding(repository, worktree, poolRoots = []) {
|
|
|
92
65
|
const components = [];
|
|
93
66
|
for (let component = resolve(worktree); component !== dirname(component); component = dirname(component)) {
|
|
94
67
|
components.push(component);
|
|
95
|
-
// Permit system aliases above the trusted pool (e.g. /var -> /private/var),
|
|
96
|
-
// but no redirect at or below it, including older checkout names.
|
|
97
68
|
if (real(component) !== real(root) && component !== resolve(root))
|
|
98
69
|
continue;
|
|
99
70
|
for (const one of components)
|
|
@@ -104,10 +75,6 @@ export function trustedWorktreeBinding(repository, worktree, poolRoots = []) {
|
|
|
104
75
|
}
|
|
105
76
|
if (!lstatSync(join(main, ".git")).isDirectory() || !lstatSync(registry).isDirectory())
|
|
106
77
|
throw fail();
|
|
107
|
-
// The trusted checkout's own worktree registry, never the candidate's configurable Git pointer — read as files, with
|
|
108
|
-
// no git at all (eval-harness review 2, finding 6): the repository's config is shared with every build, so an
|
|
109
|
-
// include naming a FIFO could hold a git read (and dispatch) up; a FIFO or link planted as a registry file is never
|
|
110
|
-
// opened as one (regularText).
|
|
111
78
|
for (const entry of readdirSync(registry)) {
|
|
112
79
|
const path = join(registry, entry);
|
|
113
80
|
if (!lstatSync(path).isDirectory() || !inside(real(path), real(registry)))
|
|
@@ -127,33 +94,16 @@ export function trustedWorktreeBinding(repository, worktree, poolRoots = []) {
|
|
|
127
94
|
}
|
|
128
95
|
throw fail();
|
|
129
96
|
}
|
|
130
|
-
/**
|
|
131
|
-
* Every path an agent must not reach: the Toolroll state folder
|
|
132
|
-
* beside the database (all of it, except the folder that holds this run's
|
|
133
|
-
* own worktree), the database itself with its journal files, and
|
|
134
|
-
* `~/.toolroll` or an older `~/.standing-orders` (provider keys and project tool secrets). When the
|
|
135
|
-
* database sits anywhere else (a shared folder), only the database and
|
|
136
|
-
* secret-looking entries there are fenced.
|
|
137
|
-
*/
|
|
138
97
|
export function agentFence(options) {
|
|
139
98
|
const fence = new Set();
|
|
140
|
-
/** The console's run folder: kept by its own pathname through canonicalization (and its target's too). */
|
|
141
99
|
let runFolder = null;
|
|
142
100
|
const home = real(options.home ?? homedir());
|
|
143
101
|
const worktree = options.worktree === null ? null : real(options.worktree);
|
|
144
102
|
if (options.databaseFile !== null && options.databaseFile !== "" && options.databaseFile !== ":memory:") {
|
|
145
103
|
const database = real(options.databaseFile);
|
|
146
104
|
const state = dirname(database);
|
|
147
|
-
// By name, there or not (a journal made later is denied too wherever a fence denies by name: Seatbelt and Codex).
|
|
148
105
|
for (const suffix of ["", "-wal", "-shm", "-journal"])
|
|
149
106
|
fence.add(database + suffix);
|
|
150
|
-
// The console's run folder (its discovery sockets, console-instance.ts) beside the database, wherever that is: no
|
|
151
|
-
// build may add, rename or remove anything in it while a console listens there. It is made (owner-only) before any
|
|
152
|
-
// build starts if it isn't there yet, so a build can never be the one to create it — and the fence always has a
|
|
153
|
-
// Whatever is at that path is fenced, always — a folder, a file, a link (the path itself, never only where a link
|
|
154
|
-
// points), a folder holding anything at all — so no build can replace it; when nothing is there it is made first.
|
|
155
|
-
// If it can't be made, the path is fenced anyway: a sandbox that can't cover a missing path refuses to launch
|
|
156
|
-
// rather than run unfenced. The name is Toolroll's own; nothing else belongs there.
|
|
157
107
|
runFolder = join(state, INSTANCE_DIR);
|
|
158
108
|
const present = () => { try {
|
|
159
109
|
lstatSync(runFolder);
|
|
@@ -166,48 +116,34 @@ export function agentFence(options) {
|
|
|
166
116
|
try {
|
|
167
117
|
mkdirSync(runFolder, { mode: 0o700 });
|
|
168
118
|
}
|
|
169
|
-
catch {
|
|
119
|
+
catch { }
|
|
170
120
|
}
|
|
171
121
|
fence.add(runFolder);
|
|
172
122
|
const runnerFolder = join(state, RUNNER_PROCESS_DIR);
|
|
173
123
|
try {
|
|
174
124
|
ensureRunnerProcessFolder(runnerFolder);
|
|
175
125
|
}
|
|
176
|
-
catch {
|
|
126
|
+
catch { }
|
|
177
127
|
fence.add(runnerFolder);
|
|
178
128
|
fence.add(real(runnerFolder));
|
|
179
|
-
// A copy may first appear after launch. Fence its permanent namespace even when empty.
|
|
180
129
|
const backups = join(state, "backups");
|
|
181
130
|
try {
|
|
182
131
|
mkdirSync(backups, { mode: 0o700 });
|
|
183
132
|
}
|
|
184
|
-
catch {
|
|
133
|
+
catch { }
|
|
185
134
|
fence.add(backups);
|
|
186
135
|
fence.add(real(backups));
|
|
187
|
-
// Saved credentials (the remembered login, login-secrets.ts) live in a reserved owner-only folder, made here before
|
|
188
|
-
// any launch and denied whole, so one first written after this launch is behind this fence too: a listing can't
|
|
189
|
-
// name a file that isn't there yet, and bubblewrap can't deny one. If it can't be made or proven, its name is
|
|
190
|
-
// denied anyway (and nothing is saved there).
|
|
191
136
|
const secrets = secretsDirOf(state);
|
|
192
137
|
try {
|
|
193
138
|
ensureSecretsDir(state);
|
|
194
139
|
}
|
|
195
|
-
catch {
|
|
140
|
+
catch { }
|
|
196
141
|
fence.add(secrets);
|
|
197
142
|
fence.add(real(secrets));
|
|
198
|
-
// An older version's login beside the database: listed below when it is there; by name, there or not, where the
|
|
199
|
-
// sandbox denies a missing path without making it (Seatbelt; Codex's profile gets the same list). On Linux a
|
|
200
|
-
// missing path would be stubbed into being for the launch, and nothing writes that name any more.
|
|
201
143
|
const legacyLogin = legacyLoginFileOf(state);
|
|
202
144
|
if (process.platform === "darwin" || existsSync(legacyLogin))
|
|
203
145
|
fence.add(legacyLogin);
|
|
204
|
-
// Only a folder that is Toolroll's own (~/.config/toolroll or an older name,
|
|
205
|
-
// the desktop app's "Toolroll") is fenced whole: a database kept
|
|
206
|
-
// in a shared folder (a projects folder, a test's temp folder) must not
|
|
207
|
-
// fence its neighbours, the repositories agents build among them.
|
|
208
146
|
const dedicated = state !== home && state !== sep && !existsSync(join(state, ".git")) && /standing[\s_-]?orders|toolroll|nightorders/i.test(basename(state));
|
|
209
|
-
// The entries this run's worktree needs stay reachable: the one it lives
|
|
210
|
-
// under, and the repository its git metadata belongs to.
|
|
211
147
|
const keep = new Set();
|
|
212
148
|
for (const needed of [worktree, options.binding?.main ?? null]) {
|
|
213
149
|
if (needed !== null && inside(needed, state))
|
|
@@ -221,23 +157,19 @@ export function agentFence(options) {
|
|
|
221
157
|
entries = [];
|
|
222
158
|
}
|
|
223
159
|
for (const entry of entries) {
|
|
224
|
-
// A repository is work, never a secret.
|
|
225
160
|
if (keep.has(entry) || existsSync(join(state, entry, ".git")))
|
|
226
161
|
continue;
|
|
227
162
|
if (dedicated || SENSITIVE_NAME.test(entry))
|
|
228
163
|
fence.add(join(state, entry));
|
|
229
164
|
}
|
|
230
165
|
}
|
|
231
|
-
// The plane's private views of repositories for its own git (git-views.ts): made first, so no build is the one to
|
|
232
|
-
// create them, and denied by name whether or not that worked (a sandbox that can't cover the path refuses to launch).
|
|
233
166
|
try {
|
|
234
167
|
ensureGitViewsRoot(home);
|
|
235
168
|
}
|
|
236
|
-
catch {
|
|
169
|
+
catch { }
|
|
237
170
|
fence.add(gitViewsRoot(home));
|
|
238
171
|
for (const secrets of existingFolders(home, { dot: true }))
|
|
239
172
|
fence.add(secrets);
|
|
240
|
-
// v104: the folder the audit stream writes to holds the whole instance's history.
|
|
241
173
|
if (options.databaseFile !== null && options.databaseFile !== "" && options.databaseFile !== ":memory:") {
|
|
242
174
|
const stream = readMonitoring(dirname(real(options.databaseFile))).folder?.path;
|
|
243
175
|
if (stream !== undefined)
|
|
@@ -245,12 +177,9 @@ export function agentFence(options) {
|
|
|
245
177
|
}
|
|
246
178
|
for (const path of options.extra ?? [])
|
|
247
179
|
fence.add(real(path));
|
|
248
|
-
// Secret, state, database, explicit-extra and home-config denies are never exemptible.
|
|
249
180
|
for (const path of options.boundary?.protectedShell ?? [])
|
|
250
181
|
fence.add(real(path));
|
|
251
182
|
const protectedPaths = new Set([...fence].flatMap(path => path === runFolder || [RUNNER_PROCESS_DIR, "backups", SECRETS_DIR].includes(basename(path)) ? [path, real(path)] : [real(path)]));
|
|
252
|
-
// Protected storage (chat apps, browser profiles, password managers): every launch, every policy, never exemptible,
|
|
253
|
-
// kept by the name it was resolved under as well as where it leads.
|
|
254
183
|
const storage = options.protectedStorage ?? protectedStorageDenies(home);
|
|
255
184
|
for (const path of storage) {
|
|
256
185
|
protectedPaths.add(path);
|
|
@@ -267,34 +196,15 @@ export function agentFence(options) {
|
|
|
267
196
|
return false;
|
|
268
197
|
}).sort();
|
|
269
198
|
}
|
|
270
|
-
/**
|
|
271
|
-
* Credentials and agent configuration in the home folder. A build is the
|
|
272
|
-
* operator's own OS user, so without this it could read their SSH keys,
|
|
273
|
-
* cloud logins or another agent's sign-in, or rewrite their own Claude or
|
|
274
|
-
* Codex setup for the next interactive session.
|
|
275
|
-
*/
|
|
276
199
|
const HOME_CONFIGURATION = [
|
|
277
200
|
".claude", ".claude.json", ".codex", ".gemini", ".ssh", ".aws", ".gnupg", ".netrc", ".git-credentials", ".kube", join(".config", "gh"), join(".docker", "config.json"),
|
|
278
|
-
// Every ACP agent's own configuration and sign-in (acp-agents.ts): fenced from every build but that agent's own.
|
|
279
201
|
...ACP_PROVIDER_IDS.flatMap(id => ACP_AGENTS[id].home),
|
|
280
202
|
];
|
|
281
|
-
/** What a provider's own CLI reads to sign in and keep its sessions. The OS fence around Claude and Gemini holds
|
|
282
|
-
* their whole process, so those stay reachable there; Codex fences only its agent's commands, so it keeps none. */
|
|
283
203
|
const PROVIDER_HOME = {
|
|
284
204
|
claude: [".claude", ".claude.json"], gemini: [".gemini"], codex: [], openrouter: [],
|
|
285
|
-
// Each ACP agent keeps its own configuration and sign-in where its row says (acp-agents.ts).
|
|
286
205
|
...Object.fromEntries(ACP_PROVIDER_IDS.map(id => [id, ACP_AGENTS[id].home])),
|
|
287
206
|
};
|
|
288
|
-
/** What Claude's own file tools refuse inside its home: the CLI reads these itself, its model never needs to. */
|
|
289
207
|
const CLAUDE_FILE_TOOL_HOME = [".claude.json", join(".claude", ".credentials.json"), join(".claude", "settings.json"), join(".claude", "settings.local.json"), ".npmrc"];
|
|
290
|
-
/**
|
|
291
|
-
* Everything outside a task's own folders that a build could otherwise
|
|
292
|
-
* reach: the home configuration above, the other repositories beside its
|
|
293
|
-
* project (and other tasks' worktrees beside its own), and the project's
|
|
294
|
-
* primary checkout — all but its `.git`, which the worktree's git needs.
|
|
295
|
-
* The task's worktree, the files Toolroll makes for the run (in the
|
|
296
|
-
* system temp folder) and everything else stay as they are.
|
|
297
|
-
*/
|
|
298
208
|
export function taskBoundary(options) {
|
|
299
209
|
const home = real(options.home ?? homedir());
|
|
300
210
|
const worktree = real(options.worktree);
|
|
@@ -303,9 +213,6 @@ export function taskBoundary(options) {
|
|
|
303
213
|
const needed = [worktree, main, gitdir].filter((path) => path !== null);
|
|
304
214
|
const own = new Set(PROVIDER_HOME[options.provider] ?? []);
|
|
305
215
|
const present = (names) => names.map(name => join(home, name)).filter(path => existsSync(path)).map(real);
|
|
306
|
-
// Policy v2 (docs/plans/sandbox-parity.md §1.2): the home folder, the repositories beside this one and the project's
|
|
307
|
-
// primary checkout are read as Anthropic's sandbox runtime reads them; only writes to the primary checkout stay denied.
|
|
308
|
-
// Protected storage by name, under both policies (protected-storage.ts): never part of the v1-only home configuration.
|
|
309
216
|
const storage = options.storage?.names ?? protectedStorageNames(home);
|
|
310
217
|
if ((options.policy ?? 1) === 2)
|
|
311
218
|
return v2Boundary(worktree, main, gitdir, storage);
|
|
@@ -313,8 +220,6 @@ export function taskBoundary(options) {
|
|
|
313
220
|
const protectedShell = [...shell, ...storage];
|
|
314
221
|
const repository = (path) => existsSync(join(path, ".git"));
|
|
315
222
|
for (const parent of new Set([dirname(worktree), ...(main === null ? [] : [dirname(main)])])) {
|
|
316
|
-
// Home contains toolchain clones such as .nvm and .oh-my-zsh. The
|
|
317
|
-
// explicit configuration fence above owns home, not repository discovery.
|
|
318
223
|
if (real(parent) === home)
|
|
319
224
|
continue;
|
|
320
225
|
let entries = [];
|
|
@@ -352,14 +257,9 @@ export function taskBoundary(options) {
|
|
|
352
257
|
}
|
|
353
258
|
const { readOnly, lookup } = siblingGitData(main, gitdir);
|
|
354
259
|
const fileTools = options.provider === "claude" ? present(CLAUDE_FILE_TOOL_HOME).filter(path => !shell.has(path)) : [];
|
|
355
|
-
// By name too, present or not: a build started while ~/.codex is absent must never make it (and later swap it for a
|
|
356
|
-
// link while a sign-ins check reads through it). The sandbox runtime takes them as read and write denies by name.
|
|
357
260
|
const homeNames = HOME_CONFIGURATION.filter(name => !own.has(name)).map(name => join(home, name)).sort();
|
|
358
261
|
return { protectedShell, shell: [...shell].sort(), fileTools: fileTools.sort(), readOnly: [...readOnly].sort(), lookup: [...lookup].sort(), homeNames };
|
|
359
262
|
}
|
|
360
|
-
/** A v2 boundary: nothing of the home folder, the repositories beside this one or the primary checkout is denied to
|
|
361
|
-
* read; the primary checkout (all but its `.git`, which this worktree's Git needs) is never written; other tasks' Git
|
|
362
|
-
* metadata is read, never written, as under v1. */
|
|
363
263
|
function v2Boundary(worktree, main, gitdir, storage) {
|
|
364
264
|
const noWrite = new Set();
|
|
365
265
|
if (main !== null && main !== worktree) {
|
|
@@ -381,11 +281,6 @@ function v2Boundary(worktree, main, gitdir, storage) {
|
|
|
381
281
|
readOnly.add(path);
|
|
382
282
|
return { protectedShell: [...storage], shell: [], fileTools: [], readOnly: [...readOnly].sort(), lookup: [...lookup].sort(), homeNames: [] };
|
|
383
283
|
}
|
|
384
|
-
/**
|
|
385
|
-
* Git needs this worktree's metadata and the shared objects/refs, but must not prune or rewrite the metadata of another
|
|
386
|
-
* task's checkout. It still reads that metadata (gc keeps what a sibling's HEAD and index reach) and looks up the
|
|
387
|
-
* checkout it names: a checkout it can't see is one `git worktree prune` deletes the entry of.
|
|
388
|
-
*/
|
|
389
284
|
function siblingGitData(main, gitdir) {
|
|
390
285
|
const readOnly = new Set();
|
|
391
286
|
const lookup = new Set();
|
|
@@ -399,8 +294,6 @@ function siblingGitData(main, gitdir) {
|
|
|
399
294
|
entries = [];
|
|
400
295
|
}
|
|
401
296
|
for (const entry of entries) {
|
|
402
|
-
// Only a plain folder, by the name git gave it: a link a build planted here (to ~/.toolroll, say) is never
|
|
403
|
-
// followed into a grant, which a sandbox that lets the more specific path win would honour over the fence.
|
|
404
297
|
const path = join(siblings, entry);
|
|
405
298
|
if (path === gitdir)
|
|
406
299
|
continue;
|
|
@@ -422,8 +315,6 @@ function siblingGitData(main, gitdir) {
|
|
|
422
315
|
if (pointer === undefined || pointer === "" || !isAbsolute(pointer))
|
|
423
316
|
continue;
|
|
424
317
|
const checkout = dirname(real(pointer));
|
|
425
|
-
// The entry's pointer is build-writable: look up only a checkout whose own .git names this entry back, as git
|
|
426
|
-
// links a real one, so a planted pointer can't lift a fenced path's metadata.
|
|
427
318
|
if (worktreeGitDir(checkout) !== path)
|
|
428
319
|
continue;
|
|
429
320
|
lookup.add(checkout);
|
|
@@ -432,21 +323,13 @@ function siblingGitData(main, gitdir) {
|
|
|
432
323
|
}
|
|
433
324
|
return { readOnly, lookup };
|
|
434
325
|
}
|
|
435
|
-
/** The prefixes of every launch's private folders: its tools' config and a Codex build's own home (and a check's). */
|
|
436
326
|
export const RUN_FOLDER_PREFIXES = ["so-tools-", "so-codex-", "so-net-", "so-cmd-"];
|
|
437
327
|
export function runFolders(own, root) {
|
|
438
|
-
// The system's own roots (not one a caller names): on a Mac, checks' launch folders are under the short one too.
|
|
439
328
|
const also = root === undefined && process.platform === "darwin" && existsSync(CHECK_LAUNCH_ROOT_MACOS) ? [CHECK_LAUNCH_ROOT_MACOS] : [];
|
|
440
329
|
return { root: real(root ?? tmpdir()), own: own === null ? null : real(own), ...(also.length === 0 ? {} : { also }) };
|
|
441
330
|
}
|
|
442
|
-
/** Where a check's launch folder is made on a Mac: a short shared folder, so its TMPDIR leaves room for a unix socket
|
|
443
|
-
* path (about 104 bytes). */
|
|
444
331
|
export const CHECK_LAUNCH_ROOT_MACOS = "/private/tmp";
|
|
445
|
-
/** The folder a check's launch folder is made in: on a Mac the short one, elsewhere the system temp folder. */
|
|
446
332
|
export const checkLaunchRoot = () => process.platform === "darwin" && existsSync(CHECK_LAUNCH_ROOT_MACOS) ? CHECK_LAUNCH_ROOT_MACOS : tmpdir();
|
|
447
|
-
/** Every other launch's private folder in the system temp folder now, each only as the real folder it is (a link planted
|
|
448
|
-
* there is never followed, nor fenced in its target's place) and this user's own. A shared root (`also`, /private/tmp on
|
|
449
|
-
* a Mac) is never listed: anyone may plant entries there, so it is fenced by name pattern alone. */
|
|
450
333
|
function otherRunFolders(folders) {
|
|
451
334
|
let entries = [];
|
|
452
335
|
try {
|
|
@@ -468,33 +351,23 @@ function otherRunFolders(folders) {
|
|
|
468
351
|
}
|
|
469
352
|
});
|
|
470
353
|
}
|
|
471
|
-
/** Every root launch folders are made under (the system temp folder, and on a Mac the short shared one). */
|
|
472
354
|
export const runRoots = (folders) => [folders.root, ...(folders.also ?? [])];
|
|
473
355
|
export { isWritesMode, WRITES_DEFAULT } from "./writes-mode.js";
|
|
474
|
-
/** Claude's transcript folder for a working folder: its path with every character but a letter or digit made `-`
|
|
475
|
-
* (Claude Code's own naming; a name over 200 characters gets a suffix, so it is granted by prefix). */
|
|
476
356
|
export function claudeProjectFolder(home, cwd) {
|
|
477
357
|
const slug = cwd.replace(/[^a-zA-Z0-9]/g, "-");
|
|
478
358
|
return slug.length > 200 ? { path: join(home, ".claude", "projects", slug.slice(0, 200)), byPrefix: true } : { path: join(home, ".claude", "projects", slug), byPrefix: false };
|
|
479
359
|
}
|
|
480
|
-
/**
|
|
481
|
-
* A folder a write grant may name: made when absent, then only as the real folder it is — never a link, nor reached
|
|
482
|
-
* through one (its real path is its parent's real path and its own name). A build can rewrite what it may write, so a
|
|
483
|
-
* folder it was given could otherwise come back as a link to anywhere and be granted, followed, on its next launch.
|
|
484
|
-
* Null when it isn't such a folder: nothing is granted, and the write it was for fails.
|
|
485
|
-
*/
|
|
486
360
|
export function grantFolder(path, create = true) {
|
|
487
361
|
if (create) {
|
|
488
362
|
try {
|
|
489
363
|
mkdirSync(path, { recursive: true, mode: 0o700 });
|
|
490
364
|
}
|
|
491
|
-
catch {
|
|
365
|
+
catch { }
|
|
492
366
|
}
|
|
493
367
|
try {
|
|
494
368
|
const held = lstatSync(path);
|
|
495
369
|
if (held.isSymbolicLink() || !held.isDirectory())
|
|
496
370
|
return null;
|
|
497
|
-
// Nor through a link of this user's anywhere above it (a system alias, /var → /private/var, is root's and fine).
|
|
498
371
|
const uid = process.getuid?.();
|
|
499
372
|
for (let folder = dirname(resolve(path)); folder !== dirname(folder); folder = dirname(folder)) {
|
|
500
373
|
const above = lstatSync(folder);
|
|
@@ -508,42 +381,23 @@ export function grantFolder(path, create = true) {
|
|
|
508
381
|
return null;
|
|
509
382
|
}
|
|
510
383
|
}
|
|
511
|
-
/**
|
|
512
|
-
* The data folders an ACP agent writes besides a ~/.local/share|state root, per agent, only where known: Goose's
|
|
513
|
-
* sessions and state; Qwen Code (a Gemini CLI fork) its history and temp, as Gemini measured. An agent not listed
|
|
514
|
-
* (Cursor, Cline: their settings sit among their data) writes nothing of its own under a workspace build until its
|
|
515
|
-
* layout is measured; a project using one chooses `anywhere`.
|
|
516
|
-
*/
|
|
517
384
|
const ACP_DATA = {
|
|
518
385
|
goose: [".local/share/goose", ".local/state/goose"],
|
|
519
386
|
qwen: [".qwen/tmp", ".qwen/history"],
|
|
520
387
|
};
|
|
521
|
-
/** The suffix Claude Code gives a transcript folder whose name it shortened: `-` and a hash, nothing else. */
|
|
522
388
|
const CLAUDE_SHORTENED = "-[a-z0-9]+(/|$)";
|
|
523
|
-
/** A file and the temporary names it is replaced through (`name.tmp-1`, `name.json.12345`), never a folder below it. */
|
|
524
389
|
const ATOMIC_NAMES = "([.~][^/]*)?$";
|
|
525
|
-
/** The parts of a repository's shared Git data a commit in a worktree writes: objects, refs and their logs (and the
|
|
526
|
-
* packed refs). Its config, hooks, info, other worktrees' data and submodules' are never among them. */
|
|
527
390
|
function commitGitData(common) {
|
|
528
391
|
const made = (path) => { try {
|
|
529
392
|
mkdirSync(path, { recursive: true });
|
|
530
393
|
}
|
|
531
|
-
catch {
|
|
394
|
+
catch { } return real(path); };
|
|
532
395
|
return {
|
|
533
396
|
subpaths: ["objects", "refs", "logs"].map(name => grantFolder(join(common, name))).filter((path) => path !== null),
|
|
534
397
|
prefixes: [{ path: join(common, "packed-refs"), suffix: ATOMIC_NAMES }],
|
|
535
|
-
// Alternates there would let objects come from anywhere.
|
|
536
398
|
readOnly: [made(join(common, "objects", "info"))],
|
|
537
399
|
};
|
|
538
400
|
}
|
|
539
|
-
/**
|
|
540
|
-
* What a `workspace` build writes and what it loses (arc 2): its checkout, its checkout's Git data (less the shared
|
|
541
|
-
* repository's config, hooks and info, which Git runs or reads as commands), its own launch folder (its temp is there),
|
|
542
|
-
* its project's cache folder, the terminal devices, and only the provider state its CLI must write (measured: Claude's
|
|
543
|
-
* transcript folder for this checkout; Gemini's history, temp and project list; an ACP agent's own folders). The
|
|
544
|
-
* folders named here are made first, so the provider never has to make them where it can't. `deny` is what this
|
|
545
|
-
* provider must not even read (Claude's live sessions' keys).
|
|
546
|
-
*/
|
|
547
401
|
export function writeAllowlist(options) {
|
|
548
402
|
const home = real(options.home);
|
|
549
403
|
const worktree = real(options.worktree);
|
|
@@ -554,15 +408,13 @@ export function writeAllowlist(options) {
|
|
|
554
408
|
const made = (path) => { try {
|
|
555
409
|
mkdirSync(path, { recursive: true, mode: 0o700 });
|
|
556
410
|
}
|
|
557
|
-
catch {
|
|
411
|
+
catch { } return real(path); };
|
|
558
412
|
const grant = (path, create = true) => { const at = grantFolder(path, create); if (at !== null)
|
|
559
413
|
subpaths.add(at); };
|
|
560
414
|
if (options.binding !== null) {
|
|
561
415
|
const common = real(join(options.binding.main, ".git"));
|
|
562
416
|
const gitdir = real(options.binding.gitdir);
|
|
563
417
|
grant(gitdir, false);
|
|
564
|
-
// The shared Git data a commit writes, and nothing Git reads as commands or settings: the shared config (filters,
|
|
565
|
-
// hooks path, fsmonitor), hooks, info (attributes, excludes), other worktrees' data and submodules' stay as they are.
|
|
566
418
|
const data = commitGitData(common);
|
|
567
419
|
for (const path of data.subpaths)
|
|
568
420
|
subpaths.add(path);
|
|
@@ -570,13 +422,12 @@ export function writeAllowlist(options) {
|
|
|
570
422
|
prefixes.set(`${one.path}\0${one.suffix}`, one);
|
|
571
423
|
for (const path of data.readOnly)
|
|
572
424
|
readOnly.add(path);
|
|
573
|
-
// This worktree's own settings file, present (empty) so it is held read-only everywhere, a bind included.
|
|
574
425
|
const own = join(gitdir, "config.worktree");
|
|
575
426
|
try {
|
|
576
427
|
if (!existsSync(own))
|
|
577
428
|
writeFileSync(own, "", { mode: 0o644, flag: "wx" });
|
|
578
429
|
}
|
|
579
|
-
catch {
|
|
430
|
+
catch { }
|
|
580
431
|
readOnly.add(own);
|
|
581
432
|
}
|
|
582
433
|
if (options.launchFolder !== null)
|
|
@@ -599,8 +450,6 @@ export function writeAllowlist(options) {
|
|
|
599
450
|
prefixes.set("gemini", { path: join(home, ".gemini", "projects.json"), suffix: ATOMIC_NAMES });
|
|
600
451
|
}
|
|
601
452
|
else if (Object.hasOwn(ACP_AGENTS, options.provider)) {
|
|
602
|
-
// An ACP agent's configuration stays read-only whole (its MCP servers, hooks, plugins, agents and commands could
|
|
603
|
-
// otherwise be planted for the operator's next session of it); only its known data folders are written (ACP_DATA).
|
|
604
453
|
for (const name of ACP_AGENTS[options.provider].home)
|
|
605
454
|
if (/^\.local\/(share|state)\//.test(name))
|
|
606
455
|
grant(join(home, name));
|
|
@@ -609,13 +458,10 @@ export function writeAllowlist(options) {
|
|
|
609
458
|
}
|
|
610
459
|
return { writes: { subpaths: [...subpaths].sort(), prefixes: [...prefixes.values()].sort((a, b) => a.path.localeCompare(b.path)) }, readOnly: [...readOnly].sort(), deny: [...deny].sort() };
|
|
611
460
|
}
|
|
612
|
-
/** Where a project's builds keep their package caches: one folder per project (one trust domain), never used by the
|
|
613
|
-
* plane's own tools, below the user's cache folder. */
|
|
614
461
|
export function buildCacheFolder(repo, home = homedir(), platform = process.platform, env = process.env) {
|
|
615
462
|
const root = platform === "darwin" ? join(home, "Library", "Caches") : env["XDG_CACHE_HOME"] !== undefined && isAbsolute(env["XDG_CACHE_HOME"]) ? env["XDG_CACHE_HOME"] : join(home, ".cache");
|
|
616
463
|
return join(root, "toolroll-builds", createHash("sha256").update(real(repo)).digest("hex").slice(0, 16));
|
|
617
464
|
}
|
|
618
|
-
/** The environment that points a build's package managers at its project's cache folder, not the user's own. */
|
|
619
465
|
export function buildCacheEnv(folder) {
|
|
620
466
|
const at = (name) => join(folder, name);
|
|
621
467
|
return {
|
|
@@ -626,14 +472,6 @@ export function buildCacheEnv(folder) {
|
|
|
626
472
|
};
|
|
627
473
|
}
|
|
628
474
|
export const NO_GRANTS = { readOnly: [], readable: [], lookup: [] };
|
|
629
|
-
/**
|
|
630
|
-
* The pool deny for one launch. `roots` come from the plane's own records (the pool beside the database, and the one
|
|
631
|
-
* the recorded checkout was made in), never from the checkout. A root that holds this checkout's own Git data (the
|
|
632
|
-
* binding's gitdir or the repository's .git) is never denied whole: it is split around that data instead, entry by
|
|
633
|
-
* entry, so it is denied as far as it can be (fail closed by denying more, never by refusing). A root inside the
|
|
634
|
-
* checkout, the home folder, a folder above it or / is left alone: the first is the build's own work, the others the
|
|
635
|
-
* whole machine.
|
|
636
|
-
*/
|
|
637
475
|
export function checkoutPool(options, list = path => readdirSync(path)) {
|
|
638
476
|
const own = options.worktree === null ? null : real(options.worktree);
|
|
639
477
|
const home = real(options.home ?? homedir());
|
|
@@ -652,7 +490,7 @@ export function checkoutPool(options, list = path => readdirSync(path)) {
|
|
|
652
490
|
}
|
|
653
491
|
if (needed.includes(path))
|
|
654
492
|
return;
|
|
655
|
-
const entries = list(path);
|
|
493
|
+
const entries = list(path);
|
|
656
494
|
for (const entry of entries)
|
|
657
495
|
split(join(path, entry));
|
|
658
496
|
};
|
|
@@ -671,15 +509,10 @@ export function checkoutPool(options, list = path => readdirSync(path)) {
|
|
|
671
509
|
lookup.add(folder);
|
|
672
510
|
return { deny: [...deny].sort(), own: holding.length === 0 ? null : own, lookup: [...lookup].sort(), ...(needed.length === 0 ? {} : { gitPaths: needed }) };
|
|
673
511
|
}
|
|
674
|
-
/** The grants for one build: its task boundary's git rules, the shared dependencies its checkout links, and the
|
|
675
|
-
* checkout pools (`poolRoots`, from the plane's records) denied around its own checkout. */
|
|
676
512
|
export function fenceGrants(options) {
|
|
677
513
|
const readable = [];
|
|
678
514
|
const lookup = [...options.boundary?.lookup ?? []];
|
|
679
515
|
if (options.databaseFile !== null && options.databaseFile !== "" && options.databaseFile !== ":memory:" && options.worktree !== null && options.linked != null) {
|
|
680
|
-
// The link note names the copy as the plane wrote it; the sandbox sees real paths. The note is in the build's own
|
|
681
|
-
// checkout, so it is only a hint: the copy must be a ready one the plane made for this run's project under the
|
|
682
|
-
// setup it stamped on this checkout, or nothing is granted.
|
|
683
516
|
const written = join(dirname(options.databaseFile), DEPS_FOLDER);
|
|
684
517
|
const deps = join(dirname(real(options.databaseFile)), DEPS_FOLDER);
|
|
685
518
|
const key = linkedKey(options.worktree, written) ?? linkedKey(options.worktree, deps);
|
|
@@ -696,7 +529,6 @@ export function fenceGrants(options) {
|
|
|
696
529
|
...(options.boundary?.homeNames === undefined || options.boundary.homeNames.length === 0 ? {} : { homeNames: [...options.boundary.homeNames] }),
|
|
697
530
|
...(pool === undefined || pool.deny.length === 0 ? {} : { pool }) };
|
|
698
531
|
}
|
|
699
|
-
/** The setup a shared copy was installed by (its ready note), or null. */
|
|
700
532
|
function readySetup(deps, key) {
|
|
701
533
|
try {
|
|
702
534
|
const setup = JSON.parse(readFileSync(join(deps, key, "ready.json"), "utf8")).setup;
|
|
@@ -706,11 +538,6 @@ function readySetup(deps, key) {
|
|
|
706
538
|
return null;
|
|
707
539
|
}
|
|
708
540
|
}
|
|
709
|
-
/**
|
|
710
|
-
* Git settings every fenced build runs with (GIT_CONFIG_COUNT, after any the
|
|
711
|
-
* caller already set): `git gc` never expires a reflog, so it never rewrites
|
|
712
|
-
* another task's reflog, which the fence would refuse mid-collection.
|
|
713
|
-
*/
|
|
714
541
|
export function fencedGitEnv(base = process.env) {
|
|
715
542
|
const count = Number.parseInt(base["GIT_CONFIG_COUNT"] ?? "0", 10);
|
|
716
543
|
const start = Number.isInteger(count) && count > 0 ? count : 0;
|
|
@@ -719,10 +546,8 @@ export function fencedGitEnv(base = process.env) {
|
|
|
719
546
|
settings.forEach(([key, value], index) => { env[`GIT_CONFIG_KEY_${start + index}`] = key; env[`GIT_CONFIG_VALUE_${start + index}`] = value; });
|
|
720
547
|
return env;
|
|
721
548
|
}
|
|
722
|
-
/** The repository a git worktree belongs to (its `.git` file names the main repository's git folder). */
|
|
723
549
|
function worktreeGitDir(worktree) {
|
|
724
550
|
try {
|
|
725
|
-
// The candidate's own pointer file: a FIFO or link there is never opened (review 2, finding 6).
|
|
726
551
|
const text = regularText(join(worktree, ".git"));
|
|
727
552
|
const pointer = text === null ? undefined : /^gitdir:\s*(.+)$/m.exec(text)?.[1]?.trim();
|
|
728
553
|
return pointer === undefined ? null : real(isAbsolute(pointer) ? pointer : join(worktree, pointer));
|
|
@@ -732,15 +557,6 @@ function worktreeGitDir(worktree) {
|
|
|
732
557
|
}
|
|
733
558
|
}
|
|
734
559
|
const toml = (value) => `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
735
|
-
/**
|
|
736
|
-
* Codex's own sandbox, fenced. Auto: the `:workspace` profile Codex's
|
|
737
|
-
* `--sandbox workspace-write` already gives (workspace and temp writes, no
|
|
738
|
-
* network). Full access: the same profile widened to write anywhere with
|
|
739
|
-
* network on, instead of no sandbox at all. Either way the fenced paths are
|
|
740
|
-
* denied, which in Codex outranks any write or read grant. The checkout pools
|
|
741
|
-
* are never `flattened` (which leaves what is made after launch readable): see
|
|
742
|
-
* `codexPool`, which denies them around the build's own checkout, written back.
|
|
743
|
-
*/
|
|
744
560
|
export function codexFenceArgv(fence, fullAccess, grants = NO_GRANTS) {
|
|
745
561
|
const access = codexFilesystem(fence, fullAccess, grants);
|
|
746
562
|
const filesystem = [...access].map(([path, mode]) => `${toml(path)}=${toml(mode)}`);
|
|
@@ -748,19 +564,11 @@ export function codexFenceArgv(fence, fullAccess, grants = NO_GRANTS) {
|
|
|
748
564
|
"-c", 'default_permissions="standing-orders"',
|
|
749
565
|
"-c", `permissions.standing-orders.extends=${grants.writes === undefined ? '":workspace"' : '":read-only"'}`,
|
|
750
566
|
"-c", `permissions.standing-orders.filesystem={${filesystem.join(",")}}`,
|
|
751
|
-
// Codex's command sandbox can't route through a proxy: its commands reach the network only when the run's sealed
|
|
752
|
-
// network is open (and Full access asked for it), and are offline otherwise.
|
|
753
567
|
...(codexNetworkOn(fullAccess, grants) ? ["-c", "permissions.standing-orders.network.enabled=true"] : []),
|
|
754
568
|
...(fullAccess ? ["-c", 'approval_policy="never"'] : []),
|
|
755
569
|
];
|
|
756
570
|
}
|
|
757
571
|
const codexNetworkOn = (fullAccess, grants) => fullAccess && (grants.network === undefined || grants.network.mode === "open");
|
|
758
|
-
/**
|
|
759
|
-
* The same permission profile as codexFenceArgv, as the config overrides a Codex app-server thread takes
|
|
760
|
-
* (`thread/start` and `thread/resume` `config`; checked against codex-cli 0.156: the thread reports
|
|
761
|
-
* `activePermissionProfile` standing-orders, and its commands are refused the denied paths). Approval policy is the
|
|
762
|
-
* caller's own (an interactive session asks).
|
|
763
|
-
*/
|
|
764
572
|
export function codexFenceConfig(fence, fullAccess, grants = NO_GRANTS) {
|
|
765
573
|
return {
|
|
766
574
|
default_permissions: "standing-orders",
|
|
@@ -769,29 +577,18 @@ export function codexFenceConfig(fence, fullAccess, grants = NO_GRANTS) {
|
|
|
769
577
|
...(codexNetworkOn(fullAccess, grants) ? { "permissions.standing-orders.network.enabled": true } : {}),
|
|
770
578
|
};
|
|
771
579
|
}
|
|
772
|
-
/** Each path of a Codex permission profile and its access, the strongest last (a deny outranks a grant). */
|
|
773
580
|
function codexFilesystem(fence, fullAccess, grants) {
|
|
774
581
|
const { deny, readOnly } = flattened(fence, grants);
|
|
775
|
-
// Codex's harness reads its own launch files outside the command sandbox.
|
|
776
|
-
// Deny the namespace, including folders created after this policy was built.
|
|
777
582
|
if (grants.runFolders !== undefined) {
|
|
778
583
|
for (const root of runRoots(grants.runFolders)) {
|
|
779
584
|
for (const prefix of RUN_FOLDER_PREFIXES)
|
|
780
585
|
deny.push(join(root, `${prefix}*`), join(root, `${prefix}*`, "**"));
|
|
781
586
|
}
|
|
782
587
|
}
|
|
783
|
-
// Launch folders can already be in the base fence when invoke appends them.
|
|
784
|
-
// TOML forbids duplicate keys, even with identical values. Normalize aliases
|
|
785
|
-
// at this boundary and apply stronger access restrictions last.
|
|
786
588
|
const access = new Map();
|
|
787
589
|
const pool = grants.pool;
|
|
788
|
-
// Codex lets the more specific path win: no read grant inside a pool, but the build's own checkout.
|
|
789
590
|
const pooled = (path) => pool !== undefined && pool.deny.some(one => path === one || inside(path, one))
|
|
790
591
|
&& !(pool.own !== null && (path === pool.own || inside(path, pool.own)));
|
|
791
|
-
// Full access writes anywhere its fence allows, unless the build writes only its workspace (arc 2): then exactly its
|
|
792
|
-
// allowlist, in either mode, beside the workspace Codex's own profile gives.
|
|
793
|
-
// Codex's own workspace profile also writes the shared temp folders; a workspace build starts from its read-only
|
|
794
|
-
// profile instead, with exactly the allowlist (its checkout among it) written back.
|
|
795
592
|
if (grants.writes !== undefined)
|
|
796
593
|
for (const path of grants.writes.subpaths)
|
|
797
594
|
access.set(real(path), "write");
|
|
@@ -806,22 +603,16 @@ function codexFilesystem(fence, fullAccess, grants) {
|
|
|
806
603
|
access.set(path, "read");
|
|
807
604
|
for (const path of held.deny)
|
|
808
605
|
access.set(path, pool.readable === true && !(pool.sealed ?? []).some(one => path === one || inside(path, one)) ? "read" : "deny");
|
|
809
|
-
// A sealed folder (flows' scratch) is denied whole, but on the way to this launch's own folder (Codex can't deny an
|
|
810
|
-
// ancestor and still reach inside it: its other entries are denied one by one, by codexPool, from the same split).
|
|
811
606
|
for (const sealed of pool.sealed ?? [])
|
|
812
607
|
if (!(pool.own !== null && (pool.own === sealed || inside(pool.own, sealed))))
|
|
813
608
|
access.set(sealed, "deny");
|
|
814
609
|
for (const path of held.write)
|
|
815
610
|
access.set(path, "write");
|
|
816
611
|
}
|
|
817
|
-
// What no launch writes (homeWriteDenies): read-only, where Codex writes at all (Full access, or an allowlist).
|
|
818
|
-
// Never inside a denied path: Codex lets the more specific path win, so a read there would bring it back.
|
|
819
612
|
const deniedPaths = deny.filter(one => !one.includes("*")).map(real);
|
|
820
613
|
for (const path of grants.writeDenies ?? []) {
|
|
821
614
|
const leads = resolvedPath(path);
|
|
822
615
|
const denied = (one) => access.get(one) === "deny" || deniedPaths.some(den => one === den || inside(one, den));
|
|
823
|
-
// A name that leads into a denied path (a linked ~/.ssh into a read-denied folder) is denied by its own name too,
|
|
824
|
-
// never read back.
|
|
825
616
|
if (denied(leads)) {
|
|
826
617
|
access.set(path, "deny");
|
|
827
618
|
continue;
|
|
@@ -830,15 +621,11 @@ function codexFilesystem(fence, fullAccess, grants) {
|
|
|
830
621
|
continue;
|
|
831
622
|
access.set(path, "read");
|
|
832
623
|
}
|
|
833
|
-
// Denies are keyed where they resolve; the console's run folder is also denied by its
|
|
834
|
-
// own pathname, so a link there stays unreplaceable, not only its target.
|
|
835
624
|
for (const path of deny) {
|
|
836
625
|
access.set(real(path), "deny");
|
|
837
626
|
if (basename(path) === INSTANCE_DIR)
|
|
838
627
|
access.set(path, "deny");
|
|
839
628
|
}
|
|
840
|
-
// Protected storage: denied by name and real path, and nothing granted inside it (Codex lets the more specific path
|
|
841
|
-
// win, so a grant there would reopen it).
|
|
842
629
|
const storage = grants.protectedStorage ?? [];
|
|
843
630
|
if (storage.length > 0) {
|
|
844
631
|
for (const [path, mode] of [...access])
|
|
@@ -851,12 +638,6 @@ function codexFilesystem(fence, fullAccess, grants) {
|
|
|
851
638
|
}
|
|
852
639
|
return access;
|
|
853
640
|
}
|
|
854
|
-
/**
|
|
855
|
-
* Codex cannot deny an ancestor and still traverse it to the own checkout. Deny existing
|
|
856
|
-
* siblings individually, from the trusted pool roots and a fresh listing, never through
|
|
857
|
-
* flattened or name patterns. A project added after launch is covered on the next launch;
|
|
858
|
-
* Seatbelt and bubblewrap retain the stronger whole-pool rule for later-created projects.
|
|
859
|
-
*/
|
|
860
641
|
export function codexPool(pool, list = path => readdirSync(path)) {
|
|
861
642
|
const deny = new Set();
|
|
862
643
|
const read = new Set(pool.lookup);
|
|
@@ -881,7 +662,6 @@ export function codexPool(pool, list = path => readdirSync(path)) {
|
|
|
881
662
|
deny.add(path);
|
|
882
663
|
return;
|
|
883
664
|
}
|
|
884
|
-
// Only ancestors needed for traversal stay readable, never writable in Full access.
|
|
885
665
|
read.add(path);
|
|
886
666
|
for (const entry of list(path))
|
|
887
667
|
split(join(path, entry));
|
|
@@ -890,20 +670,7 @@ export function codexPool(pool, list = path => readdirSync(path)) {
|
|
|
890
670
|
split(root);
|
|
891
671
|
return { read: [...read].sort(), deny: [...deny].sort(), write: own === null ? [] : [own] };
|
|
892
672
|
}
|
|
893
|
-
/** Secret-looking names denied by pattern inside a folder `flattened` makes read-only, so one written there after
|
|
894
|
-
* launch is denied too (the database and its journals, tokens, login and other text files). */
|
|
895
673
|
export const SPLIT_SECRET_PATTERNS = ["orders.db*", "*token*", "up-login*", "*.txt", "*secret*", "*password*", "*credential*", "*.pem", "*.key"];
|
|
896
|
-
/**
|
|
897
|
-
* A fence as plain denied and read-only paths, for a sandbox that can't
|
|
898
|
-
* grant inside a denied folder (Codex: a deny outranks any grant): a denied
|
|
899
|
-
* folder holding something readable becomes read-only, with each of its
|
|
900
|
-
* entries not on the way to what is readable denied instead. Fails closed: a
|
|
901
|
-
* folder that can't be listed stays denied whole and its grant is dropped.
|
|
902
|
-
* Residual: an entry made after launch in a read-only folder is denied only
|
|
903
|
-
* when its name matches SPLIT_SECRET_PATTERNS; any other new entry there is
|
|
904
|
-
* readable (never writable) until the next launch. The macOS fence has no
|
|
905
|
-
* such gap: it denies the folder and grants back only the readable path.
|
|
906
|
-
*/
|
|
907
674
|
export function flattened(fence, grants = NO_GRANTS, list = path => readdirSync(path)) {
|
|
908
675
|
const deny = [];
|
|
909
676
|
const readOnly = new Set(grants.readOnly);
|
|
@@ -935,28 +702,16 @@ export function flattened(fence, grants = NO_GRANTS, list = path => readdirSync(
|
|
|
935
702
|
};
|
|
936
703
|
for (const path of fence)
|
|
937
704
|
split(path);
|
|
938
|
-
// Fail closed: a grant equal to or inside a denied path is dropped, so no read grant can outrank a deny (Codex lets
|
|
939
|
-
// the more specific path win). Patterns stay as Codex patterns; they can't contain a grant here.
|
|
940
705
|
const denied = deny.filter(path => !path.includes("*"));
|
|
941
706
|
return { deny, readOnly: [...readOnly].filter(path => !denied.some(one => path === one || inside(path, one))) };
|
|
942
707
|
}
|
|
943
|
-
/** Claude's own file tools refuse the fenced paths in every mode (its shell is fenced by the macOS sandbox), and
|
|
944
|
-
* never edit a read-only one. */
|
|
945
708
|
export function claudeFenceSettings(fence, readOnly = []) {
|
|
946
709
|
const rules = [...fence.flatMap(path => [`Read(/${path})`, `Read(/${path}/**)`, `Edit(/${path})`, `Edit(/${path}/**)`]), ...readOnly.flatMap(path => [`Edit(/${path})`, `Edit(/${path}/**)`])];
|
|
947
710
|
return JSON.stringify({ permissions: { deny: rules } });
|
|
948
711
|
}
|
|
949
712
|
const SANDBOX_EXEC = "/usr/bin/sandbox-exec";
|
|
950
|
-
/** A process already inside a Seatbelt sandbox (an agent's, or a flow check zone's) can't apply another: sandbox-exec says so. */
|
|
951
713
|
const NESTED_SANDBOX = /sandbox_apply: Operation not permitted/;
|
|
952
714
|
let seatbeltWorks = null;
|
|
953
|
-
/**
|
|
954
|
-
* Whether this machine can run an agent inside the macOS fence (checked once). Not from inside another
|
|
955
|
-
* sandbox: a Toolroll a fenced process starts (the end-to-end journeys a flow's check zone runs) can't nest
|
|
956
|
-
* its fence, and would otherwise fail every launch. Its agents stay inside the outer fence, which every
|
|
957
|
-
* child inherits, and are recorded with the fence they actually got. Any other probe failure keeps the
|
|
958
|
-
* fence on, so a launch fails loudly rather than running unfenced.
|
|
959
|
-
*/
|
|
960
715
|
export function macosFenceAvailable(platform = process.platform, probe) {
|
|
961
716
|
if (platform !== "darwin" || !existsSync(SANDBOX_EXEC))
|
|
962
717
|
return false;
|
|
@@ -977,8 +732,6 @@ export function macosFenceAvailable(platform = process.platform, probe) {
|
|
|
977
732
|
});
|
|
978
733
|
return seatbeltWorks;
|
|
979
734
|
}
|
|
980
|
-
/** Whether the sandbox runtime can sandbox here on Linux (checked once): bubblewrap, socat, its seccomp helper and
|
|
981
|
-
* ripgrep installed, and unprivileged user namespaces allowed. A machine that can't is no Linux fence at all. */
|
|
982
735
|
let linuxWorks = null;
|
|
983
736
|
export function linuxFenceAvailable(platform = process.platform, probe = () => sandboxRuntimeProblem("linux") === null) {
|
|
984
737
|
if (platform !== "linux")
|
|
@@ -993,19 +746,10 @@ export function linuxFenceAvailable(platform = process.platform, probe = () => s
|
|
|
993
746
|
}
|
|
994
747
|
return linuxWorks;
|
|
995
748
|
}
|
|
996
|
-
/** Thrown when no sandbox can be made for a launch: the spawn road refuses it. */
|
|
997
749
|
export class LinuxFenceUnavailable extends Error {
|
|
998
750
|
}
|
|
999
|
-
/**
|
|
1000
|
-
* The runtime's config for a launch (sandbox-runtime.ts SrtTerms), from its fence: every fenced path denied to read and
|
|
1001
|
-
* write (with the exact paths read again inside them), the pools' other checkouts write-denied (and, under v1, read-
|
|
1002
|
-
* denied) around the build's own, the flows' scratch folders sealed, the launch's writes (its allowlist, or anywhere
|
|
1003
|
-
* outside the denies), its mach services and its network.
|
|
1004
|
-
*/
|
|
1005
751
|
export function srtTermsOf(fence, grants = NO_GRANTS) {
|
|
1006
752
|
const denyRead = new Set(fence.map(real));
|
|
1007
|
-
// A readable grant's own folder is read too: bundlers (esbuild) find node_modules by listing it. The runtime can't
|
|
1008
|
-
// grant a listing without the folder's files, so the shared copy's folder is read whole (its ready note among them).
|
|
1009
753
|
const allowRead = new Set(grants.readable.flatMap(path => grants.exactFiles?.includes(path) === true ? [real(path)] : [real(path), real(dirname(path))]));
|
|
1010
754
|
const denyWrite = new Set([...fence, ...grants.readOnly].map(real));
|
|
1011
755
|
for (const path of grants.writeDenies ?? [])
|
|
@@ -1016,17 +760,11 @@ export function srtTermsOf(fence, grants = NO_GRANTS) {
|
|
|
1016
760
|
}
|
|
1017
761
|
for (const file of grants.signIns?.read ?? [])
|
|
1018
762
|
allowRead.add(file);
|
|
1019
|
-
// Every other launch's private folder unread by pattern (one made after this launch too), this launch's own read
|
|
1020
|
-
// again. Writes are denied to those there at launch, under every root: the runtime can't write back inside a write
|
|
1021
|
-
// deny, so a pattern would take this launch's own folder too (one made after launch is writable under `anywhere`).
|
|
1022
763
|
const folders = grants.runFolders;
|
|
1023
764
|
if (folders !== undefined) {
|
|
1024
765
|
for (const root of runRoots(folders)) {
|
|
1025
766
|
for (const prefix of RUN_FOLDER_PREFIXES)
|
|
1026
767
|
denyRead.add(join(root, `${prefix}*`));
|
|
1027
|
-
// And by name, each there right before the launch (this runs at the spawn): on Linux the runtime gives a pattern
|
|
1028
|
-
// no mask where a path it allows lies beside its matches. Written: only where the launch writes anywhere (under a
|
|
1029
|
-
// write allowlist they are out of its writes already).
|
|
1030
768
|
for (const path of otherRunFolders({ root, own: folders.own })) {
|
|
1031
769
|
denyRead.add(path);
|
|
1032
770
|
if (grants.writes === undefined)
|
|
@@ -1038,15 +776,11 @@ export function srtTermsOf(fence, grants = NO_GRANTS) {
|
|
|
1038
776
|
}
|
|
1039
777
|
const pool = grants.pool;
|
|
1040
778
|
if (pool !== undefined) {
|
|
1041
|
-
// Under v1 the pools are unread too, the build's own checkout read again; under v2 they are read (owner Q-C).
|
|
1042
779
|
if (pool.readable !== true)
|
|
1043
780
|
for (const root of pool.deny)
|
|
1044
781
|
denyRead.add(root);
|
|
1045
|
-
// The build's own checkout is read again inside whatever is denied around it (the pools, a flow's sealed scratch).
|
|
1046
782
|
if (pool.own !== null)
|
|
1047
783
|
allowRead.add(pool.own);
|
|
1048
|
-
// Never written but the build's own checkout: the runtime can't write back inside a write deny, so each other
|
|
1049
|
-
// entry on the way is denied instead (codexPool's split, as Codex takes it).
|
|
1050
784
|
for (const path of codexPool(pool).deny)
|
|
1051
785
|
denyWrite.add(path);
|
|
1052
786
|
for (const sealed of pool.sealed ?? []) {
|
|
@@ -1055,7 +789,6 @@ export function srtTermsOf(fence, grants = NO_GRANTS) {
|
|
|
1055
789
|
denyWrite.add(sealed);
|
|
1056
790
|
}
|
|
1057
791
|
}
|
|
1058
|
-
// Protected storage last: denied to read and write by name and real path, and no read grant inside it survives.
|
|
1059
792
|
const storage = grants.protectedStorage ?? [];
|
|
1060
793
|
const isProtected = (path) => storage.some(one => path === one || inside(path, one) || real(path) === one || inside(real(path), one));
|
|
1061
794
|
for (const path of storage) {
|
|
@@ -1067,11 +800,7 @@ export function srtTermsOf(fence, grants = NO_GRANTS) {
|
|
|
1067
800
|
allowRead.delete(path);
|
|
1068
801
|
const readConfig = { denyOnly: [...denyRead].sort(), allowWithinDeny: [...allowRead].sort() };
|
|
1069
802
|
const writes = grants.writes;
|
|
1070
|
-
// A sign-ins check also writes Codex's session and log folders and its own Claude transcripts (never inside a
|
|
1071
|
-
// write deny: under policy v1 the home configuration stays unwritten whole).
|
|
1072
803
|
const signInWrites = [...grants.signIns?.writes ?? [], ...(grants.signIns?.transcripts ?? []).map(folder => join(folder, "*.jsonl"))];
|
|
1073
|
-
// Writing anywhere: everything but the denies. The launch's own checkout and folder are named too, so a backend that
|
|
1074
|
-
// binds a read deny's re-allowed paths back (bubblewrap) binds those back writable.
|
|
1075
804
|
const allowOnly = writes === undefined ? ["/", ...(pool?.own == null ? [] : [real(pool.own)]), ...(folders?.own == null ? [] : [folders.own])]
|
|
1076
805
|
: [...writes.subpaths, ...writes.prefixes.map(one => `${one.path}*`), ...signInWrites, ...getDefaultWritePaths({ denyRead: readConfig.denyOnly, allowRead: readConfig.allowWithinDeny })];
|
|
1077
806
|
const network = grants.network;
|
|
@@ -1087,15 +816,9 @@ export function srtTermsOf(fence, grants = NO_GRANTS) {
|
|
|
1087
816
|
},
|
|
1088
817
|
};
|
|
1089
818
|
}
|
|
1090
|
-
/** The spawn that runs `file args` from `cwd` inside the sandbox runtime's sandbox (sandbox-runtime.ts srtSpawn), and the
|
|
1091
|
-
* environment it needs beside the caller's. */
|
|
1092
819
|
export function sandboxedSpawn(file, args, fence, grants = NO_GRANTS, cwd, temp) {
|
|
1093
820
|
return srtSpawn(file, args, srtTermsOf(fence, grants), cwd ?? process.cwd(), temp);
|
|
1094
821
|
}
|
|
1095
|
-
/**
|
|
1096
|
-
* What each agent's fence gives it, by permission mode: the one table "What an agent can reach" in
|
|
1097
|
-
* docs/guide/security.md shows (fenceSummaryMarkdown; a test holds them equal).
|
|
1098
|
-
*/
|
|
1099
822
|
export const FENCE_SUMMARY = [
|
|
1100
823
|
{
|
|
1101
824
|
agent: "**Claude, Gemini, ACP agents**",
|
|
@@ -1108,40 +831,22 @@ export const FENCE_SUMMARY = [
|
|
|
1108
831
|
full: "the same reads and writes, with the fence; its commands reach the network only when the project's network is open",
|
|
1109
832
|
},
|
|
1110
833
|
];
|
|
1111
|
-
/** FENCE_SUMMARY as the security guide's markdown table. */
|
|
1112
834
|
export function fenceSummaryMarkdown() {
|
|
1113
835
|
return ["| | Auto | Full access |", "|---|---|---|", ...FENCE_SUMMARY.map(row => `| ${row.agent} | ${row.auto} | ${row.full} |`)].join("\n");
|
|
1114
836
|
}
|
|
1115
|
-
/** The sign-in files a `sign-ins` check reads, by fixed name under the person's home (never from the environment, so no
|
|
1116
|
-
* caller's CLAUDE_CONFIG_DIR or GH_CONFIG_DIR points a grant at .ssh): Claude's account and settings (and, on Linux,
|
|
1117
|
-
* its credentials file; on a Mac they are in the keychain), gh's hosts and config, and Codex's config and sign-in. */
|
|
1118
837
|
const SIGN_IN_FILES = (platform) => [
|
|
1119
838
|
".claude.json", join(".claude", "settings.json"), ...(platform === "linux" ? [join(".claude", ".credentials.json")] : []),
|
|
1120
839
|
join(".config", "gh", "hosts.yml"), join(".config", "gh", "config.yml"), join(".codex", "config.toml"), join(".codex", "auth.json"),
|
|
1121
840
|
];
|
|
1122
|
-
/**
|
|
1123
|
-
* A `sign-ins` check's grants (sandbox parity C10, srt-style): each sign-in file by its name, read by the check itself
|
|
1124
|
-
* through its sandbox. Nothing privileged reads or copies one: the sandbox resolves the name in its own view, so a link
|
|
1125
|
-
* planted there into Toolroll's state leads to a denied path (Seatbelt checks the resolved file; bubblewrap resolves
|
|
1126
|
-
* inside its mount namespace, where the state is masked). On a Mac, the checkout's own Claude transcript folder (made
|
|
1127
|
-
* when absent, only as the real folder it is), whose session files alone are written; and Codex's session and log
|
|
1128
|
-
* folders (when ~/.codex is there), never its config.
|
|
1129
|
-
*/
|
|
1130
841
|
export function signInGrants(home, checkout, platform = process.platform) {
|
|
1131
842
|
const base = real(home);
|
|
1132
|
-
// Read by name, but only a name that is itself now: every folder from the home folder down a real one, the file a
|
|
1133
|
-
// regular file with one name (never a link, never a hard link to something else). The sandbox resolves it again.
|
|
1134
843
|
const read = SIGN_IN_FILES(platform).map(name => join(base, name)).filter(path => signInIsItself(base, path));
|
|
1135
844
|
const transcript = claudeProjectFolder(base, real(checkout));
|
|
1136
|
-
// A transcript folder Claude would name by prefix (a very long checkout path) isn't granted: never a prefix of others.
|
|
1137
845
|
const folder = transcript.byPrefix || !existsSync(join(base, ".claude")) ? null : grantFolder(transcript.path);
|
|
1138
846
|
const codex = join(base, ".codex");
|
|
1139
847
|
const writes = grantFolder(codex, false) === null ? [] : ["sessions", "log"].map(name => grantFolder(join(codex, name))).filter((path) => path !== null);
|
|
1140
848
|
return { read, transcripts: folder === null || platform !== "darwin" ? [] : [folder], writes, mach: platform === "darwin" ? ["com.apple.trustd.agent"] : [] };
|
|
1141
849
|
}
|
|
1142
|
-
/** Whether a sign-in file is itself, now: every folder from the (real) home folder down a real folder, the file a
|
|
1143
|
-
* regular file with one name (never a link, never a hard link to something else). Checked when granted and again right
|
|
1144
|
-
* before the launch (invoke.ts); the sandbox resolves the name a third time. */
|
|
1145
850
|
export function signInIsItself(base, path) {
|
|
1146
851
|
let at = base;
|
|
1147
852
|
const parts = relative(base, path).split(sep);
|
|
@@ -1162,48 +867,32 @@ export function signInIsItself(base, path) {
|
|
|
1162
867
|
}
|
|
1163
868
|
export const FENCE_POLICY_CURRENT = 2;
|
|
1164
869
|
export const LEGACY_SANDBOX = { policy: 1, readDeny: [], machLookup: [] };
|
|
1165
|
-
/** A build's sandbox terms, exactly as its approval sealed them: an approval from before 0.9.70 is policy v1 (the home
|
|
1166
|
-
* configuration denied) with nothing listed. */
|
|
1167
870
|
export function launchSandboxOf(profile) {
|
|
1168
871
|
return { policy: profile.fencePolicy ?? 1, readDeny: profile.readDeny ?? [], machLookup: profile.machLookup ?? [] };
|
|
1169
872
|
}
|
|
1170
|
-
/** The one place a launch's fence is made (docs/plans/sandbox-parity.md C1): its denies, its grants, and
|
|
1171
|
-
* `confinement: "required"`, so the spawn road refuses it where no OS fence applies rather than running it bare. */
|
|
1172
873
|
export function fenceFor(kind, ctx) {
|
|
1173
874
|
const home = ctx.home === undefined ? {} : { home: ctx.home };
|
|
1174
|
-
// The project's read denies join the fence by name, there or not (the runtime denies a path that isn't there yet).
|
|
1175
|
-
// Protected storage, resolved once for this launch, from the plane's own environment (protected-storage.ts).
|
|
1176
875
|
const storage = ctx.storage?.denies ?? protectedStorageDenies(ctx.home ?? homedir());
|
|
1177
876
|
const fence = agentFence({ databaseFile: ctx.databaseFile, worktree: ctx.worktree, ...home, boundary: ctx.boundary, binding: ctx.binding, runFolders: ctx.runFolders, extra: [...ctx.extra ?? [], ...ctx.readDeny ?? []], protectedStorage: storage });
|
|
1178
877
|
const found = fenceGrants({ databaseFile: ctx.databaseFile, worktree: ctx.worktree, boundary: ctx.boundary, runFolders: ctx.runFolders, linked: ctx.linked ?? null, binding: ctx.binding, ...home, poolRoots: ctx.poolRoots });
|
|
1179
|
-
// Toolroll's own install, the sandbox runtime's package and the Node running them, never written by anything it
|
|
1180
|
-
// launches: rewriting the code that fences a build would switch the fence off.
|
|
1181
878
|
const made = { ...found, readOnly: [...new Set([...found.readOnly, ...toolrollInstall(ctx.worktree, ctx.home ?? homedir(), ctx.binding?.main ?? null)])].sort() };
|
|
1182
879
|
const written = ctx.writes ?? null;
|
|
1183
880
|
const exact = ctx.exactFile ?? null;
|
|
1184
881
|
const grants = {
|
|
1185
882
|
...made,
|
|
1186
883
|
...(written === null ? {} : { writes: written.writes, readOnly: [...new Set([...made.readOnly, ...written.readOnly])].sort() }),
|
|
1187
|
-
// One exact file, granted as the shared dependencies are, and never written (Claude's Edit rules read `readOnly`).
|
|
1188
884
|
...(exact === null ? {} : { readable: [...made.readable, exact], exactFiles: [exact], readOnly: [...new Set([...made.readOnly, ...(written?.readOnly ?? []), exact])].sort() }),
|
|
1189
885
|
...(ctx.network === undefined ? {} : { network: ctx.network }),
|
|
1190
886
|
...(ctx.machLookup === undefined || ctx.machLookup.length === 0 ? {} : { machLookup: [...ctx.machLookup] }),
|
|
1191
|
-
// A project's checks may drive a browser (Playwright's Chromium), and so may a flow's script zone whose browser use
|
|
1192
|
-
// a person approved (the caller proves it at launch); builds, tool servers and every other flow launch don't get it.
|
|
1193
887
|
...(kind === "check" || (kind === "flow" && ctx.browser === true) ? { browser: true } : {}),
|
|
1194
|
-
// A build's agent signs in from the keychain (Claude Code does); nothing else it launches reaches it.
|
|
1195
888
|
...(kind === "build" ? { keychain: true } : {}),
|
|
1196
|
-
// Under a write allowlist these are out of reach already; where the launch writes anywhere, they are denied by name.
|
|
1197
889
|
writeDenies: homeWriteDenies(ctx.home ?? homedir(), ctx.binding, ctx.provider ?? null),
|
|
1198
890
|
protectedStorage: storage,
|
|
1199
891
|
...(made.pool === undefined ? {} : { pool: { ...made.pool, ...(ctx.policy === 2 ? { readable: true } : {}),
|
|
1200
|
-
// Flows' scratch folders in the pool (and any the caller names) stay denied whole, at every policy version.
|
|
1201
892
|
sealed: sealedScratch(ctx.poolRoots, ctx.scratchRoots ?? []) } }),
|
|
1202
893
|
};
|
|
1203
894
|
return { kind, fence, fenceGrants: grants, confinement: "required" };
|
|
1204
895
|
}
|
|
1205
|
-
/** The flows' scratch folders inside the checkout pools (`flow-checks` beside the checkouts) and any a caller names,
|
|
1206
|
-
* each denied by name whether or not it is there yet, and where it is a link, where it leads too. */
|
|
1207
896
|
export function sealedScratch(poolRoots, named) {
|
|
1208
897
|
const out = new Set();
|
|
1209
898
|
for (const path of [...poolRoots.filter((root) => root !== null).map(root => join(real(root), "flow-checks")), ...named.map(one => join(real(dirname(one)), basename(one)))]) {
|
|
@@ -1212,18 +901,10 @@ export function sealedScratch(poolRoots, named) {
|
|
|
1212
901
|
if (lstatSync(path).isSymbolicLink())
|
|
1213
902
|
out.add(realpathSync(path));
|
|
1214
903
|
}
|
|
1215
|
-
catch {
|
|
904
|
+
catch { }
|
|
1216
905
|
}
|
|
1217
906
|
return [...out].sort();
|
|
1218
907
|
}
|
|
1219
|
-
/**
|
|
1220
|
-
* Toolroll's own install as no launch may write it: this package's folder (its compiled code, the sandbox launch
|
|
1221
|
-
* helper among it), the sandbox runtime's package wherever it was installed, and the Node running them with the
|
|
1222
|
-
* folder it lives in (its npm and global packages beside it), as the real folders they are. Never a folder that holds
|
|
1223
|
-
* the launch's own checkout or its repository (a build of Toolroll's own source, run from it: that repository's other
|
|
1224
|
-
* files are the primary checkout's, write-denied already), the home folder or one above it, and nothing the user
|
|
1225
|
-
* doesn't own (root's folders are out of a build's reach already).
|
|
1226
|
-
*/
|
|
1227
908
|
export function toolrollInstall(worktree, home, repository = null) {
|
|
1228
909
|
const own = worktree === null ? null : real(worktree);
|
|
1229
910
|
const repo = repository === null ? null : real(repository);
|
|
@@ -1246,37 +927,21 @@ export function toolrollInstall(worktree, home, repository = null) {
|
|
|
1246
927
|
return [...new Set(candidates)].filter(path => path !== dirname(path) && path !== homeReal && !inside(homeReal, path)
|
|
1247
928
|
&& !(own !== null && (own === path || inside(own, path))) && !(repo !== null && (repo === path || inside(repo, path))) && ours(path)).sort();
|
|
1248
929
|
}
|
|
1249
|
-
/** Names that run code or reconfigure tools for whoever opens the project next: the sandbox runtime's DANGEROUS_FILES
|
|
1250
|
-
* (@anthropic-ai/sandbox-runtime sandbox-utils), and the names its mandatory denies can't hold when they are made
|
|
1251
|
-
* after a launch starts (`.envrc`, package-manager and Claude settings). */
|
|
1252
930
|
export const PROTECTED_FILES = [".gitconfig", ".gitmodules", ".bashrc", ".bash_profile", ".zshrc", ".zprofile", ".profile", ".ripgreprc", ".mcp.json",
|
|
1253
931
|
".envrc", ".npmrc", ".yarnrc", ".yarnrc.yml", ".claude/settings.json", ".claude/settings.local.json", ".git/config"];
|
|
1254
|
-
/** Folders protected whole, wherever they are (the runtime's dangerous directories, with Git's hooks). */
|
|
1255
932
|
export const PROTECTED_DIRS = [".vscode", ".idea", ".claude/commands", ".claude/agents", ".git/hooks"];
|
|
1256
|
-
/**
|
|
1257
|
-
* The handoff's backstop (builder.ts commit): the changed paths (relative, from Git) that are protected names at any
|
|
1258
|
-
* depth, in any case. The sandbox runtime denies these when a launch starts; one made after it started (a new nested
|
|
1259
|
-
* folder's `.envrc`, say) gets through the sandbox, and a result that holds it is refused.
|
|
1260
|
-
*/
|
|
1261
933
|
export function protectedChanges(changed) {
|
|
1262
934
|
const files = PROTECTED_FILES.map(one => one.toLowerCase());
|
|
1263
935
|
return changed.filter(path => {
|
|
1264
936
|
const lower = `/${path.toLowerCase()}`;
|
|
1265
|
-
// A protected folder's own name too (a link committed as `pkg/.vscode`), not only what is in it.
|
|
1266
937
|
return files.some(name => lower.endsWith(`/${name}`)) || PROTECTED_DIRS.some(dir => lower.includes(`/${dir.toLowerCase()}/`) || lower.endsWith(`/${dir.toLowerCase()}`));
|
|
1267
938
|
});
|
|
1268
939
|
}
|
|
1269
|
-
/**
|
|
1270
|
-
* The handoff's backstop for links (builder.ts commit): a staged symbolic link (Git mode 120000) whose path is a
|
|
1271
|
-
* protected name or a folder on the way to one (`pkg/.claude`, `.vscode`, `lib/.git`), at any depth, in any case. A
|
|
1272
|
-
* link there would lead whoever opens the project to settings, hooks or commands kept anywhere.
|
|
1273
|
-
*/
|
|
1274
940
|
export function protectedLinks(links) {
|
|
1275
941
|
const entries = [...PROTECTED_FILES, ...PROTECTED_DIRS].map(one => one.toLowerCase().split("/"));
|
|
1276
942
|
return links.filter(path => {
|
|
1277
943
|
const parts = path.toLowerCase().split("/").filter(one => one !== "");
|
|
1278
944
|
return entries.some(entry => {
|
|
1279
|
-
// The link's last parts are the entry's first ones (the whole entry, or a folder on the way to it).
|
|
1280
945
|
for (let take = 1; take <= Math.min(entry.length, parts.length); take++) {
|
|
1281
946
|
if (parts.slice(parts.length - take).join("/") === entry.slice(0, take).join("/"))
|
|
1282
947
|
return true;
|
|
@@ -1285,18 +950,10 @@ export function protectedLinks(links) {
|
|
|
1285
950
|
});
|
|
1286
951
|
});
|
|
1287
952
|
}
|
|
1288
|
-
/** The home folder's own persistence points beyond the protected names (login items, systemd user units and autostart,
|
|
1289
|
-
* Git's, gh's, pip's and fish's configuration, the shells' other startup files, SSH and GnuPG, and the folders on a
|
|
1290
|
-
* login PATH). Under `.config/` each also stands under $XDG_CONFIG_HOME. */
|
|
1291
953
|
export const HOME_PERSISTENCE = ["Library/LaunchAgents", ".config/systemd/user", ".config/autostart", ".config/git", ".config/gh", ".config/pip",
|
|
1292
954
|
".config/fish", ".pip", ".zshenv", ".zlogin", ".bash_login", ".ssh", ".gnupg", ".local/bin", "bin"];
|
|
1293
|
-
/** The sign-in folders and files at home no launch writes, but an agent its own exact sign-in files (OWN_SIGN_INS). */
|
|
1294
955
|
const HOME_SIGN_INS = [".codex", ".claude.json", ".claude/.credentials.json"];
|
|
1295
|
-
/** The exact sign-in files an agent's own launch still writes (Claude's account and credentials). Codex's harness
|
|
1296
|
-
* refreshes its sign-in outside the sandbox, so its commands write none. Configuration and persistence names stay
|
|
1297
|
-
* denied for every agent. */
|
|
1298
956
|
const OWN_SIGN_INS = { claude: [".claude.json", ".claude/.credentials.json"] };
|
|
1299
|
-
/** `path` as it resolves now: through every link above it (and at it), however much of it exists. */
|
|
1300
957
|
function resolvedPath(path) {
|
|
1301
958
|
let head = path;
|
|
1302
959
|
const rest = [];
|
|
@@ -1311,16 +968,6 @@ function resolvedPath(path) {
|
|
|
1311
968
|
}
|
|
1312
969
|
return path;
|
|
1313
970
|
}
|
|
1314
|
-
/**
|
|
1315
|
-
* What no launch writes, whatever its writes, as static write denies for the sandbox runtime (whose own protected names
|
|
1316
|
-
* are anchored at the launch's folder only) and Codex's profile: the home folder's protected names (shell profiles, Git
|
|
1317
|
-
* and tool configuration), its persistence points and sign-ins (but the launch's own agent's exact sign-in files), and
|
|
1318
|
-
* the bound repository's own Git config, hooks and submodules (a linked worktree reaches them through its `.git`
|
|
1319
|
-
* file). Each by its name and by where it leads now (a linked ~/.config or LaunchAgents is denied at both ends). On
|
|
1320
|
-
* Linux only those there at launch: the runtime holds an absent name with a stand-in nothing can read for the launch's
|
|
1321
|
-
* length, and the person's own git and shells then fail on their ~/.gitconfig and ~/.bashrc (measured). Under a write
|
|
1322
|
-
* allowlist an absent one is out of reach anyway; under `anywhere` it can be made (an accepted limit).
|
|
1323
|
-
*/
|
|
1324
971
|
export function homeWriteDenies(home, binding, provider, platform = process.platform, env = process.env) {
|
|
1325
972
|
const base = real(home);
|
|
1326
973
|
const own = new Set(OWN_SIGN_INS[provider ?? ""] ?? []);
|
|
@@ -1332,9 +979,6 @@ export function homeWriteDenies(home, binding, provider, platform = process.plat
|
|
|
1332
979
|
const git = binding === null ? [] : ["config", "hooks", "modules"].map(name => join(real(join(binding.main, ".git")), name));
|
|
1333
980
|
return [...new Set([...paths, ...git].flatMap(path => [path, resolvedPath(path)]))].sort();
|
|
1334
981
|
}
|
|
1335
|
-
/** A tool server's grants from its build's: never the agent's network or write allowlist (a server keeps its own state
|
|
1336
|
-
* where it always has), and never the build's own checkout or launch folder read back (nothing a build wrote loads in a
|
|
1337
|
-
* process that holds a tool's secrets). */
|
|
1338
982
|
export function serverGrantsOf(grants) {
|
|
1339
983
|
const { network: _agentOnly, writes: _agentWrites, keychain: _agentKeychain, browser: _checkOnly, ...rest } = grants;
|
|
1340
984
|
return {
|