toolroll 0.9.104 → 0.9.105
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +62 -5
- package/README.md +18 -20
- package/dist/accent-colors.js +0 -29
- package/dist/acp-agents.js +0 -3
- package/dist/acp-attest.js +0 -30
- package/dist/acp-check.js +3 -70
- package/dist/acp-client.js +3 -94
- package/dist/acp-inspect.js +1 -20
- package/dist/action-ledger.js +0 -8
- package/dist/activity-line.js +0 -14
- package/dist/actor.js +0 -15
- package/dist/advanced-schema.js +12 -0
- package/dist/advanced-view.js +26 -0
- package/dist/advanced.js +61 -0
- package/dist/agent-board.js +0 -117
- package/dist/agent-fence.js +11 -367
- package/dist/agent-onboard.js +12 -50
- package/dist/agent-pulse.js +5 -38
- package/dist/agent-state-words.js +0 -8
- package/dist/agent-state.js +1 -45
- package/dist/agent-turns.js +3 -17
- package/dist/agentconfig.js +1 -99
- package/dist/agents-board.js +0 -60
- package/dist/agents-live.js +1 -8
- package/dist/api-tokens.js +0 -27
- package/dist/approval-authority.js +0 -59
- package/dist/approval-password.js +0 -10
- package/dist/approval-policy.js +0 -29
- package/dist/approval-rules-ui.js +0 -9
- package/dist/assignment-adapters.js +0 -14
- package/dist/assignment-brief.js +1 -17
- package/dist/assignment-delivery.js +0 -22
- package/dist/assignment-presentation.js +0 -14
- package/dist/assignment-status.js +1 -30
- package/dist/assignment-ui.js +0 -12
- package/dist/assignment.js +17 -139
- package/dist/attest.js +0 -38
- package/dist/audit-cli.js +0 -9
- package/dist/backend.js +0 -59
- package/dist/backup-ui.js +0 -12
- package/dist/backup.js +8 -61
- package/dist/batch-checks.js +0 -20
- package/dist/batch-policy.js +0 -4
- package/dist/beads.js +0 -48
- package/dist/bin.js +0 -8
- package/dist/board.js +1 -36
- package/dist/boot-identity.js +0 -42
- package/dist/bounded-spawn.js +4 -28
- package/dist/brand-mark.js +0 -21
- package/dist/brief-fence.js +0 -16
- package/dist/browser/terminal.css +1 -1
- package/dist/browser/terminal.js +16 -16
- package/dist/browser/workspace.css +2 -2
- package/dist/browser/workspace.js +26 -26
- package/dist/browser-crew.js +0 -8
- package/dist/browser-shell.js +2 -15
- package/dist/browser-workspace.js +6 -30
- package/dist/budget-alerts.js +1 -4
- package/dist/build-review.js +2 -50
- package/dist/builder-restart.js +0 -13
- package/dist/builder.js +21 -1035
- package/dist/canonical-json.js +0 -12
- package/dist/capscan.js +1 -32
- package/dist/card-catalog.js +0 -12
- package/dist/card-cli.js +0 -1
- package/dist/card-render.js +0 -25
- package/dist/card-sources.js +0 -10
- package/dist/chat-acceptance.js +0 -7
- package/dist/chat-actions.js +5 -190
- package/dist/chat-admission.js +0 -7
- package/dist/chat-approval.js +0 -25
- package/dist/chat-ask.js +0 -17
- package/dist/chat-card-part.js +0 -3
- package/dist/chat-card.js +0 -6
- package/dist/chat-channel.js +2 -83
- package/dist/chat-continuity.js +0 -31
- package/dist/chat-controls.js +0 -7
- package/dist/chat-core.js +0 -55
- package/dist/chat-decide.js +2 -153
- package/dist/chat-delivery-state.js +0 -49
- package/dist/chat-delivery.js +2 -143
- package/dist/chat-display.js +0 -2
- package/dist/chat-evidence.js +0 -65
- package/dist/chat-flow.js +0 -72
- package/dist/chat-follow.js +0 -13
- package/dist/chat-inbox.js +0 -34
- package/dist/chat-live-schema.js +0 -14
- package/dist/chat-live.js +2 -87
- package/dist/chat-message-states.js +13 -40
- package/dist/chat-messages.js +0 -153
- package/dist/chat-migration.js +0 -57
- package/dist/chat-polish.js +0 -7
- package/dist/chat-quiet.js +0 -37
- package/dist/chat-review.js +0 -4
- package/dist/chat-rooms.js +0 -22
- package/dist/chat-settings-page.js +0 -4
- package/dist/chat-task-actions.js +0 -7
- package/dist/chat-terms.js +0 -21
- package/dist/chat-voice.js +0 -38
- package/dist/chat-warmth.js +1 -3
- package/dist/check-access.js +0 -30
- package/dist/check-facts.js +2 -62
- package/dist/check-failure.js +0 -98
- package/dist/check-levels-ui.js +4 -10
- package/dist/check-levels.js +3 -35
- package/dist/check-load.js +1 -49
- package/dist/check-only-standing.js +0 -6
- package/dist/check-only.js +0 -22
- package/dist/check-progress.js +0 -32
- package/dist/check-repair.js +2 -35
- package/dist/check-report.js +1 -108
- package/dist/check-stamp.js +0 -20
- package/dist/checkout-cleanup.js +0 -84
- package/dist/checkout-proof.js +1 -13
- package/dist/child-database.js +0 -3
- package/dist/claim.js +4 -508
- package/dist/claude-print.js +0 -10
- package/dist/cli-fast.js +0 -8
- package/dist/cli-help.js +90 -78
- package/dist/cli-http.js +0 -10
- package/dist/cli.js +26 -241
- package/dist/code-extract.js +0 -6
- package/dist/code-map-acts.js +0 -7
- package/dist/code-map-admission.js +2 -26
- package/dist/code-map-build.js +3 -24
- package/dist/code-map-cli.js +0 -4
- package/dist/code-map-main.js +0 -6
- package/dist/code-map-read.js +0 -12
- package/dist/code-map-report.js +0 -9
- package/dist/code-map-shape.js +0 -19
- package/dist/code-map-store.js +0 -26
- package/dist/codex-limits.js +1 -17
- package/dist/coding-context.js +0 -10
- package/dist/coding-handoff.js +0 -14
- package/dist/coding-provider.js +0 -39
- package/dist/coding-shipping-ui.js +0 -1
- package/dist/coding-ui.js +0 -1
- package/dist/coding-update.js +1 -18
- package/dist/coding-workspace.js +0 -27
- package/dist/commit-extract.js +0 -83
- package/dist/connect-cli.js +0 -19
- package/dist/console-chrome.js +1 -34
- package/dist/console-instance.js +2 -91
- package/dist/container-state.js +0 -4
- package/dist/containment.js +2 -105
- package/dist/contract-changes.js +0 -6
- package/dist/contracts/acceptance-terms.js +0 -7
- package/dist/contracts/chat-actions.js +0 -46
- package/dist/contracts/chat-callback-rows.js +0 -8
- package/dist/contracts/chat-card.js +0 -14
- package/dist/contracts/chat-content.js +0 -55
- package/dist/contracts/chat-tables.js +0 -7
- package/dist/contracts/cli.js +0 -59
- package/dist/contracts/coding-activity.js +0 -15
- package/dist/contracts/coding-context.js +0 -15
- package/dist/contracts/coding-handoff.js +0 -11
- package/dist/contracts/coding-workspace.js +0 -14
- package/dist/contracts/console-api.js +1 -54
- package/dist/contracts/contract-test.js +0 -14
- package/dist/contracts/contract.js +0 -48
- package/dist/contracts/decision.js +0 -20
- package/dist/contracts/diff-stat.js +0 -16
- package/dist/contracts/discord-callback.js +0 -9
- package/dist/contracts/flow-card.js +0 -18
- package/dist/contracts/flow-propose.js +0 -8
- package/dist/contracts/flow-send.js +0 -31
- package/dist/contracts/flow.js +0 -112
- package/dist/contracts/gateway-tools.js +0 -22
- package/dist/contracts/handoff.js +0 -22
- package/dist/contracts/integration-metadata.js +0 -39
- package/dist/contracts/lead-context.js +0 -14
- package/dist/contracts/lead-tools.js +0 -49
- package/dist/contracts/mcp-oauth.js +0 -12
- package/dist/contracts/memory-pass.js +0 -21
- package/dist/contracts/model-catalog.js +0 -9
- package/dist/contracts/observation-request.js +0 -11
- package/dist/contracts/plan.js +0 -16
- package/dist/contracts/project-knowledge.js +0 -26
- package/dist/contracts/project-memory.js +0 -16
- package/dist/contracts/project-skills.js +0 -31
- package/dist/contracts/proof.js +0 -23
- package/dist/contracts/provider.js +0 -9
- package/dist/contracts/recipes.js +0 -16
- package/dist/contracts/release-check.js +0 -61
- package/dist/contracts/release-terms.js +0 -27
- package/dist/contracts/retention.js +0 -12
- package/dist/contracts/review-findings.js +0 -13
- package/dist/contracts/route-results.js +0 -15
- package/dist/contracts/route.js +0 -33
- package/dist/contracts/scope.js +0 -29
- package/dist/contracts/scout-report.js +0 -34
- package/dist/contracts/slack-callback.js +0 -11
- package/dist/contracts/sort-answer.js +0 -24
- package/dist/contracts/stage-output.js +0 -46
- package/dist/contracts/storage.js +0 -8
- package/dist/contracts/store-json.js +0 -41
- package/dist/contracts/subagent-turn.js +0 -23
- package/dist/contracts/task-sizing.js +0 -10
- package/dist/contracts/teams-callback.js +0 -7
- package/dist/contracts/telegram-callback.js +0 -27
- package/dist/contracts/trigger-payloads.js +0 -41
- package/dist/contracts/update-journal.js +0 -47
- package/dist/contracts/verification-receipt.js +0 -36
- package/dist/contracts/verification-view.js +0 -15
- package/dist/contracts/youiyoux-request.js +0 -26
- package/dist/control-setup.js +0 -7
- package/dist/control-ui.js +0 -3
- package/dist/controller-service.js +0 -4
- package/dist/controller-supervisor.js +0 -15
- package/dist/converse.js +3 -129
- package/dist/coordinator-proposals.js +1 -6
- package/dist/coordinator.js +0 -65
- package/dist/credentials-ui.js +0 -6
- package/dist/daemon.js +0 -137
- package/dist/database-reclaim.js +0 -3
- package/dist/decision.js +0 -78
- package/dist/demo-chat.js +4 -15
- package/dist/demo-sign-in.js +77 -0
- package/dist/demo.js +5 -194
- package/dist/deploy-gate.js +0 -20
- package/dist/deploy-lock.js +0 -4
- package/dist/deploy-phase.js +0 -22
- package/dist/deploy-rescue.js +0 -21
- package/dist/deprecations.js +0 -12
- package/dist/design/kit.css +9 -6
- package/dist/design/kit.js +2 -33
- package/dist/desktop-access.js +0 -9
- package/dist/desktop-bundle.js +1 -3
- package/dist/desktop-host.js +0 -34
- package/dist/desktop-update-gate.js +0 -8
- package/dist/desktop-update-recovery.js +1 -18
- package/dist/desktop-update.js +2 -48
- package/dist/digest-times.js +0 -2
- package/dist/disclosure.js +0 -5
- package/dist/discord-api.js +0 -6
- package/dist/discord-chat.js +0 -31
- package/dist/discord.js +0 -7
- package/dist/discover.js +0 -50
- package/dist/dispatch.js +61 -60
- package/dist/dispose.js +0 -208
- package/dist/doctor.js +0 -48
- package/dist/easy-start-args.js +7 -7
- package/dist/easy-start.js +32 -45
- package/dist/egress.js +1 -63
- package/dist/email-settings.js +0 -8
- package/dist/envelope.js +50 -86
- package/dist/eval-gate.js +1 -37
- package/dist/eval-hooks.js +0 -120
- package/dist/eval-oracle-main.js +0 -7
- package/dist/eval-oracle.js +3 -42
- package/dist/eval-world.js +1 -23
- package/dist/evals.js +6 -134
- package/dist/evidence-pack.js +0 -29
- package/dist/evidence-pair.js +0 -17
- package/dist/evidence.js +4 -280
- package/dist/exec.js +19 -404
- package/dist/exhaustion.js +0 -30
- package/dist/export-ui.js +0 -7
- package/dist/export.js +1 -38
- package/dist/failing-first.js +0 -6
- package/dist/fallback-schema.js +0 -5
- package/dist/fallback.js +0 -81
- package/dist/fast-start.js +0 -97
- package/dist/fast-terms.js +0 -3
- package/dist/fenced-check-coverage.js +0 -11
- package/dist/findings.js +1 -63
- package/dist/first-run.js +4 -57
- package/dist/first-tasks-child.js +0 -5
- package/dist/flaky-ci.js +1 -24
- package/dist/flaky-cli.js +0 -4
- package/dist/flaky.js +0 -43
- package/dist/fleet-schema.js +0 -11
- package/dist/flow-actions.js +0 -31
- package/dist/flow-browser.js +0 -42
- package/dist/flow-cadence.js +1 -24
- package/dist/flow-card-task.js +0 -11
- package/dist/flow-changed.js +0 -16
- package/dist/flow-code.js +1 -45
- package/dist/flow-draft.js +0 -17
- package/dist/flow-engine.js +2 -76
- package/dist/flow-gallery-ui.js +0 -28
- package/dist/flow-gallery.js +0 -54
- package/dist/flow-insights.js +0 -12
- package/dist/flow-items.js +0 -27
- package/dist/flow-live.js +0 -31
- package/dist/flow-people.js +0 -14
- package/dist/flow-pull-request.js +0 -32
- package/dist/flow-replies.js +0 -9
- package/dist/flow-result-card.js +0 -8
- package/dist/flow-schedule.js +0 -74
- package/dist/flow-scripts.js +0 -13
- package/dist/flow-secrets.js +0 -10
- package/dist/flow-send.js +0 -45
- package/dist/flow-share.js +0 -60
- package/dist/flow-sort.js +1 -24
- package/dist/flow-starters-ui.js +0 -2
- package/dist/flow-starters.js +0 -13
- package/dist/flow-steps.js +0 -80
- package/dist/flow-triggers.js +2 -256
- package/dist/flow-unattended-words.js +0 -13
- package/dist/flow-unattended.js +2 -115
- package/dist/flows-cli.js +2 -36
- package/dist/flows-ui.js +0 -51
- package/dist/flows.js +0 -158
- package/dist/folder-gate.js +0 -21
- package/dist/folder-look.js +0 -42
- package/dist/follow-through-brief.js +0 -6
- package/dist/follow-through-cli.js +0 -5
- package/dist/fonts.js +0 -13
- package/dist/gaps.js +0 -20
- package/dist/gate-failure.js +0 -7
- package/dist/git-floor.js +0 -12
- package/dist/git-incident.js +2 -38
- package/dist/git-views.js +0 -24
- package/dist/git.js +0 -31
- package/dist/github-import.js +0 -22
- package/dist/github-jobs.js +0 -12
- package/dist/google-mail.js +2 -27
- package/dist/grant.js +0 -110
- package/dist/graph.js +0 -108
- package/dist/guides.js +4 -15
- package/dist/handover-note.js +0 -12
- package/dist/health-cli.js +0 -2
- package/dist/home-groups.js +0 -15
- package/dist/html.js +0 -54
- package/dist/install-method.js +0 -12
- package/dist/integrations-ui.js +0 -15
- package/dist/integrations.js +7 -50
- package/dist/invoke.js +1 -381
- package/dist/is-record.js +0 -1
- package/dist/issues.js +0 -48
- package/dist/jsonl-discriminants.js +0 -6
- package/dist/keymap.js +0 -17
- package/dist/keys.js +0 -56
- package/dist/kits-ui.js +0 -3
- package/dist/kits.js +1 -24
- package/dist/knowledge-cli.js +0 -4
- package/dist/knowledge-ui.js +0 -8
- package/dist/landed-cleanup.js +0 -119
- package/dist/laptop-background.js +0 -85
- package/dist/laptop-service.js +0 -67
- package/dist/latency-timeline.js +2 -23
- package/dist/lead-about.js +0 -7
- package/dist/lead-answer-eval.js +0 -39
- package/dist/lead-capabilities.js +0 -19
- package/dist/lead-cli-live.js +0 -22
- package/dist/lead-cli.js +0 -27
- package/dist/lead-commitments.js +1 -27
- package/dist/lead-context.js +2 -42
- package/dist/lead-contract.js +0 -8
- package/dist/lead-doors.js +0 -105
- package/dist/lead-follow.js +0 -41
- package/dist/lead-identity.js +1 -4
- package/dist/lead-latency-schema.js +0 -13
- package/dist/lead-people.js +3 -18
- package/dist/lead-progress.js +0 -12
- package/dist/lead-queue-runtime.js +0 -26
- package/dist/lead-queue.js +0 -35
- package/dist/lead-route.js +0 -33
- package/dist/lead-status.js +0 -37
- package/dist/lead-sweep.js +0 -18
- package/dist/lead-tools.js +0 -160
- package/dist/lead-voice.js +0 -54
- package/dist/lead.js +2 -105
- package/dist/learning-child.js +0 -6
- package/dist/learning-look.js +0 -14
- package/dist/ledger-chain.js +0 -34
- package/dist/ledger-csv.js +0 -2
- package/dist/ledger-view.js +0 -3
- package/dist/lesson-notes.js +0 -56
- package/dist/limits-ui.js +0 -14
- package/dist/link.js +0 -79
- package/dist/live-backup.js +3 -33
- package/dist/live-bus.js +7 -81
- package/dist/live-children-read.js +4 -47
- package/dist/live-children.js +4 -44
- package/dist/live-detail.js +0 -17
- package/dist/live-input.js +5 -68
- package/dist/live-main-read.js +1 -14
- package/dist/live-notes.js +0 -12
- package/dist/live-open.js +1 -23
- package/dist/live-records.js +4 -151
- package/dist/live-reply.js +1 -51
- package/dist/live-terminal.js +12 -111
- package/dist/live.js +4 -130
- package/dist/local-owner-acts.js +0 -53
- package/dist/local-owner.js +2 -93
- package/dist/log.js +0 -8
- package/dist/login-secrets.js +2 -38
- package/dist/machine-check.js +0 -2
- package/dist/machine-identity.js +1 -46
- package/dist/mailbox.js +0 -30
- package/dist/maintenance.js +1 -3
- package/dist/mcp-connect.js +0 -88
- package/dist/mcp-core.js +0 -45
- package/dist/mcp-http.js +0 -13
- package/dist/mcp-oauth.js +0 -37
- package/dist/mcp-person.js +0 -11
- package/dist/mcp.js +3 -73
- package/dist/memory-cli.js +0 -3
- package/dist/memory-pass.js +0 -53
- package/dist/memory-tidy.js +0 -55
- package/dist/memory-use.js +2 -24
- package/dist/merge-checklist.js +21 -29
- package/dist/metrics.js +0 -10
- package/dist/mobile-viewport.js +0 -6
- package/dist/model-catalog.js +1 -33
- package/dist/model-choices.js +9 -84
- package/dist/model-names.js +0 -9
- package/dist/models-cli.js +0 -13
- package/dist/models-ui.js +0 -17
- package/dist/modes.js +0 -35
- package/dist/monitoring-settings.js +2 -27
- package/dist/monitoring-ui.js +2 -14
- package/dist/monitoring.js +2 -38
- package/dist/names.js +0 -39
- package/dist/needs-you.js +7 -70
- package/dist/never-index.js +0 -9
- package/dist/nightly-check.js +0 -74
- package/dist/nightly-github.js +0 -168
- package/dist/notification-delivery.js +0 -3
- package/dist/notification-rows.js +0 -17
- package/dist/oauth-run-token.js +1 -37
- package/dist/observations.js +0 -16
- package/dist/oidc.js +1 -20
- package/dist/onboard.js +4 -57
- package/dist/one-step-chat-schema.js +0 -15
- package/dist/openrouter-models.js +0 -6
- package/dist/operate-remote-arguments.js +0 -17
- package/dist/operate-remote.js +0 -33
- package/dist/operate.js +227 -2326
- package/dist/orphan-sweep.js +3 -37
- package/dist/page-work-contract.js +0 -3
- package/dist/password-bearer.js +1 -11
- package/dist/passwordless.js +0 -3
- package/dist/peek-cli.js +0 -46
- package/dist/peek.js +2 -61
- package/dist/people-audit-ui.js +0 -6
- package/dist/person-proof.js +0 -6
- package/dist/phase-routing.js +8 -183
- package/dist/plain-schema.js +0 -14
- package/dist/plain-words.js +18 -12
- package/dist/plan-auto.js +0 -20
- package/dist/plan-login.js +0 -16
- package/dist/plan.js +0 -68
- package/dist/plane-review.js +0 -56
- package/dist/planner-source.js +0 -96
- package/dist/planner.js +0 -117
- package/dist/policy-ui.js +0 -8
- package/dist/policy.js +0 -47
- package/dist/prepared-evidence.js +0 -5
- package/dist/principal.js +0 -29
- package/dist/probe.js +0 -30
- package/dist/process-custody.js +0 -15
- package/dist/process-liveness.js +0 -32
- package/dist/process-tree.js +3 -29
- package/dist/project-access.js +0 -10
- package/dist/project-admission.js +1 -41
- package/dist/project-cli.js +0 -6
- package/dist/project-concurrency.js +0 -35
- package/dist/project-delete-ui.js +4 -29
- package/dist/project-delete.js +1 -73
- package/dist/project-demo.js +0 -13
- package/dist/project-file.js +0 -2
- package/dist/project-identity.js +0 -41
- package/dist/project-knowledge.js +0 -39
- package/dist/project-learning.js +3 -55
- package/dist/project-memory.js +2 -45
- package/dist/project-outcomes.js +0 -6
- package/dist/project-sandbox.js +0 -23
- package/dist/project-skills.js +0 -12
- package/dist/project-tools.js +6 -184
- package/dist/project.js +0 -48
- package/dist/prompt.js +0 -31
- package/dist/proof.js +0 -220
- package/dist/proposal.js +0 -50
- package/dist/protected-storage-look.js +0 -6
- package/dist/protected-storage.js +1 -84
- package/dist/provider-auth.js +3 -69
- package/dist/provider-capture.js +1 -15
- package/dist/provider-connection.js +0 -8
- package/dist/provider-home.js +0 -25
- package/dist/provider-limits.js +0 -14
- package/dist/provider.js +0 -324
- package/dist/public-access.js +0 -34
- package/dist/public-check.js +0 -16
- package/dist/publish.js +1 -150
- package/dist/pull-request-flow.js +0 -77
- package/dist/pull-request-schema.js +0 -4
- package/dist/pull-request-ui.js +0 -5
- package/dist/pulls.js +0 -80
- package/dist/push.js +5 -89
- package/dist/quick-start.js +1 -23
- package/dist/read-executor-worker.js +0 -1
- package/dist/read-executor.js +0 -10
- package/dist/read-only-request.js +0 -7
- package/dist/recipe-ui.js +0 -6
- package/dist/recipes.js +0 -13
- package/dist/release-adapters.js +6 -214
- package/dist/release-approval.js +0 -74
- package/dist/release-authority.js +0 -42
- package/dist/release-auto.js +0 -142
- package/dist/release-card.js +0 -100
- package/dist/release-carry.js +0 -132
- package/dist/release-ci-hold.js +0 -20
- package/dist/release-cli.js +0 -46
- package/dist/release-coverage.js +0 -16
- package/dist/release-gate.js +0 -30
- package/dist/release-git.js +0 -24
- package/dist/release-links.js +0 -17
- package/dist/release-net.js +0 -42
- package/dist/release-next.js +0 -25
- package/dist/release-recheck.js +0 -89
- package/dist/release-refusal.js +0 -18
- package/dist/release-view.js +0 -5
- package/dist/release.js +7 -341
- package/dist/releases.js +0 -49
- package/dist/remote-audit.js +0 -25
- package/dist/remote-command.js +0 -16
- package/dist/remote-destination.js +5 -26
- package/dist/remote-exec.js +1 -27
- package/dist/remote-main.js +1 -53
- package/dist/remote-run.js +0 -5
- package/dist/remote.js +0 -49
- package/dist/render.js +0 -133
- package/dist/reply-shape.js +0 -85
- package/dist/reply-voice.js +0 -7
- package/dist/report-summary.js +0 -5
- package/dist/reported-usage.js +0 -30
- package/dist/repos.js +9 -62
- package/dist/repository-context.js +1 -24
- package/dist/request-budget-ui.js +0 -4
- package/dist/request-budget.js +0 -23
- package/dist/restart-certification.js +0 -37
- package/dist/result-actions.js +0 -62
- package/dist/result-acts.js +0 -34
- package/dist/result-completion.js +0 -25
- package/dist/result-evidence-readers.js +0 -3
- package/dist/result-follow-ups.js +1 -39
- package/dist/result-review.js +0 -86
- package/dist/result-shots.js +0 -39
- package/dist/retention-ui.js +0 -7
- package/dist/retention.js +2 -46
- package/dist/review-context.js +0 -129
- package/dist/review-evidence.js +0 -4
- package/dist/review-switch.js +1 -7
- package/dist/reviewer.js +0 -35
- package/dist/route-change-check.js +0 -2
- package/dist/route-change.js +0 -16
- package/dist/route-hooks.js +0 -27
- package/dist/route-results.js +2 -58
- package/dist/route-rules.js +1 -106
- package/dist/route-savings.js +0 -36
- package/dist/route-store.js +1 -133
- package/dist/run-closeout.js +2 -50
- package/dist/run-efficiency.js +2 -44
- package/dist/run-ending.js +0 -13
- package/dist/runner-process.js +0 -33
- package/dist/runner.js +17 -189
- package/dist/sample-project.js +2 -27
- package/dist/sandbox-launch.js +4 -25
- package/dist/sandbox-runtime.js +1 -88
- package/dist/scan.js +0 -27
- package/dist/scope.js +4 -567
- package/dist/scout-browser-lock.js +0 -6
- package/dist/scout-browser.js +2 -68
- package/dist/scout-net.js +1 -32
- package/dist/scout-report.js +0 -22
- package/dist/scout.js +1 -116
- package/dist/secret-mint.js +0 -6
- package/dist/serve.js +21 -555
- package/dist/server/agents-computers.js +0 -10
- package/dist/server/agents-live-filed.js +0 -13
- package/dist/server/agents-live-lead.js +0 -19
- package/dist/server/agents-live-room.js +0 -19
- package/dist/server/chat.js +2 -194
- package/dist/server/chrome.js +17 -263
- package/dist/server/console.css +4 -4
- package/dist/server/edge-refusal.js +0 -3
- package/dist/server/flows.js +5 -74
- package/dist/server/guards.js +1 -88
- package/dist/server/handler-registry.js +0 -2
- package/dist/server/home-asks.js +1 -22
- package/dist/server/home.js +1 -30
- package/dist/server/http.js +0 -82
- package/dist/server/in-place.js +0 -15
- package/dist/server/kit-standalone.js +0 -20
- package/dist/server/kit.js +2 -114
- package/dist/server/last-checks.js +0 -2
- package/dist/server/live.js +1 -36
- package/dist/server/merge-ready-view.js +0 -6
- package/dist/server/mutation-key.js +3 -40
- package/dist/server/pages-assets.js +0 -16
- package/dist/server/pages.js +7 -195
- package/dist/server/people-tokens.js +3 -101
- package/dist/server/remote-hooks.js +0 -13
- package/dist/server/remote.js +0 -28
- package/dist/server/render-chat.js +8 -144
- package/dist/server/render-code-map.js +0 -5
- package/dist/server/render-flaky.js +0 -8
- package/dist/server/render-follow-through.js +2 -5
- package/dist/server/render-history.js +2 -34
- package/dist/server/render-new-task.js +2 -29
- package/dist/server/render-pages.js +1 -111
- package/dist/server/render-people.js +2 -46
- package/dist/server/render-projects.js +15 -32
- package/dist/server/render-release.js +1 -14
- package/dist/server/render-results.js +4 -355
- package/dist/server/render-settings.js +0 -15
- package/dist/server/render-tasks.js +13 -493
- package/dist/server/request-context.js +2 -9
- package/dist/server/retired-routes.js +0 -11
- package/dist/server/route-policy.js +0 -3
- package/dist/server/route-table.js +6 -135
- package/dist/server/runtime.js +0 -1
- package/dist/server/session.js +0 -28
- package/dist/server/settings.js +40 -246
- package/dist/server/signup-gate.js +0 -11
- package/dist/server/sweeps.js +0 -6
- package/dist/server/task-views.js +9 -227
- package/dist/server/tasks.js +5 -539
- package/dist/server/terminals.js +2 -46
- package/dist/server/welcome.js +2 -22
- package/dist/server-telemetry.js +0 -9
- package/dist/settings-groups-ui.js +50 -63
- package/dist/settings-kit-script.js +0 -19
- package/dist/settings-kit.js +0 -63
- package/dist/settings-proofs.js +0 -23
- package/dist/setup-guide.js +1 -9
- package/dist/shared-deps.js +9 -84
- package/dist/sign-in-guard.js +0 -27
- package/dist/skills-ui.js +0 -2
- package/dist/skills.js +2 -54
- package/dist/slack-api.js +0 -3
- package/dist/slack-chat.js +0 -25
- package/dist/slack-settings.js +0 -1
- package/dist/slack-socket.js +0 -5
- package/dist/slack.js +0 -4
- package/dist/sleep.js +0 -1
- package/dist/source-key.js +0 -10
- package/dist/spend-report.js +0 -29
- package/dist/spend-ui.js +0 -26
- package/dist/spend.js +0 -40
- package/dist/sqlite-runtime.js +0 -2
- package/dist/sqlite-telemetry.js +0 -9
- package/dist/sso-settings.js +0 -13
- package/dist/sso-ui.js +0 -2
- package/dist/staged-runtimes.js +5 -39
- package/dist/steer-capabilities.js +1 -7
- package/dist/steer-controls.js +0 -10
- package/dist/steer-live.js +0 -31
- package/dist/steer-mailbox.js +4 -65
- package/dist/steer-status.js +0 -7
- package/dist/stop-proof.js +5 -62
- package/dist/storage-sweep-child.js +1 -5
- package/dist/storage-sweep-process.js +2 -20
- package/dist/storage-sweep-schedule.js +0 -32
- package/dist/storage-sweep.js +2 -51
- package/dist/storage-ui.js +0 -18
- package/dist/storage.js +0 -31
- package/dist/store-baseline.js +0 -14
- package/dist/store.js +109 -4763
- package/dist/stream-scope.js +0 -16
- package/dist/structured-output.js +0 -39
- package/dist/style-asset.js +0 -2
- package/dist/subagent-admin.js +0 -9
- package/dist/subagent-desk.js +0 -29
- package/dist/subagent-memory.js +0 -38
- package/dist/subagent-question.js +0 -29
- package/dist/subagent-tools.js +1 -60
- package/dist/subagent-week.js +0 -28
- package/dist/subagent-work.js +1 -39
- package/dist/subagents-ui.js +1 -13
- package/dist/subagents.js +0 -40
- package/dist/subscription-chat.js +1 -42
- package/dist/summary.js +0 -19
- package/dist/surface.js +0 -75
- package/dist/sweep-gate.js +0 -2
- package/dist/sweep-quarantine.js +2 -13
- package/dist/sync.js +0 -47
- package/dist/tailnet.js +0 -9
- package/dist/tamper-scan.js +0 -15
- package/dist/task-activity.js +1 -16
- package/dist/task-aliases.js +0 -3
- package/dist/task-archive.js +0 -7
- package/dist/task-base.js +0 -18
- package/dist/task-composer.js +0 -2
- package/dist/task-control.js +0 -74
- package/dist/task-live.js +0 -23
- package/dist/task-moves.js +0 -28
- package/dist/task-outcome-cli.js +17 -28
- package/dist/task-review-brief.js +0 -7
- package/dist/task-sizing.js +0 -47
- package/dist/task-source.js +0 -23
- package/dist/task-status.js +0 -106
- package/dist/task-text.js +0 -12
- package/dist/team-chat-authorization.js +0 -3
- package/dist/team-contract.js +0 -2
- package/dist/team-http.js +0 -4
- package/dist/team-leads.js +1 -16
- package/dist/team-runtime.js +0 -13
- package/dist/team-ui.js +0 -1
- package/dist/team-updates.js +0 -4
- package/dist/teams-api.js +0 -12
- package/dist/teams-chat.js +0 -28
- package/dist/teams.js +0 -12
- package/dist/teardown-git.js +6 -294
- package/dist/telegram-flow.js +0 -51
- package/dist/telegram-lead.js +2 -203
- package/dist/telegram-live.js +1 -42
- package/dist/telegram-progress.js +0 -18
- package/dist/telegram-settings.js +0 -7
- package/dist/telegram-status.js +0 -46
- package/dist/telegram-team.js +1 -33
- package/dist/telegram.js +6 -454
- package/dist/templates.js +0 -24
- package/dist/terminal-catalog.js +2 -20
- package/dist/terminal-text.js +0 -12
- package/dist/test-infra.js +0 -50
- package/dist/test-temp.js +3 -26
- package/dist/text-limits.js +0 -92
- package/dist/tidy.js +0 -76
- package/dist/tier-report.js +0 -2
- package/dist/token-notices.js +1 -9
- package/dist/tokens-cli.js +0 -13
- package/dist/tool-broker.js +2 -53
- package/dist/tool-launcher.js +0 -14
- package/dist/tool-secret-store.js +3 -125
- package/dist/toolroll-update-cli.js +0 -9
- package/dist/toolroll-update-ui.js +0 -14
- package/dist/toolroll-update.js +13 -252
- package/dist/tools-ui.js +0 -17
- package/dist/transitions-recipes.js +0 -2
- package/dist/tree-proof.js +0 -23
- package/dist/tui-contract.js +0 -8
- package/dist/tui-source.js +16 -36
- package/dist/tui.js +1 -1
- package/dist/typed-start.js +0 -27
- package/dist/unfenced-test-support.js +0 -5
- package/dist/up-processes.js +1 -40
- package/dist/up-role-child.js +1 -13
- package/dist/update-notice.js +0 -1
- package/dist/vanished-retry.js +0 -40
- package/dist/verification-evidence.js +0 -39
- package/dist/version.js +0 -1
- package/dist/wake-hub.js +0 -28
- package/dist/webhook-limits.js +0 -7
- package/dist/webhook-readers.js +0 -30
- package/dist/webhook-signing.js +0 -14
- package/dist/webhooks.js +0 -54
- package/dist/welcome-facts.js +2 -14
- package/dist/when-html.js +0 -27
- package/dist/work-index.js +26 -98
- package/dist/work-summary.js +2 -17
- package/dist/workspace-motion.js +0 -2
- package/dist/workspace-revision.js +1 -21
- package/dist/workspace-ui.js +15 -135
- package/dist/worktree-notices.js +0 -3
- package/dist/worktree.js +0 -308
- package/dist/writes-mode.js +0 -1
- package/dist/youiyoux-intake.js +4 -159
- package/package.json +4 -3
- package/dist/accent-colors.d.ts +0 -51
- package/dist/acp-agents.d.ts +0 -43
- package/dist/acp-attest.d.ts +0 -44
- package/dist/acp-check.d.ts +0 -37
- package/dist/acp-client.d.ts +0 -163
- package/dist/acp-inspect.d.ts +0 -23
- package/dist/action-ledger.d.ts +0 -27
- package/dist/activity-line.d.ts +0 -29
- package/dist/actor.d.ts +0 -11
- package/dist/agent-board.d.ts +0 -229
- package/dist/agent-fence.d.ts +0 -479
- package/dist/agent-onboard.d.ts +0 -158
- package/dist/agent-pulse.d.ts +0 -43
- package/dist/agent-state-words.d.ts +0 -19
- package/dist/agent-state.d.ts +0 -65
- package/dist/agent-turns.d.ts +0 -52
- package/dist/agentconfig.d.ts +0 -191
- package/dist/agents-board.d.ts +0 -145
- package/dist/agents-live.d.ts +0 -31
- package/dist/api-tokens.d.ts +0 -80
- package/dist/approval-authority.d.ts +0 -51
- package/dist/approval-password.d.ts +0 -31
- package/dist/approval-policy.d.ts +0 -69
- package/dist/approval-rules-ui.d.ts +0 -40
- package/dist/assignment-adapters.d.ts +0 -152
- package/dist/assignment-brief.d.ts +0 -83
- package/dist/assignment-delivery.d.ts +0 -86
- package/dist/assignment-presentation.d.ts +0 -37
- package/dist/assignment-status.d.ts +0 -71
- package/dist/assignment-ui.d.ts +0 -68
- package/dist/assignment.d.ts +0 -350
- package/dist/attest.d.ts +0 -59
- package/dist/audit-cli.d.ts +0 -17
- package/dist/backend.d.ts +0 -97
- package/dist/backup-ui.d.ts +0 -32
- package/dist/backup.d.ts +0 -92
- package/dist/batch-checks.d.ts +0 -15
- package/dist/batch-policy.d.ts +0 -23
- package/dist/beads.d.ts +0 -34
- package/dist/bin.d.ts +0 -2
- package/dist/board.d.ts +0 -134
- package/dist/boot-identity.d.ts +0 -64
- package/dist/bounded-spawn.d.ts +0 -57
- package/dist/brand-icons.d.ts +0 -168
- package/dist/brand-mark.d.ts +0 -28
- package/dist/brief-fence.d.ts +0 -9
- package/dist/browser-crew.d.ts +0 -12
- package/dist/browser-shell.d.ts +0 -9
- package/dist/browser-workspace.d.ts +0 -1985
- package/dist/budget-alerts.d.ts +0 -19
- package/dist/build-review.d.ts +0 -38
- package/dist/builder-restart.d.ts +0 -21
- package/dist/builder.d.ts +0 -409
- package/dist/canonical-json.d.ts +0 -14
- package/dist/capscan.d.ts +0 -35
- package/dist/card-catalog.d.ts +0 -209
- package/dist/card-cli.d.ts +0 -43
- package/dist/card-render.d.ts +0 -43
- package/dist/card-sources.d.ts +0 -68
- package/dist/chat-acceptance.d.ts +0 -74
- package/dist/chat-actions.d.ts +0 -460
- package/dist/chat-admission.d.ts +0 -19
- package/dist/chat-approval.d.ts +0 -58
- package/dist/chat-ask.d.ts +0 -32
- package/dist/chat-card-part.d.ts +0 -11
- package/dist/chat-card.d.ts +0 -46
- package/dist/chat-channel.d.ts +0 -126
- package/dist/chat-continuity.d.ts +0 -32
- package/dist/chat-controls.d.ts +0 -117
- package/dist/chat-core.d.ts +0 -177
- package/dist/chat-decide.d.ts +0 -269
- package/dist/chat-delivery-state.d.ts +0 -132
- package/dist/chat-delivery.d.ts +0 -71
- package/dist/chat-display.d.ts +0 -1
- package/dist/chat-evidence.d.ts +0 -123
- package/dist/chat-flow.d.ts +0 -70
- package/dist/chat-follow.d.ts +0 -20
- package/dist/chat-inbox.d.ts +0 -57
- package/dist/chat-live-schema.d.ts +0 -17
- package/dist/chat-live.d.ts +0 -161
- package/dist/chat-message-states.d.ts +0 -75
- package/dist/chat-messages.d.ts +0 -338
- package/dist/chat-migration.d.ts +0 -30
- package/dist/chat-polish.d.ts +0 -17
- package/dist/chat-quiet.d.ts +0 -40
- package/dist/chat-review.d.ts +0 -51
- package/dist/chat-rooms.d.ts +0 -123
- package/dist/chat-settings-page.d.ts +0 -43
- package/dist/chat-task-actions.d.ts +0 -59
- package/dist/chat-terms.d.ts +0 -29
- package/dist/chat-voice.d.ts +0 -69
- package/dist/chat-warmth.d.ts +0 -21
- package/dist/check-access.d.ts +0 -54
- package/dist/check-facts.d.ts +0 -126
- package/dist/check-failure.d.ts +0 -113
- package/dist/check-levels-ui.d.ts +0 -36
- package/dist/check-levels.d.ts +0 -70
- package/dist/check-load.d.ts +0 -85
- package/dist/check-only-standing.d.ts +0 -36
- package/dist/check-only.d.ts +0 -15
- package/dist/check-progress.d.ts +0 -78
- package/dist/check-repair.d.ts +0 -47
- package/dist/check-report.d.ts +0 -177
- package/dist/check-stamp.d.ts +0 -46
- package/dist/checkout-cleanup.d.ts +0 -157
- package/dist/checkout-proof.d.ts +0 -28
- package/dist/child-database.d.ts +0 -12
- package/dist/claim.d.ts +0 -627
- package/dist/claude-print.d.ts +0 -12
- package/dist/cli-fast.d.ts +0 -8
- package/dist/cli-help.d.ts +0 -8
- package/dist/cli-http.d.ts +0 -58
- package/dist/cli.d.ts +0 -149
- package/dist/code-extract.d.ts +0 -44
- package/dist/code-map-acts.d.ts +0 -24
- package/dist/code-map-admission.d.ts +0 -52
- package/dist/code-map-build.d.ts +0 -63
- package/dist/code-map-cli.d.ts +0 -153
- package/dist/code-map-main.d.ts +0 -1
- package/dist/code-map-read.d.ts +0 -106
- package/dist/code-map-report.d.ts +0 -37
- package/dist/code-map-shape.d.ts +0 -172
- package/dist/code-map-store.d.ts +0 -136
- package/dist/codex-limits.d.ts +0 -15
- package/dist/coding-context.d.ts +0 -18
- package/dist/coding-handoff.d.ts +0 -39
- package/dist/coding-provider.d.ts +0 -88
- package/dist/coding-shipping-ui.d.ts +0 -5
- package/dist/coding-types.d.ts +0 -16
- package/dist/coding-ui.d.ts +0 -19
- package/dist/coding-update.d.ts +0 -28
- package/dist/coding-workspace.d.ts +0 -141
- package/dist/commit-extract.d.ts +0 -135
- package/dist/connect-cli.d.ts +0 -34
- package/dist/console-chrome.d.ts +0 -41
- package/dist/console-instance.d.ts +0 -157
- package/dist/container-state.d.ts +0 -5
- package/dist/containment.d.ts +0 -205
- package/dist/contract-changes.d.ts +0 -52
- package/dist/contracts/acceptance-terms.d.ts +0 -14
- package/dist/contracts/chat-actions.d.ts +0 -465
- package/dist/contracts/chat-callback-rows.d.ts +0 -59
- package/dist/contracts/chat-card.d.ts +0 -91
- package/dist/contracts/chat-content.d.ts +0 -551
- package/dist/contracts/chat-tables.d.ts +0 -12
- package/dist/contracts/cli.d.ts +0 -987
- package/dist/contracts/coding-activity.d.ts +0 -64
- package/dist/contracts/coding-context.d.ts +0 -97
- package/dist/contracts/coding-handoff.d.ts +0 -44
- package/dist/contracts/coding-workspace.d.ts +0 -165
- package/dist/contracts/console-api.d.ts +0 -540
- package/dist/contracts/contract-test.d.ts +0 -45
- package/dist/contracts/contract.d.ts +0 -92
- package/dist/contracts/decision.d.ts +0 -45
- package/dist/contracts/diff-stat.d.ts +0 -58
- package/dist/contracts/discord-callback.d.ts +0 -45
- package/dist/contracts/flow-card.d.ts +0 -53
- package/dist/contracts/flow-propose.d.ts +0 -334
- package/dist/contracts/flow-send.d.ts +0 -245
- package/dist/contracts/flow.d.ts +0 -19565
- package/dist/contracts/gateway-tools.d.ts +0 -472
- package/dist/contracts/handoff.d.ts +0 -91
- package/dist/contracts/health.d.ts +0 -82
- package/dist/contracts/integration-metadata.d.ts +0 -100
- package/dist/contracts/lead-context.d.ts +0 -165
- package/dist/contracts/lead-tools.d.ts +0 -2312
- package/dist/contracts/mcp-oauth.d.ts +0 -53
- package/dist/contracts/memory-pass.d.ts +0 -157
- package/dist/contracts/model-catalog.d.ts +0 -21
- package/dist/contracts/observation-request.d.ts +0 -37
- package/dist/contracts/plan.d.ts +0 -58
- package/dist/contracts/project-knowledge.d.ts +0 -159
- package/dist/contracts/project-memory.d.ts +0 -119
- package/dist/contracts/project-skills.d.ts +0 -120
- package/dist/contracts/proof.d.ts +0 -136
- package/dist/contracts/provider.d.ts +0 -40
- package/dist/contracts/recipes.d.ts +0 -166
- package/dist/contracts/release-check.d.ts +0 -371
- package/dist/contracts/release-terms.d.ts +0 -107
- package/dist/contracts/retention.d.ts +0 -42
- package/dist/contracts/review-findings.d.ts +0 -46
- package/dist/contracts/route-results.d.ts +0 -121
- package/dist/contracts/route.d.ts +0 -897
- package/dist/contracts/scope.d.ts +0 -105
- package/dist/contracts/scout-report.d.ts +0 -234
- package/dist/contracts/slack-callback.d.ts +0 -43
- package/dist/contracts/sort-answer.d.ts +0 -83
- package/dist/contracts/stage-output.d.ts +0 -127
- package/dist/contracts/storage.d.ts +0 -37
- package/dist/contracts/store-json.d.ts +0 -313
- package/dist/contracts/subagent-turn.d.ts +0 -43
- package/dist/contracts/task-sizing.d.ts +0 -24
- package/dist/contracts/teams-callback.d.ts +0 -13
- package/dist/contracts/telegram-callback.d.ts +0 -120
- package/dist/contracts/trigger-payloads.d.ts +0 -389
- package/dist/contracts/update-journal.d.ts +0 -254
- package/dist/contracts/verification-receipt.d.ts +0 -200
- package/dist/contracts/verification-view.d.ts +0 -102
- package/dist/contracts/youiyoux-request.d.ts +0 -248
- package/dist/control-setup.d.ts +0 -44
- package/dist/control-ui.d.ts +0 -37
- package/dist/controller-service.d.ts +0 -1
- package/dist/controller-supervisor.d.ts +0 -38
- package/dist/converse.d.ts +0 -316
- package/dist/coordinator-proposals.d.ts +0 -29
- package/dist/coordinator.d.ts +0 -186
- package/dist/credentials-ui.d.ts +0 -33
- package/dist/daemon.d.ts +0 -226
- package/dist/database-reclaim.d.ts +0 -4
- package/dist/decision.d.ts +0 -119
- package/dist/demo-chat.d.ts +0 -32
- package/dist/demo.d.ts +0 -153
- package/dist/deploy-gate.d.ts +0 -20
- package/dist/deploy-lock.d.ts +0 -8
- package/dist/deploy-phase.d.ts +0 -37
- package/dist/deploy-rescue.d.ts +0 -42
- package/dist/deprecations.d.ts +0 -20
- package/dist/design/kit.d.ts +0 -216
- package/dist/desktop-access.d.ts +0 -28
- package/dist/desktop-bundle.d.ts +0 -16
- package/dist/desktop-host.d.ts +0 -54
- package/dist/desktop-update-gate.d.ts +0 -12
- package/dist/desktop-update-recovery.d.ts +0 -14
- package/dist/desktop-update.d.ts +0 -147
- package/dist/digest-times.d.ts +0 -3
- package/dist/disclosure.d.ts +0 -6
- package/dist/discord-api.d.ts +0 -24
- package/dist/discord-chat.d.ts +0 -27
- package/dist/discord-settings.d.ts +0 -4
- package/dist/discord.d.ts +0 -10
- package/dist/discover.d.ts +0 -75
- package/dist/dispatch.d.ts +0 -123
- package/dist/dispose.d.ts +0 -194
- package/dist/doctor.d.ts +0 -67
- package/dist/easy-start-args.d.ts +0 -13
- package/dist/easy-start.d.ts +0 -77
- package/dist/egress.d.ts +0 -121
- package/dist/email-settings.d.ts +0 -34
- package/dist/envelope.d.ts +0 -47
- package/dist/eval-gate.d.ts +0 -51
- package/dist/eval-hooks.d.ts +0 -94
- package/dist/eval-oracle-main.d.ts +0 -1
- package/dist/eval-oracle.d.ts +0 -60
- package/dist/eval-world.d.ts +0 -17
- package/dist/evals.d.ts +0 -299
- package/dist/evidence-pack.d.ts +0 -186
- package/dist/evidence-pair.d.ts +0 -53
- package/dist/evidence.d.ts +0 -371
- package/dist/exec.d.ts +0 -355
- package/dist/exhaustion.d.ts +0 -58
- package/dist/export-ui.d.ts +0 -11
- package/dist/export.d.ts +0 -48
- package/dist/failing-first.d.ts +0 -31
- package/dist/fallback-schema.d.ts +0 -8
- package/dist/fallback.d.ts +0 -138
- package/dist/fast-start.d.ts +0 -213
- package/dist/fast-terms.d.ts +0 -9
- package/dist/fenced-check-coverage.d.ts +0 -62
- package/dist/findings.d.ts +0 -224
- package/dist/first-run.d.ts +0 -197
- package/dist/first-tasks-child.d.ts +0 -1
- package/dist/flaky-ci.d.ts +0 -31
- package/dist/flaky-cli.d.ts +0 -60
- package/dist/flaky.d.ts +0 -83
- package/dist/fleet-schema.d.ts +0 -17
- package/dist/flow-actions.d.ts +0 -79
- package/dist/flow-browser.d.ts +0 -103
- package/dist/flow-cadence.d.ts +0 -48
- package/dist/flow-card-task.d.ts +0 -11
- package/dist/flow-changed.d.ts +0 -14
- package/dist/flow-code.d.ts +0 -84
- package/dist/flow-draft.d.ts +0 -42
- package/dist/flow-engine.d.ts +0 -82
- package/dist/flow-gallery-ui.d.ts +0 -73
- package/dist/flow-gallery.d.ts +0 -147
- package/dist/flow-insights.d.ts +0 -104
- package/dist/flow-items.d.ts +0 -37
- package/dist/flow-live.d.ts +0 -16
- package/dist/flow-people.d.ts +0 -23
- package/dist/flow-pull-request.d.ts +0 -14
- package/dist/flow-replies.d.ts +0 -48
- package/dist/flow-result-card.d.ts +0 -22
- package/dist/flow-schedule.d.ts +0 -154
- package/dist/flow-scripts.d.ts +0 -31
- package/dist/flow-secrets.d.ts +0 -13
- package/dist/flow-send.d.ts +0 -54
- package/dist/flow-share.d.ts +0 -78
- package/dist/flow-sort.d.ts +0 -63
- package/dist/flow-starters-ui.d.ts +0 -15
- package/dist/flow-starters.d.ts +0 -63
- package/dist/flow-steps.d.ts +0 -52
- package/dist/flow-triggers.d.ts +0 -303
- package/dist/flow-unattended-words.d.ts +0 -48
- package/dist/flow-unattended.d.ts +0 -259
- package/dist/flows-cli.d.ts +0 -358
- package/dist/flows-ui.d.ts +0 -70
- package/dist/flows.d.ts +0 -136
- package/dist/folder-gate.d.ts +0 -32
- package/dist/folder-look.d.ts +0 -110
- package/dist/follow-through-brief.d.ts +0 -12
- package/dist/follow-through-cli.d.ts +0 -23
- package/dist/fonts.d.ts +0 -19
- package/dist/gaps.d.ts +0 -35
- package/dist/gate-failure.d.ts +0 -40
- package/dist/git-floor.d.ts +0 -16
- package/dist/git-incident.d.ts +0 -65
- package/dist/git-views.d.ts +0 -20
- package/dist/git.d.ts +0 -54
- package/dist/github-import.d.ts +0 -62
- package/dist/github-jobs.d.ts +0 -25
- package/dist/google-mail.d.ts +0 -59
- package/dist/grant.d.ts +0 -136
- package/dist/graph.d.ts +0 -164
- package/dist/guides.d.ts +0 -22
- package/dist/handover-note.d.ts +0 -33
- package/dist/health-cli.d.ts +0 -3
- package/dist/home-groups.d.ts +0 -39
- package/dist/html.d.ts +0 -85
- package/dist/install-method.d.ts +0 -17
- package/dist/integrations-ui.d.ts +0 -17
- package/dist/integrations.d.ts +0 -138
- package/dist/invoke.d.ts +0 -228
- package/dist/is-record.d.ts +0 -2
- package/dist/issues.d.ts +0 -41
- package/dist/jsonl-discriminants.d.ts +0 -11
- package/dist/keymap.d.ts +0 -43
- package/dist/keys.d.ts +0 -108
- package/dist/kits-ui.d.ts +0 -16
- package/dist/kits.d.ts +0 -88
- package/dist/knowledge-cli.d.ts +0 -132
- package/dist/knowledge-ui.d.ts +0 -45
- package/dist/landed-cleanup.d.ts +0 -175
- package/dist/laptop-background.d.ts +0 -187
- package/dist/laptop-service.d.ts +0 -111
- package/dist/latency-timeline.d.ts +0 -46
- package/dist/lead-about.d.ts +0 -35
- package/dist/lead-answer-eval.d.ts +0 -93
- package/dist/lead-capabilities.d.ts +0 -57
- package/dist/lead-cli-live.d.ts +0 -56
- package/dist/lead-cli.d.ts +0 -58
- package/dist/lead-commitments.d.ts +0 -84
- package/dist/lead-context.d.ts +0 -45
- package/dist/lead-contract.d.ts +0 -10
- package/dist/lead-doors.d.ts +0 -122
- package/dist/lead-follow.d.ts +0 -26
- package/dist/lead-identity.d.ts +0 -23
- package/dist/lead-latency-schema.d.ts +0 -24
- package/dist/lead-people.d.ts +0 -55
- package/dist/lead-progress.d.ts +0 -67
- package/dist/lead-queue-runtime.d.ts +0 -46
- package/dist/lead-queue.d.ts +0 -104
- package/dist/lead-route.d.ts +0 -56
- package/dist/lead-status.d.ts +0 -116
- package/dist/lead-sweep.d.ts +0 -67
- package/dist/lead-tools.d.ts +0 -167
- package/dist/lead-voice.d.ts +0 -85
- package/dist/lead.d.ts +0 -142
- package/dist/learning-child.d.ts +0 -1
- package/dist/learning-look.d.ts +0 -25
- package/dist/ledger-chain.d.ts +0 -46
- package/dist/ledger-csv.d.ts +0 -4
- package/dist/ledger-view.d.ts +0 -27
- package/dist/lesson-notes.d.ts +0 -81
- package/dist/limits-ui.d.ts +0 -34
- package/dist/link.d.ts +0 -72
- package/dist/live-backup.d.ts +0 -39
- package/dist/live-bus.d.ts +0 -141
- package/dist/live-children-read.d.ts +0 -52
- package/dist/live-children.d.ts +0 -73
- package/dist/live-detail.d.ts +0 -27
- package/dist/live-input.d.ts +0 -68
- package/dist/live-main-read.d.ts +0 -19
- package/dist/live-notes.d.ts +0 -20
- package/dist/live-open.d.ts +0 -28
- package/dist/live-records.d.ts +0 -149
- package/dist/live-reply.d.ts +0 -83
- package/dist/live-terminal.d.ts +0 -273
- package/dist/live.d.ts +0 -152
- package/dist/local-owner-acts.d.ts +0 -83
- package/dist/local-owner.d.ts +0 -135
- package/dist/log.d.ts +0 -7
- package/dist/login-secrets.d.ts +0 -60
- package/dist/machine-check.d.ts +0 -16
- package/dist/machine-identity.d.ts +0 -75
- package/dist/mailbox.d.ts +0 -57
- package/dist/maintenance.d.ts +0 -13
- package/dist/mcp-connect.d.ts +0 -181
- package/dist/mcp-core.d.ts +0 -110
- package/dist/mcp-http.d.ts +0 -32
- package/dist/mcp-oauth.d.ts +0 -92
- package/dist/mcp-person.d.ts +0 -22
- package/dist/mcp.d.ts +0 -20
- package/dist/memory-cli.d.ts +0 -768
- package/dist/memory-pass.d.ts +0 -151
- package/dist/memory-tidy.d.ts +0 -181
- package/dist/memory-use.d.ts +0 -35
- package/dist/merge-checklist.d.ts +0 -55
- package/dist/metrics.d.ts +0 -6
- package/dist/mobile-viewport.d.ts +0 -7
- package/dist/model-catalog.d.ts +0 -123
- package/dist/model-choices.d.ts +0 -235
- package/dist/model-names.d.ts +0 -6
- package/dist/models-cli.d.ts +0 -307
- package/dist/models-ui.d.ts +0 -161
- package/dist/modes.d.ts +0 -99
- package/dist/monitoring-settings.d.ts +0 -44
- package/dist/monitoring-ui.d.ts +0 -23
- package/dist/monitoring.d.ts +0 -34
- package/dist/names.d.ts +0 -67
- package/dist/needs-you.d.ts +0 -164
- package/dist/never-index.d.ts +0 -3
- package/dist/nightly-check.d.ts +0 -107
- package/dist/nightly-github.d.ts +0 -318
- package/dist/notification-delivery.d.ts +0 -19
- package/dist/notification-rows.d.ts +0 -30
- package/dist/oauth-run-token.d.ts +0 -51
- package/dist/observations.d.ts +0 -36
- package/dist/oidc.d.ts +0 -71
- package/dist/onboard.d.ts +0 -108
- package/dist/one-step-chat-schema.d.ts +0 -22
- package/dist/openrouter-models.d.ts +0 -34
- package/dist/operate-remote-arguments.d.ts +0 -36
- package/dist/operate-remote.d.ts +0 -98
- package/dist/operate.d.ts +0 -401
- package/dist/orphan-sweep.d.ts +0 -65
- package/dist/page-work-contract.d.ts +0 -21
- package/dist/password-bearer.d.ts +0 -25
- package/dist/passwordless.d.ts +0 -23
- package/dist/peek-cli.d.ts +0 -112
- package/dist/peek.d.ts +0 -110
- package/dist/people-audit-ui.d.ts +0 -16
- package/dist/person-proof.d.ts +0 -2
- package/dist/phase-routing.d.ts +0 -401
- package/dist/plain-schema.d.ts +0 -23
- package/dist/plain-words.d.ts +0 -20
- package/dist/plan-auto.d.ts +0 -25
- package/dist/plan-login.d.ts +0 -14
- package/dist/plan.d.ts +0 -188
- package/dist/plane-review.d.ts +0 -54
- package/dist/planner-source.d.ts +0 -225
- package/dist/planner.d.ts +0 -76
- package/dist/policy-ui.d.ts +0 -22
- package/dist/policy.d.ts +0 -92
- package/dist/prepared-evidence.d.ts +0 -17
- package/dist/principal.d.ts +0 -42
- package/dist/probe.d.ts +0 -46
- package/dist/process-custody.d.ts +0 -17
- package/dist/process-liveness.d.ts +0 -13
- package/dist/process-tree.d.ts +0 -39
- package/dist/project-access.d.ts +0 -17
- package/dist/project-activity.d.ts +0 -20
- package/dist/project-admission.d.ts +0 -105
- package/dist/project-cli.d.ts +0 -19
- package/dist/project-concurrency.d.ts +0 -62
- package/dist/project-delete-ui.d.ts +0 -96
- package/dist/project-delete.d.ts +0 -59
- package/dist/project-demo.d.ts +0 -12
- package/dist/project-file.d.ts +0 -3
- package/dist/project-identity.d.ts +0 -52
- package/dist/project-knowledge.d.ts +0 -124
- package/dist/project-learning.d.ts +0 -120
- package/dist/project-memory.d.ts +0 -70
- package/dist/project-outcomes.d.ts +0 -119
- package/dist/project-sandbox.d.ts +0 -59
- package/dist/project-skills.d.ts +0 -139
- package/dist/project-tools.d.ts +0 -318
- package/dist/project.d.ts +0 -65
- package/dist/prompt.d.ts +0 -33
- package/dist/proof.d.ts +0 -457
- package/dist/proposal.d.ts +0 -70
- package/dist/protected-storage-look.d.ts +0 -1
- package/dist/protected-storage.d.ts +0 -98
- package/dist/provider-auth.d.ts +0 -143
- package/dist/provider-capture.d.ts +0 -34
- package/dist/provider-connection.d.ts +0 -23
- package/dist/provider-home.d.ts +0 -22
- package/dist/provider-limits.d.ts +0 -37
- package/dist/provider.d.ts +0 -369
- package/dist/public-access.d.ts +0 -61
- package/dist/public-check.d.ts +0 -37
- package/dist/publish.d.ts +0 -146
- package/dist/pull-request-flow.d.ts +0 -189
- package/dist/pull-request-schema.d.ts +0 -5
- package/dist/pull-request-ui.d.ts +0 -25
- package/dist/pulls.d.ts +0 -121
- package/dist/push.d.ts +0 -120
- package/dist/quality.d.ts +0 -8
- package/dist/quick-start.d.ts +0 -26
- package/dist/read-executor-worker.d.ts +0 -1
- package/dist/read-executor.d.ts +0 -66
- package/dist/read-only-request.d.ts +0 -4
- package/dist/recipe-ui.d.ts +0 -21
- package/dist/recipes.d.ts +0 -56
- package/dist/release-adapters.d.ts +0 -205
- package/dist/release-approval.d.ts +0 -180
- package/dist/release-authority.d.ts +0 -173
- package/dist/release-auto.d.ts +0 -184
- package/dist/release-card.d.ts +0 -170
- package/dist/release-carry.d.ts +0 -261
- package/dist/release-ci-hold.d.ts +0 -41
- package/dist/release-cli.d.ts +0 -34
- package/dist/release-coverage.d.ts +0 -16
- package/dist/release-gate.d.ts +0 -84
- package/dist/release-git.d.ts +0 -43
- package/dist/release-links.d.ts +0 -29
- package/dist/release-net.d.ts +0 -90
- package/dist/release-next.d.ts +0 -48
- package/dist/release-recheck.d.ts +0 -146
- package/dist/release-refusal.d.ts +0 -32
- package/dist/release-view.d.ts +0 -37
- package/dist/release.d.ts +0 -806
- package/dist/releases.d.ts +0 -94
- package/dist/remote-audit.d.ts +0 -79
- package/dist/remote-command.d.ts +0 -45
- package/dist/remote-destination.d.ts +0 -36
- package/dist/remote-exec.d.ts +0 -38
- package/dist/remote-main.d.ts +0 -111
- package/dist/remote-run.d.ts +0 -20
- package/dist/remote.d.ts +0 -67
- package/dist/render.d.ts +0 -64
- package/dist/reply-shape.d.ts +0 -106
- package/dist/reply-voice.d.ts +0 -23
- package/dist/report-summary.d.ts +0 -22
- package/dist/reported-usage.d.ts +0 -69
- package/dist/repos.d.ts +0 -67
- package/dist/repository-context-ui.d.ts +0 -3
- package/dist/repository-context.d.ts +0 -66
- package/dist/request-budget-ui.d.ts +0 -14
- package/dist/request-budget.d.ts +0 -127
- package/dist/restart-certification.d.ts +0 -133
- package/dist/result-actions.d.ts +0 -36
- package/dist/result-acts.d.ts +0 -112
- package/dist/result-completion.d.ts +0 -39
- package/dist/result-evidence-readers.d.ts +0 -42
- package/dist/result-follow-ups.d.ts +0 -118
- package/dist/result-review.d.ts +0 -220
- package/dist/result-shots.d.ts +0 -59
- package/dist/retention-ui.d.ts +0 -21
- package/dist/retention.d.ts +0 -77
- package/dist/review-context.d.ts +0 -245
- package/dist/review-evidence.d.ts +0 -33
- package/dist/review-switch.d.ts +0 -36
- package/dist/reviewer.d.ts +0 -99
- package/dist/route-change-check.d.ts +0 -4
- package/dist/route-change.d.ts +0 -22
- package/dist/route-hooks.d.ts +0 -54
- package/dist/route-results.d.ts +0 -75
- package/dist/route-rules.d.ts +0 -324
- package/dist/route-savings.d.ts +0 -136
- package/dist/route-store.d.ts +0 -300
- package/dist/run-closeout.d.ts +0 -89
- package/dist/run-efficiency.d.ts +0 -74
- package/dist/run-ending.d.ts +0 -21
- package/dist/runner-process.d.ts +0 -76
- package/dist/runner.d.ts +0 -324
- package/dist/sample-project.d.ts +0 -31
- package/dist/sandbox-launch.d.ts +0 -1
- package/dist/sandbox-runtime.d.ts +0 -128
- package/dist/scan.d.ts +0 -32
- package/dist/scope.d.ts +0 -1098
- package/dist/scout-browser-lock.d.ts +0 -69
- package/dist/scout-browser.d.ts +0 -107
- package/dist/scout-net.d.ts +0 -25
- package/dist/scout-report.d.ts +0 -23
- package/dist/scout.d.ts +0 -142
- package/dist/secret-mint.d.ts +0 -1
- package/dist/serve.d.ts +0 -11
- package/dist/server/agents-computers.d.ts +0 -9
- package/dist/server/agents-live-filed.d.ts +0 -17
- package/dist/server/agents-live-lead.d.ts +0 -47
- package/dist/server/agents-live-room.d.ts +0 -23
- package/dist/server/chat.d.ts +0 -39
- package/dist/server/chrome.d.ts +0 -328
- package/dist/server/edge-refusal.d.ts +0 -7
- package/dist/server/flows.d.ts +0 -8
- package/dist/server/guards.d.ts +0 -81
- package/dist/server/handler-context.d.ts +0 -22
- package/dist/server/handler-registry.d.ts +0 -23
- package/dist/server/home-asks.d.ts +0 -45
- package/dist/server/home.d.ts +0 -65
- package/dist/server/http.d.ts +0 -337
- package/dist/server/in-place.d.ts +0 -15
- package/dist/server/kit-standalone.d.ts +0 -22
- package/dist/server/kit.d.ts +0 -452
- package/dist/server/last-checks.d.ts +0 -17
- package/dist/server/live.d.ts +0 -74
- package/dist/server/merge-ready-view.d.ts +0 -10
- package/dist/server/mutation-key.d.ts +0 -70
- package/dist/server/pages-assets.d.ts +0 -11
- package/dist/server/pages.d.ts +0 -8
- package/dist/server/people-tokens.d.ts +0 -18
- package/dist/server/remote-hooks.d.ts +0 -29
- package/dist/server/remote.d.ts +0 -60
- package/dist/server/render-chat.d.ts +0 -439
- package/dist/server/render-code-map.d.ts +0 -30
- package/dist/server/render-flaky.d.ts +0 -20
- package/dist/server/render-follow-through.d.ts +0 -11
- package/dist/server/render-history.d.ts +0 -51
- package/dist/server/render-new-task.d.ts +0 -54
- package/dist/server/render-pages.d.ts +0 -236
- package/dist/server/render-people.d.ts +0 -102
- package/dist/server/render-projects.d.ts +0 -104
- package/dist/server/render-release.d.ts +0 -19
- package/dist/server/render-results.d.ts +0 -758
- package/dist/server/render-settings.d.ts +0 -93
- package/dist/server/render-tasks.d.ts +0 -783
- package/dist/server/request-context.d.ts +0 -78
- package/dist/server/retired-routes.d.ts +0 -17
- package/dist/server/route-policy.d.ts +0 -18
- package/dist/server/route-table.d.ts +0 -114
- package/dist/server/runtime.d.ts +0 -343
- package/dist/server/session.d.ts +0 -192
- package/dist/server/settings.d.ts +0 -76
- package/dist/server/signup-gate.d.ts +0 -9
- package/dist/server/sweeps.d.ts +0 -4
- package/dist/server/task-views.d.ts +0 -98
- package/dist/server/tasks.d.ts +0 -108
- package/dist/server/terminals.d.ts +0 -31
- package/dist/server/welcome.d.ts +0 -28
- package/dist/server-telemetry.d.ts +0 -87
- package/dist/settings-groups-ui.d.ts +0 -286
- package/dist/settings-kit-script.d.ts +0 -21
- package/dist/settings-kit.d.ts +0 -173
- package/dist/settings-proofs.d.ts +0 -64
- package/dist/setup-guide.d.ts +0 -39
- package/dist/shared-deps.d.ts +0 -115
- package/dist/sign-in-guard.d.ts +0 -70
- package/dist/skills-ui.d.ts +0 -12
- package/dist/skills.d.ts +0 -99
- package/dist/slack-api.d.ts +0 -59
- package/dist/slack-chat.d.ts +0 -37
- package/dist/slack-settings.d.ts +0 -4
- package/dist/slack-socket.d.ts +0 -12
- package/dist/slack.d.ts +0 -6
- package/dist/sleep.d.ts +0 -2
- package/dist/source-key.d.ts +0 -2
- package/dist/spend-report.d.ts +0 -87
- package/dist/spend-ui.d.ts +0 -80
- package/dist/spend.d.ts +0 -142
- package/dist/sqlite-runtime.d.ts +0 -3
- package/dist/sqlite-telemetry.d.ts +0 -9
- package/dist/sso-settings.d.ts +0 -33
- package/dist/sso-ui.d.ts +0 -26
- package/dist/staged-runtimes.d.ts +0 -54
- package/dist/steer-capabilities.d.ts +0 -32
- package/dist/steer-controls.d.ts +0 -14
- package/dist/steer-live.d.ts +0 -19
- package/dist/steer-mailbox.d.ts +0 -46
- package/dist/steer-status.d.ts +0 -25
- package/dist/stop-proof.d.ts +0 -67
- package/dist/storage-sweep-child.d.ts +0 -1
- package/dist/storage-sweep-process.d.ts +0 -55
- package/dist/storage-sweep-schedule.d.ts +0 -30
- package/dist/storage-sweep.d.ts +0 -77
- package/dist/storage-ui.d.ts +0 -23
- package/dist/storage.d.ts +0 -68
- package/dist/store-baseline.d.ts +0 -19
- package/dist/store.d.ts +0 -8613
- package/dist/stream-scope.d.ts +0 -18
- package/dist/structured-output.d.ts +0 -57
- package/dist/style-asset.d.ts +0 -7
- package/dist/subagent-admin.d.ts +0 -53
- package/dist/subagent-desk.d.ts +0 -59
- package/dist/subagent-memory.d.ts +0 -65
- package/dist/subagent-question.d.ts +0 -59
- package/dist/subagent-tools.d.ts +0 -125
- package/dist/subagent-week.d.ts +0 -68
- package/dist/subagent-work.d.ts +0 -76
- package/dist/subagents-ui.d.ts +0 -22
- package/dist/subagents.d.ts +0 -146
- package/dist/subscription-chat.d.ts +0 -54
- package/dist/summary.d.ts +0 -33
- package/dist/surface.d.ts +0 -49
- package/dist/sweep-gate.d.ts +0 -10
- package/dist/sweep-quarantine.d.ts +0 -29
- package/dist/sync.d.ts +0 -94
- package/dist/tailnet.d.ts +0 -11
- package/dist/tamper-scan.d.ts +0 -4
- package/dist/task-activity.d.ts +0 -27
- package/dist/task-aliases.d.ts +0 -5
- package/dist/task-archive.d.ts +0 -13
- package/dist/task-base.d.ts +0 -39
- package/dist/task-composer.d.ts +0 -14
- package/dist/task-control.d.ts +0 -159
- package/dist/task-live.d.ts +0 -8
- package/dist/task-moves.d.ts +0 -90
- package/dist/task-outcome-cli.d.ts +0 -48
- package/dist/task-review-brief.d.ts +0 -69
- package/dist/task-sizing.d.ts +0 -58
- package/dist/task-source.d.ts +0 -77
- package/dist/task-status.d.ts +0 -324
- package/dist/task-text.d.ts +0 -31
- package/dist/team-chat-authorization.d.ts +0 -11
- package/dist/team-contract.d.ts +0 -103
- package/dist/team-http.d.ts +0 -25
- package/dist/team-leads.d.ts +0 -85
- package/dist/team-runtime.d.ts +0 -25
- package/dist/team-ui.d.ts +0 -4
- package/dist/team-updates.d.ts +0 -8
- package/dist/teams-api.d.ts +0 -33
- package/dist/teams-chat.d.ts +0 -36
- package/dist/teams-settings.d.ts +0 -14
- package/dist/teams.d.ts +0 -24
- package/dist/teardown-git.d.ts +0 -164
- package/dist/telegram-flow.d.ts +0 -112
- package/dist/telegram-lead.d.ts +0 -151
- package/dist/telegram-live.d.ts +0 -116
- package/dist/telegram-progress.d.ts +0 -20
- package/dist/telegram-settings.d.ts +0 -9
- package/dist/telegram-status.d.ts +0 -83
- package/dist/telegram-team.d.ts +0 -68
- package/dist/telegram.d.ts +0 -271
- package/dist/templates.d.ts +0 -69
- package/dist/terminal-catalog.d.ts +0 -11
- package/dist/terminal-text.d.ts +0 -11
- package/dist/test-infra.d.ts +0 -34
- package/dist/test-temp.d.ts +0 -40
- package/dist/text-limits.d.ts +0 -297
- package/dist/tidy.d.ts +0 -130
- package/dist/tier-report.d.ts +0 -44
- package/dist/token-notices.d.ts +0 -11
- package/dist/tokens-cli.d.ts +0 -21
- package/dist/tool-broker.d.ts +0 -52
- package/dist/tool-launcher.d.ts +0 -1
- package/dist/tool-secret-store.d.ts +0 -167
- package/dist/toolroll-update-cli.d.ts +0 -15
- package/dist/toolroll-update-ui.d.ts +0 -47
- package/dist/toolroll-update.d.ts +0 -265
- package/dist/tools-ui.d.ts +0 -51
- package/dist/transitions-recipes.d.ts +0 -1
- package/dist/tree-proof.d.ts +0 -34
- package/dist/tui-contract.d.ts +0 -202
- package/dist/tui-source.d.ts +0 -14
- package/dist/typed-start.d.ts +0 -51
- package/dist/unfenced-test-support.d.ts +0 -2
- package/dist/up-processes.d.ts +0 -162
- package/dist/up-role-child.d.ts +0 -1
- package/dist/update-notice.d.ts +0 -5
- package/dist/vanished-retry.d.ts +0 -30
- package/dist/verification-evidence.d.ts +0 -68
- package/dist/version.d.ts +0 -2
- package/dist/wake-hub.d.ts +0 -72
- package/dist/webhook-limits.d.ts +0 -23
- package/dist/webhook-readers.d.ts +0 -56
- package/dist/webhook-signing.d.ts +0 -27
- package/dist/webhooks.d.ts +0 -84
- package/dist/welcome-facts.d.ts +0 -18
- package/dist/when-html.d.ts +0 -40
- package/dist/work-index.d.ts +0 -175
- package/dist/work-summary.d.ts +0 -61
- package/dist/workspace-motion.d.ts +0 -4
- package/dist/workspace-revision.d.ts +0 -48
- package/dist/workspace-ui.d.ts +0 -385
- package/dist/worktree-notices.d.ts +0 -13
- package/dist/worktree.d.ts +0 -365
- package/dist/writes-mode.d.ts +0 -9
- package/dist/youiyoux-intake.d.ts +0 -234
package/dist/invoke.js
CHANGED
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The invocation gateway: the only door to any provider binary (§5).
|
|
3
|
-
*
|
|
4
|
-
* "Never let an LLM poll" is only enforceable if there is exactly one place
|
|
5
|
-
* that can start an LLM, and this is it. Every call verifies an open run
|
|
6
|
-
* record WHOSE RECORDED PROVIDER MATCHES the one about to spawn (a repair
|
|
7
|
-
* resumed on the wrong harness is a meaningless session id and a silent
|
|
8
|
-
* fresh spend — refused here, structurally), stamps `provider_started_at`
|
|
9
|
-
* the instant before the process spawns, and parses usage off the envelope
|
|
10
|
-
* of EVERY completed process — nonzero exits included, because a failed
|
|
11
|
-
* turn still spent money and a cost report that skips failures is a
|
|
12
|
-
* smaller number, not a truer one.
|
|
13
|
-
*
|
|
14
|
-
* The architecture test asserts the boundary by imports, not by string
|
|
15
|
-
* scan: only this module imports the registry's spawning surface
|
|
16
|
-
* (`adapterFor`), and only builder, planner, reviewer, and scout import
|
|
17
|
-
* `invokeAgent`.
|
|
18
|
-
*/
|
|
19
1
|
import { takeEvalDispatch } from "./eval-gate.js";
|
|
20
2
|
import { adapterFor, auditOf, claudePluginEnv, isolationUnsupported, ALL_CREDENTIAL_ENV } from "./provider.js";
|
|
21
3
|
import { readProviderKey, readAuthModeStrict, PROVIDER_KEY_ENV, OWN_KEY_ENV } from "./keys.js";
|
|
@@ -54,11 +36,7 @@ import { proxyEnv, providerOnlyNetwork, repositoryEcosystems, resolveNetwork, st
|
|
|
54
36
|
import { claudeConfigDir, claudeDefaults, codexDefaults, codexHomeDir, isolatedCodexHome } from "./provider-home.js";
|
|
55
37
|
import { billingOf, claudeBillingFrom, seenBilling } from "./spend.js";
|
|
56
38
|
import { primaryResultEvent, topLevelEvent } from "./stream-scope.js";
|
|
57
|
-
/** "Within seconds": how soon a silent failed run must end for its stderr to
|
|
58
|
-
* be read for the sign-in signal. */
|
|
59
39
|
const AUTH_EARLY_EXIT_MS = 30_000;
|
|
60
|
-
// Fixed names only: neither setting values nor arbitrary JSON keys belong in
|
|
61
|
-
// diagnostics. The CLI's existing login stays where it is; no config is copied.
|
|
62
40
|
const CLAUDE_AUTH_ENV = [
|
|
63
41
|
"ANTHROPIC_API_KEY", "ANTHROPIC_BASE_URL", "ANTHROPIC_AUTH_TOKEN",
|
|
64
42
|
"CLAUDE_CODE_USE_BEDROCK", "CLAUDE_CODE_SKIP_BEDROCK_AUTH", "ANTHROPIC_BEDROCK_BASE_URL",
|
|
@@ -67,7 +45,6 @@ const CLAUDE_AUTH_ENV = [
|
|
|
67
45
|
"CLAUDE_CODE_USE_VERTEX", "CLAUDE_CODE_SKIP_VERTEX_AUTH", "ANTHROPIC_VERTEX_BASE_URL",
|
|
68
46
|
"ANTHROPIC_VERTEX_PROJECT_ID", "CLOUD_ML_REGION", "GOOGLE_APPLICATION_CREDENTIALS", "GOOGLE_CLOUD_PROJECT",
|
|
69
47
|
];
|
|
70
|
-
/** A value-only preflight: a settings-dependent login cannot survive empty setting sources. */
|
|
71
48
|
function claudeSettingsAuthProblem(configDir) {
|
|
72
49
|
let text;
|
|
73
50
|
try {
|
|
@@ -76,8 +53,6 @@ function claudeSettingsAuthProblem(configDir) {
|
|
|
76
53
|
catch (error) {
|
|
77
54
|
if (error.code === "ENOENT")
|
|
78
55
|
return null;
|
|
79
|
-
// A sandbox around the plane (a project check's fence, say) may hide the file while the CLI still signs in from its
|
|
80
|
-
// keychain. Isolated builds never load it, and a login that needed it fails within seconds and is reported as one.
|
|
81
56
|
const code = error.code;
|
|
82
57
|
if (code === "EPERM" || code === "EACCES")
|
|
83
58
|
return null;
|
|
@@ -102,20 +77,9 @@ function claudeSettingsAuthProblem(configDir) {
|
|
|
102
77
|
return keys.length === 0 ? null
|
|
103
78
|
: `Your Claude settings.json defines sign-in settings: ${keys.join(", ")}. Isolated builds do not load that file. Use a Claude login that works without these settings, or select another build provider in Settings. Toolroll has not changed your login or copied these values.`;
|
|
104
79
|
}
|
|
105
|
-
/**
|
|
106
|
-
* A provider can run the repository's own CLI. In a self-hosting build that
|
|
107
|
-
* must never mean "open the database that launched me": a migration from the
|
|
108
|
-
* candidate checkout would change the live schema underneath the older
|
|
109
|
-
* supervisor, and even a read can contend with its watch transaction. Every
|
|
110
|
-
* provider process therefore sees a unique disposable Toolroll
|
|
111
|
-
* database while retaining its normal HOME/XDG environment for subscriptions
|
|
112
|
-
* and unrelated developer tools.
|
|
113
|
-
*/
|
|
114
80
|
function isolatedAgentDatabase(runId) {
|
|
115
81
|
return isolatedChildDatabase(`agent-${runId}`);
|
|
116
82
|
}
|
|
117
|
-
/** Defend the durable registry even when a test or alternate transport calls
|
|
118
|
-
* the callback directly instead of passing through an in-tree JSONL runner. */
|
|
119
83
|
function transportSessionId(id) {
|
|
120
84
|
if (typeof id !== "string")
|
|
121
85
|
return null;
|
|
@@ -134,11 +98,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
134
98
|
if (run.provider !== spec.provider) {
|
|
135
99
|
throw new Error(`run ${runId} was opened for ${run.provider} but ${spec.provider} is about to spawn — a session resumed across harnesses is not a session`);
|
|
136
100
|
}
|
|
137
|
-
// Session selection is durable authority, not an argv-only hint. A resumed
|
|
138
|
-
// turn must name exactly the canonical identity already recorded on THIS
|
|
139
|
-
// run before anything awaits or spawns. That makes a wrong child-row id a
|
|
140
|
-
// caller bug in the same class as a wrong provider, and prevents COALESCE's
|
|
141
|
-
// first-write rule from leaving row A while the process actually resumes B.
|
|
142
101
|
const recordedSessionId = transportSessionId(run.sessionId);
|
|
143
102
|
if (run.sessionId !== null && recordedSessionId === null) {
|
|
144
103
|
throw new Error(`run ${runId} carries an empty durable session identity — nothing resumes an identity the registry cannot name`);
|
|
@@ -162,16 +121,11 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
162
121
|
if (recordedSessionId !== null && requestedResumeSessionId === null && startSessionId !== recordedSessionId) {
|
|
163
122
|
throw new Error(`run ${runId} already records session ${recordedSessionId} but this invocation neither resumes nor starts under it`);
|
|
164
123
|
}
|
|
165
|
-
// An eval world (eval-gate.ts, docs/plans/evals-nightly.md part C): every dispatch takes one of the attempt's slots,
|
|
166
|
-
// named for this run so the runner can match it to the run's record; past the case's limit nothing spawns. Outside
|
|
167
|
-
// an eval world this changes nothing.
|
|
168
124
|
const evalSlot = takeEvalDispatch(`run:${runId}`);
|
|
169
125
|
if (evalSlot.active && !evalSlot.ok)
|
|
170
126
|
return { kind: "refused", reason: "containment", providerVersion: null, diagnostic: evalSlot.why };
|
|
171
127
|
const adapter = adapterFor(spec.provider);
|
|
172
128
|
const { startSessionId: _untrustedStartSessionId, streamInput: _untrustedStreamInput, ...invocationWithoutStart } = invocation;
|
|
173
|
-
// Live input (live-input.ts): only Claude's builds, only through a transport that keeps stdin open. The brief is
|
|
174
|
-
// the session's first stdin message and never rides the argv; every other road keeps its prompt where it was.
|
|
175
129
|
const liveInput = spec.provider === "claude" && invocation.phase === "build" && options.liveInput !== undefined && streamsInput(options.runner ?? adapter.defaultRunner)
|
|
176
130
|
? options.liveInput
|
|
177
131
|
: null;
|
|
@@ -184,19 +138,11 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
184
138
|
};
|
|
185
139
|
const argv = adapter.argv(resolvedInvocation);
|
|
186
140
|
const stdin = adapter.stdin?.(resolvedInvocation);
|
|
187
|
-
// Long-running phases pass idleTimeoutMs: the process has no absolute
|
|
188
|
-
// deadline and is stopped only after a full no-output interval. Bounded
|
|
189
|
-
// callers (notably repair) keep timeoutMs and its hard wall clock. A
|
|
190
|
-
// legacy caller that names neither retains the historic bounded default.
|
|
191
141
|
const hardTimeoutMs = options.timeoutMs === undefined ? undefined : adapter.clampTimeout(invocation.phase, options.timeoutMs);
|
|
192
142
|
const idleTimeoutMs = options.idleTimeoutMs === undefined ? undefined : adapter.clampTimeout(invocation.phase, options.idleTimeoutMs);
|
|
193
143
|
const defaultTimeoutMs = hardTimeoutMs === undefined && idleTimeoutMs === undefined
|
|
194
144
|
? adapter.clampTimeout(invocation.phase, 30 * 60_000)
|
|
195
145
|
: undefined;
|
|
196
|
-
// Tier-2 attestation (A2/B3): the authoritative check, immediately
|
|
197
|
-
// before the spawn it authorizes. Tier-1 providers return null here and
|
|
198
|
-
// keep their road byte-identical.
|
|
199
|
-
// An ACP agent is admitted by its own record (acp-attest.ts), read below; the version ranges are for the others.
|
|
200
146
|
const attested = isAcpProvider(spec.provider) ? null : await attestProvider(spec.provider, adapter.binary, options.versionProbe);
|
|
201
147
|
if (attested !== null && !attested.ok) {
|
|
202
148
|
if (attested.version !== null)
|
|
@@ -208,18 +154,11 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
208
154
|
diagnostic: attested.problem,
|
|
209
155
|
};
|
|
210
156
|
}
|
|
211
|
-
// AN ACP AGENT'S ADMISSION (docs/plans/acp-adapter.md § Admission): a passed conformance check of the exact binary
|
|
212
|
-
// on this runner, or nothing runs — absence is denial. It builds and repairs only, on a model it offered when it was
|
|
213
|
-
// checked, and no dollar cap rides it (it can't hold one; the scheduler refuses capped work first, this is the belt).
|
|
214
|
-
// An ACP spawn is admitted by its agent's attestation on this runner — or, for the conformance check alone, by the
|
|
215
|
-
// check request that will create it (acpCheck: set only by the check job). The two never stand in for each other.
|
|
216
157
|
const acpCheckAsk = options.acpCheck ?? null;
|
|
217
158
|
const acpAttestation = isAcpProvider(spec.provider) && acpCheckAsk === null ? store.acpAttestationFor(spec.provider, run.runner) : null;
|
|
218
159
|
const acpCheckRequest = isAcpProvider(spec.provider) && acpCheckAsk !== null ? store.acpCheckAdmitting(acpCheckAsk.requestId, acpCheckAsk.step, runId, clock()) : null;
|
|
219
160
|
const acpCheckLaunch = acpCheckRequest?.launchJson == null ? null : launchFromJson(acpCheckRequest.launchJson);
|
|
220
|
-
/** The plane's own isolation reading for a check's first step (below, before spawn); null when none was asked. */
|
|
221
161
|
let acpIsolation = null;
|
|
222
|
-
/** What starts the agent, and who the handshake must say it is (unknown, for a check: the check learns it). */
|
|
223
162
|
const acpLaunch = acpAttestation !== null ? acpAttestation.launch : acpCheckLaunch;
|
|
224
163
|
if (!isAcpProvider(spec.provider) && acpCheckAsk !== null)
|
|
225
164
|
throw new Error("only an ACP agent is checked");
|
|
@@ -245,29 +184,15 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
245
184
|
}
|
|
246
185
|
if (invocation.maxBudgetUsd !== undefined)
|
|
247
186
|
return refuse(`${name} can't hold a dollar cap, so it doesn't run capped work (budget-unenforceable)`);
|
|
248
|
-
// The billing the run was admitted under must be for the model about to be chosen.
|
|
249
187
|
const stamp = store.acpBillingOfRun(runId);
|
|
250
188
|
if (stamp !== null && stamp.model !== spec.model)
|
|
251
189
|
return refuse(`this run was admitted to bill ${stamp.model}, not ${spec.model}`);
|
|
252
|
-
// And the money moment holds it to the hard monthly budgets as stamped — immutable since admission, so a
|
|
253
|
-
// declaration changed between a gate and this spawn changes nothing: metered work a budget holds never starts.
|
|
254
190
|
const billed = stamp?.kind === "plan" ? "subscription" : "api-key";
|
|
255
191
|
const held = store.budgetGate(clock())({ ...store.budgetSubject(run.taskRef), agents: [{ provider: spec.provider, billing: billed }] });
|
|
256
192
|
if (held.over !== null)
|
|
257
193
|
return refuse(`a monthly budget holds metered work, and ${name} on ${spec.model ?? "this model"} is metered here (budget)`);
|
|
258
194
|
}
|
|
259
|
-
// Auth mode decides how the credential reaches the process (the operator
|
|
260
|
-
// keeps BOTH and prefers the subscription): in "api-key" mode the
|
|
261
|
-
// managed file wins, the ambient env is a real fallback (explicit
|
|
262
|
-
// re-supply survives resolveChildEnv's chat-key strip); in
|
|
263
|
-
// "subscription" mode the key is STRIPPED from the child so the CLI's
|
|
264
|
-
// own login is used — its key is retained, just not handed over.
|
|
265
195
|
const { runner, clock: _clock, versionProbe: _probe, keyHome, timeoutMs: _hardTimeout, idleTimeoutMs: _idleTimeout, stdin: _callerStdin, accumulateUsage: _accumulateUsage, liveInput: _liveInput, acpCheck: _acpCheck, network: launchNetwork, writes: launchWrites, sandbox: launchSandbox, ...runOptions } = options;
|
|
266
|
-
// The live setting is read STRICTLY (atomic authority closure): a
|
|
267
|
-
// present mode file that says neither word is a value-shaped refusal
|
|
268
|
-
// before any stamp or process — never the subscription default a
|
|
269
|
-
// lenient read would coerce it to, which would spend on a credential
|
|
270
|
-
// the seal never proved. The same reader gates filing and the seal.
|
|
271
196
|
const strict = readAuthModeStrict(spec.provider, keyHome);
|
|
272
197
|
if (!strict.ok) {
|
|
273
198
|
return {
|
|
@@ -277,7 +202,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
277
202
|
diagnostic: strict.problem,
|
|
278
203
|
};
|
|
279
204
|
}
|
|
280
|
-
// A run on an approved chain spends under the auth mode that entry was pinned to, never the provider's current setting.
|
|
281
205
|
const pinned = invocation.phase === "review" ? null : pinnedEntryOf(store, runId);
|
|
282
206
|
if (pinned !== null && "problem" in pinned) {
|
|
283
207
|
return { kind: "refused", reason: "route-authority", providerVersion: attested === null ? null : attested.version, diagnostic: `the fallback agent's authority lapsed before spawn — ${pinned.problem}` };
|
|
@@ -288,24 +212,17 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
288
212
|
if (problem !== null)
|
|
289
213
|
return { kind: "refused", reason: "auth-mode", providerVersion: attested?.version ?? null, diagnostic: problem };
|
|
290
214
|
}
|
|
291
|
-
// An ACP agent has no key Toolroll holds or injects: its own and everyone else's are shed (adapter.extraOmitEnv).
|
|
292
215
|
const keyed = isKeyedProvider(spec.provider) ? spec.provider : null;
|
|
293
216
|
const ownKeyEnv = keyed === null ? [] : OWN_KEY_ENV[keyed];
|
|
294
217
|
const keyEnvName = keyed === null ? null : PROVIDER_KEY_ENV[keyed];
|
|
295
218
|
const managedKey = authMode === "api-key" && keyed !== null && keyEnvName !== null
|
|
296
219
|
? readProviderKey(keyed, keyHome) ?? (process.env[keyEnvName] || null)
|
|
297
220
|
: null;
|
|
298
|
-
// A pinned API key that isn't there never falls through to some other credential.
|
|
299
221
|
if (pinned !== null && authMode === "api-key" && managedKey === null) {
|
|
300
222
|
return { kind: "refused", reason: "auth-mode", providerVersion: attested === null ? null : attested.version, diagnostic: `this fallback agent is approved on an API key, and ${spec.provider} has none here` };
|
|
301
223
|
}
|
|
302
|
-
// What decides the child's credential, computed once: the environment it starts from and every variable it sheds. The
|
|
303
|
-
// live plan proof below reads with exactly these, and the child launches with exactly these (childOmitEnv).
|
|
304
224
|
const childAuth = childAuthEnv({ provider: spec.provider, phase: invocation.phase, authMode, keyEnvName, ownKeyEnv,
|
|
305
225
|
extraOmitEnv: adapter.extraOmitEnv, runEnv: runOptions.env, runOmitEnv: runOptions.omitEnv });
|
|
306
|
-
// A fallback agent approved on its plan runs only on a login its CLI proves, live, is that plan: read with the run's
|
|
307
|
-
// own environment, before anything is started for it (no proxy, tools or homes to leave behind). A provider with no
|
|
308
|
-
// live proof never gets here (filing refuses it); if one does, it's refused too. A key is never read as paid.
|
|
309
226
|
if (pinned !== null && pinned.index > 0 && authMode === "subscription") {
|
|
310
227
|
const live = PLAN_LOGIN_PROVABLE.has(spec.provider)
|
|
311
228
|
? await livePlanLogin(spec.provider, attested !== null ? attested.executable : adapter.binary, childAuth.omitEnv, childAuth.env)
|
|
@@ -316,55 +233,26 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
316
233
|
diagnostic: `this fallback agent is approved on its plan, and ${spec.provider} isn't signed in to one here${live === "api-key" ? " (it's signed in another way)" : ""}` };
|
|
317
234
|
}
|
|
318
235
|
}
|
|
319
|
-
// Resume XOR mint, enforced at the GATEWAY (Codex gemini verify round 2,
|
|
320
|
-
// finding 3): a resume and a minted start id are mutually exclusive —
|
|
321
|
-
// geminiArgv silently prefers --resume, so a minted id that rides
|
|
322
|
-
// alongside a resume would be stamped and later enforced against an
|
|
323
|
-
// envelope that never carried it, a paid protocol refusal. When resuming,
|
|
324
|
-
// the minted id is dropped here, before it is ever stamped.
|
|
325
|
-
// The minted session identity (A5): stamped durably BEFORE the start
|
|
326
|
-
// stamp — intent precedes the process, and the envelope must later
|
|
327
|
-
// MATCH this id or the run fails typed.
|
|
328
236
|
if (startSessionId !== undefined) {
|
|
329
237
|
store.stampRun(runId, { sessionId: startSessionId });
|
|
330
238
|
}
|
|
331
239
|
const spawn = witnessedRunner(store, runId, clock, runner ?? adapter.defaultRunner);
|
|
332
240
|
let transportAnnouncedSessionId = null;
|
|
333
241
|
let transportSessionConflict = false;
|
|
334
|
-
// B3: the attested executable IS the spawned executable — one resolution.
|
|
335
|
-
// A MANAGED key reaches exactly its own provider's child environment
|
|
336
|
-
// (keys.ts): the foreign-credential strip already shed everybody
|
|
337
|
-
// else's, and the plane's own env never needed to carry it. A key
|
|
338
|
-
// already ambient in the environment keeps working; the managed file,
|
|
339
|
-
// being deliberate, wins.
|
|
340
242
|
const isolatedDb = isolatedAgentDatabase(runId);
|
|
341
|
-
// Where the build runs: Claude reads the repository's CLAUDE.md from here.
|
|
342
243
|
const workspace = invocation.phase === "review" ? null : runOptions.cwd ?? run.worktree ?? null;
|
|
343
|
-
// How a tool server the broker starts is fenced: as its agent is, once that fence is fixed below.
|
|
344
244
|
let serverFence = null;
|
|
345
|
-
// The run's containment, fixed before any tool is prepared: this platform and the OS fence its run gets (a build
|
|
346
|
-
// has one wherever the plane has a database to fence). It decides which tools may hold secrets in a process the
|
|
347
|
-
// build could otherwise read; nothing the launch or the checkout writes feeds it.
|
|
348
245
|
const containment = { platform: process.platform, fence: invocation.phase === "review" ? "none" : fenceMethod(spec.provider, store.databaseFile() !== null) };
|
|
349
|
-
// The project's tools (v80): exactly its MCP servers, and none of the
|
|
350
|
-
// operator's global or a repository's own, served by this launch's broker
|
|
351
|
-
// (tool-broker.ts), which alone holds their secrets. A review keeps its isolation.
|
|
352
|
-
// Set once the fence is known: a fenced build's servers never start outside a fence.
|
|
353
246
|
let serverMustBeFenced = false;
|
|
354
|
-
// Pinned for the attempt (sandbox parity C11): whether an instance operator allowed unconfined agents, read once now.
|
|
355
|
-
// A tool server the agent starts late gets the decision this attempt launched with, never one changed meanwhile.
|
|
356
247
|
const unconfinedAtLaunch = store.unfencedAgentsAllowed();
|
|
357
|
-
// What the build writes (its checkout, its project's caches): a tool server never runs from there, nor reads it at all.
|
|
358
248
|
const serverUntrusted = workspace === null ? [] : toolUntrusted(store, workspace, keyHome);
|
|
359
249
|
const launchTools = invocation.phase === "review" ? null : await runTools(store, runId, spec, options.keyHome, clock, invocation.readOnlyTools, invocation.researchWithheld, containment, {
|
|
360
250
|
env: { ...process.env, ...(runOptions.env ?? {}) },
|
|
361
251
|
omitEnv: [...(runOptions.omitEnv ?? []), ...ALL_CREDENTIAL_ENV],
|
|
362
252
|
pass: childDatabaseEnv(isolatedDb.file),
|
|
363
|
-
// A tool server starts in a folder the build can't write, and never runs the build's own bytes (arc 2).
|
|
364
253
|
cwd: keyHome ?? homedir(),
|
|
365
254
|
untrusted: serverUntrusted,
|
|
366
255
|
wrap: () => serverFence,
|
|
367
|
-
// A fenced build's tool servers start only in a fence too, unless an instance operator allowed unconfined agents.
|
|
368
256
|
unwrapped: () => serverMustBeFenced && !unconfinedAtLaunch
|
|
369
257
|
? "This machine can't confine the tool's server (no macOS sandbox, no working bubblewrap), so it was not started." : null,
|
|
370
258
|
});
|
|
@@ -374,7 +262,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
374
262
|
}
|
|
375
263
|
const tools = launchTools;
|
|
376
264
|
const codexHarness = spec.provider === "codex" || spec.provider === "openrouter";
|
|
377
|
-
// A Codex build's own CODEX_HOME (provider-home.ts): the operator's sign-in and sessions, linked, and nothing else.
|
|
378
265
|
let codexHome = null;
|
|
379
266
|
if (codexHarness && invocation.phase !== "review") {
|
|
380
267
|
try {
|
|
@@ -386,13 +273,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
386
273
|
return { kind: "refused", reason: "containment", providerVersion: attested?.version ?? null, diagnostic: "The build's private Codex home could not be created; check access to its sign-in and sessions folders, then retry." };
|
|
387
274
|
}
|
|
388
275
|
}
|
|
389
|
-
// The agent fence: Toolroll's own secrets, database and other runs'
|
|
390
|
-
// evidence stay out of reach, whatever the permission mode. A review is
|
|
391
|
-
// already confined to its sealed files.
|
|
392
|
-
// A build's fence also holds its task boundary: home configuration and
|
|
393
|
-
// the repositories beside its own, fresh and resumed alike. Codex starts
|
|
394
|
-
// tool servers outside its command sandbox, so its own launch folder is
|
|
395
|
-
// fenced too; Claude reads its config from there, inside the sandbox.
|
|
396
276
|
const ownTools = tools?.privateDir === undefined ? null : realpathSync(tools.privateDir);
|
|
397
277
|
const fenceOf = invocation.phase === "review" ? { fence: [], fileTools: [], grants: NO_GRANTS, gitPaths: [], cache: undefined, problem: undefined } : await runFence(store, runId, spec.provider, options.keyHome, codexHarness ? null : ownTools, launchWrites ?? WRITES_DEFAULT, launchSandbox ?? LEGACY_SANDBOX);
|
|
398
278
|
if (fenceOf.problem !== undefined) {
|
|
@@ -403,10 +283,7 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
403
283
|
}
|
|
404
284
|
const fence = [...fenceOf.fence, ...(fenceOf.fence.length > 0 && codexHarness ? [ownTools, codexHome === null ? null : realpathSync(codexHome.dir)].filter((path) => path !== null) : [])];
|
|
405
285
|
const grants = { ...fenceOf.grants };
|
|
406
|
-
// The run's network (egress.ts): sealed by its approval, or the provider's hosts alone, or the caller's own proxy.
|
|
407
286
|
const network = launchNetwork ?? { policy: providerOnlyNetwork(spec.provider) };
|
|
408
|
-
// Codex's command sandbox has no proxy (its argv is fixed just below): its commands are online only for a sealed
|
|
409
|
-
// open network, and offline otherwise.
|
|
410
287
|
if (fence.length > 0 && codexHarness) {
|
|
411
288
|
grants.network = "policy" in network && network.policy.mode === "open" ? { mode: "open" }
|
|
412
289
|
: { mode: "allowlist", proxyPort: 0, brokerPorts: [], loopback: "proxy-only", socketRoots: [] };
|
|
@@ -415,38 +292,26 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
415
292
|
const buildInvocation = { ...resolvedInvocation, ...(tools === null ? {} : { toolArgv: tools.argv, fence, fenceGrants: grants, fileToolFence: fenceOf.fileTools }), ...(workspace === null ? {} : { workspace }), ...(inherited === undefined ? {} : { inherited }) };
|
|
416
293
|
const launchArgv = tools === null ? argv : adapter.argv(buildInvocation);
|
|
417
294
|
const fenced = fenceLaunch(spec.provider, fence);
|
|
418
|
-
// An ACP agent runs only inside the OS fence: nothing else holds it (it may run commands without asking).
|
|
419
295
|
if (isAcpProvider(spec.provider) && fenced.method !== "macos-sandbox" && fenced.method !== "linux-bubblewrap") {
|
|
420
296
|
tools?.cleanup();
|
|
421
297
|
codexHome?.cleanup();
|
|
422
298
|
removeAgentDatabase(isolatedDb.dir);
|
|
423
299
|
return { kind: "refused", reason: "containment", providerVersion: acpAttestation?.agent.version ?? null, diagnostic: `${ACP_AGENTS[spec.provider].name} runs only inside the OS fence (the macOS sandbox or bubblewrap), and this launch has neither (fence-unavailable)` };
|
|
424
300
|
}
|
|
425
|
-
// The tools were chosen for the fence decided above: a launch that got any other starts nothing.
|
|
426
|
-
// Only a prepared project-tool broker depends on the earlier decision. Empty Claude configs also have a privateDir.
|
|
427
301
|
if (tools?.serverPids !== undefined && fenced.method !== containment.fence) {
|
|
428
302
|
tools.cleanup();
|
|
429
303
|
codexHome?.cleanup();
|
|
430
304
|
removeAgentDatabase(isolatedDb.dir);
|
|
431
305
|
return { kind: "refused", reason: "containment", providerVersion: attested?.version ?? null, diagnostic: "The build's fence changed while its tools were prepared. Nothing was started; retry the task." };
|
|
432
306
|
}
|
|
433
|
-
// A tool server the broker starts is fenced by what this platform supports, whatever the provider: Codex's own
|
|
434
|
-
// profile fences only its agent's commands, and the broker starts servers outside it.
|
|
435
307
|
if (fence.length > 0) {
|
|
436
|
-
// A tool server keeps its own reach (it holds its tool's secrets, not the agent's code): never the agent's network,
|
|
437
|
-
// nor its write allowlist (a server keeps its own state where it always has).
|
|
438
308
|
const serverGrants = () => serverGrantsOf(grants);
|
|
439
|
-
// Nor read what the build wrote: however its arguments are spelled, no byte of the checkout or caches can load.
|
|
440
309
|
const serverDenies = [...fence, ...serverUntrusted.filter(path => existsSync(path)).map(path => realpathSync(path))];
|
|
441
|
-
// Pinned: the server fence this attempt launched with, a copy, whatever changes later (C11).
|
|
442
310
|
const pinned = structuredClone(serverGrants());
|
|
443
311
|
if (macosFenceAvailable() || linuxFenceAvailable())
|
|
444
312
|
serverFence = (file, args, cwd) => sandboxedSpawn(file, args, serverDenies, pinned, cwd);
|
|
445
313
|
serverMustBeFenced = true;
|
|
446
314
|
}
|
|
447
|
-
// No silent fallback (arc 1): a build this machine can't confine at the OS — Claude reduced to its own file-tool
|
|
448
|
-
// rules, Gemini to nothing — doesn't start unless the instance operator allowed unconfined agents here. An injected
|
|
449
|
-
// runner (tests) starts no real agent.
|
|
450
315
|
const unconfined = fence.length > 0 && (fenced.method === "claude-rules" || fenced.method === "none");
|
|
451
316
|
if (unconfined && runner === undefined && !store.unfencedAgentsAllowed()) {
|
|
452
317
|
tools?.cleanup();
|
|
@@ -460,8 +325,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
460
325
|
const confinedOs = fenced.method === "macos-sandbox" || fenced.method === "linux-bubblewrap";
|
|
461
326
|
if (fence.length > 0 && !codexHarness && confinedOs) {
|
|
462
327
|
const brokerPorts = tools?.brokerPort === undefined ? [] : [tools.brokerPort];
|
|
463
|
-
// Unix sockets only under this run's own folders: its checkout, and a temp folder of its own inside its private
|
|
464
|
-
// launch folder (the system temp folder holds other programs' sockets — editors, agents, password managers).
|
|
465
328
|
if (ownTools !== null) {
|
|
466
329
|
runTemp = join(ownTools, "tmp");
|
|
467
330
|
mkdirSync(runTemp, { recursive: true, mode: 0o700 });
|
|
@@ -479,9 +342,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
479
342
|
egress = await startEgressProxy({ hosts: network.policy.hosts });
|
|
480
343
|
grants.network = { mode: "allowlist", proxyPort: egress.port, brokerPorts, loopback: network.policy.loopback, socketRoots, token: egress.secret };
|
|
481
344
|
}
|
|
482
|
-
// On Linux the build has a network of its own, and the sandbox runtime relays only two ports into it: the
|
|
483
|
-
// proxy's (3128) and a second (1080), which carries this run's tool broker. Claude's tool list names it there.
|
|
484
|
-
// (An injected runner, in tests, runs outside every sandbox and keeps the broker's own address.)
|
|
485
345
|
if (fenced.method === "linux-bubblewrap" && grants.network.mode === "allowlist" && runner === undefined && tools?.brokerPort !== undefined && tools.privateDir !== undefined) {
|
|
486
346
|
const list = join(tools.privateDir, "mcp.json");
|
|
487
347
|
if (existsSync(list))
|
|
@@ -497,14 +357,10 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
497
357
|
diagnostic: `The build's network could not be set up, so nothing was started: ${error instanceof Error ? error.message : String(error)}` };
|
|
498
358
|
}
|
|
499
359
|
}
|
|
500
|
-
// The attempt's pinned fence, stamped on the run (C11): its method, policy version, the digest of exactly what it was
|
|
501
|
-
// given, and the sandbox engine and version it runs in.
|
|
502
360
|
if (invocation.phase !== "review")
|
|
503
361
|
store.recordRunFence(runId, { method: fenced.method, paths: fence.length, policy: (launchSandbox ?? LEGACY_SANDBOX).policy,
|
|
504
362
|
digest: fenceDigest(fence, grants), engine: sandboxRuntimeWords() }, clock());
|
|
505
363
|
const billingSeen = { keySource: null, model: null, planWindows: false, answered: false };
|
|
506
|
-
// v105: a Codex run on its sign-in bills as Codex says it's signed in (a ChatGPT plan, or a saved key, or Bedrock),
|
|
507
|
-
// read right before it runs. Never with an injected runner: tests don't start a real Codex.
|
|
508
364
|
const codexLogin = spec.provider === "codex" && authMode === "subscription" && runner === undefined
|
|
509
365
|
? await codexLoginBilling(attested !== null ? attested.executable : adapter.binary, [...(runOptions.omitEnv ?? []), ...adapter.extraOmitEnv, ...ownKeyEnv])
|
|
510
366
|
: null;
|
|
@@ -512,30 +368,20 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
512
368
|
...(runOptions.env ?? {}),
|
|
513
369
|
...(adapter.env?.(buildInvocation) ?? {}),
|
|
514
370
|
...(tools?.env ?? {}),
|
|
515
|
-
// A fenced build's git never expires a reflog, so gc never rewrites another task's (agent-fence.ts).
|
|
516
371
|
...(fence.length > 0 ? fencedGitEnv({ ...process.env, ...(runOptions.env ?? {}) }) : {}),
|
|
517
372
|
...(codexHome === null ? {} : { CODEX_HOME: codexHome.dir }),
|
|
518
373
|
...(managedKey === null || keyEnvName === null ? {} : { [keyEnvName]: managedKey }),
|
|
519
|
-
// The run's own proxy, in every spelling a program reads (egress.ts): after every other setting, so no caller's
|
|
520
|
-
// environment points the build around it. A program that ignores them is refused by the OS fence instead.
|
|
521
374
|
...(egress === null || !("policy" in network) ? {} : proxyEnv(egress, network.policy.loopback)),
|
|
522
|
-
// Its own temp folder, where its tools' sockets may live (the only one its fence admits besides its checkout).
|
|
523
375
|
...(runTemp === null ? {} : { TMPDIR: runTemp, TMP: runTemp, TEMP: runTemp }),
|
|
524
|
-
// Claude's own working folder goes there too (it is otherwise the shared /tmp/claude-<uid>).
|
|
525
376
|
...(runTemp === null || spec.provider !== "claude" ? {} : { CLAUDE_CODE_TMPDIR: runTemp }),
|
|
526
|
-
// A workspace build's package managers keep their caches in its project's own folder (arc 2).
|
|
527
377
|
...(fenceOf.cache === undefined || grants.writes === undefined ? {} : buildCacheEnv(fenceOf.cache)),
|
|
528
|
-
// This key is deliberately last: no caller may point an agent back at
|
|
529
|
-
// the live control database through a generic RunOptions override.
|
|
530
378
|
...childDatabaseEnv(isolatedDb.file),
|
|
531
379
|
};
|
|
532
|
-
// The one omit list (childAuthEnv): the live plan proof read with this same list.
|
|
533
380
|
const childOmitEnv = childAuth.omitEnv;
|
|
534
381
|
const launchOptions = {
|
|
535
382
|
...(fenced.wrap.length === 0 ? {} : { fence: fenced.wrap, fenceGrants: grants, confinement: "required" }),
|
|
536
383
|
...runOptions,
|
|
537
384
|
...(workspace === null ? {} : { cwd: workspace }),
|
|
538
|
-
// v105: how the CLI really billed this turn (its key source, its plan's windows), read off its own stream.
|
|
539
385
|
onStreamEvent: event => {
|
|
540
386
|
observeClaudeBilling(billingSeen, event);
|
|
541
387
|
runOptions.onStreamEvent?.(event);
|
|
@@ -549,20 +395,13 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
549
395
|
},
|
|
550
396
|
...(stdin === undefined ? {} : { stdin }),
|
|
551
397
|
...(liveInput === null ? {} : { liveInput }),
|
|
552
|
-
// One ACP conversation: the brief, the sealed model, and who the check says the agent is.
|
|
553
398
|
...(acpLaunch === null || spec.model === null ? {} : { acp: { prompt: buildInvocation.brief, model: spec.model, expect: acpAttestation?.agent ?? null, ...(runOptions.acp?.onControl === undefined ? {} : { onControl: runOptions.acp.onControl }), ...(runOptions.acp?.handshakeMs === undefined ? {} : { handshakeMs: runOptions.acp.handshakeMs }) } }),
|
|
554
399
|
...(hardTimeoutMs === undefined ? {} : { timeoutMs: hardTimeoutMs }),
|
|
555
400
|
...(idleTimeoutMs === undefined ? {} : { idleTimeoutMs }),
|
|
556
401
|
...(defaultTimeoutMs === undefined ? {} : { timeoutMs: defaultTimeoutMs }),
|
|
557
402
|
env: childEnv,
|
|
558
403
|
omitEnv: childOmitEnv,
|
|
559
|
-
// Providers run in their own process group (M6.12): the harness spawns
|
|
560
|
-
// shells and tools of its own, and both the timeout and the watch's
|
|
561
|
-
// hard stop must end the whole tree, not orphan the grandchildren.
|
|
562
404
|
processGroup: true,
|
|
563
|
-
// The session registry's crash guarantee (M6.9): the id is stamped the
|
|
564
|
-
// moment the stream announces it, first write wins — a daemon that
|
|
565
|
-
// dies mid-turn still knows which session to offer the successor.
|
|
566
405
|
onSessionId: id => {
|
|
567
406
|
const normalized = transportSessionId(id);
|
|
568
407
|
if (normalized === null)
|
|
@@ -583,7 +422,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
583
422
|
const probeOptions = {
|
|
584
423
|
cwd: workspace, env: checkoutGitEnv({ ...inheritedEnv, ...childEnv }), omitEnv: childOmitEnv, envAllowlist: [],
|
|
585
424
|
};
|
|
586
|
-
// A broken checkout is not evidence of a broken fence. No provider is invoked by either check.
|
|
587
425
|
const gitArgs = [...HARDENED_GIT_ARGS, "rev-parse", "HEAD"];
|
|
588
426
|
const control = await runCommand("git", gitArgs, probeOptions);
|
|
589
427
|
if (control.code === 0) {
|
|
@@ -602,11 +440,7 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
602
440
|
}
|
|
603
441
|
}
|
|
604
442
|
}
|
|
605
|
-
// THE CHECK'S ISOLATION, PROVEN BY THE PLANE (docs/plans/acp-adapter.md § Layer E): inside the exact fence and
|
|
606
|
-
// child environment the agent is about to get, a canary file in the fenced state must be unreadable and a canary
|
|
607
|
-
// key in the launching environment must be absent. No agent takes part, so no agent can fake it.
|
|
608
443
|
if (acpCheckAsk?.isolation !== undefined && launchOptions.fence !== undefined && workspace !== null) {
|
|
609
|
-
// processGroup: run() applies the fence only on the process-group road (a plain execFile carries none).
|
|
610
444
|
const probe = { cwd: workspace, env: childEnv, omitEnv: childOmitEnv, fence: launchOptions.fence, confinement: "required", ...(launchOptions.fenceGrants === undefined ? {} : { fenceGrants: launchOptions.fenceGrants }), timeoutMs: 15_000, processGroup: true };
|
|
611
445
|
const read = await runCommand("/bin/cat", [acpCheckAsk.isolation.file], probe);
|
|
612
446
|
const env = await runCommand("/usr/bin/env", [], probe);
|
|
@@ -615,22 +449,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
615
449
|
envClear: env.code === 0 && !env.stdout.includes(acpCheckAsk.isolation.envValue),
|
|
616
450
|
};
|
|
617
451
|
}
|
|
618
|
-
// The stamp precedes the spawn, so a crash between the two leaves a run
|
|
619
|
-
// that claims spend which never happened — the honest direction. A spawn
|
|
620
|
-
// before the stamp would leave spend no record claims, which is the lie
|
|
621
|
-
// the invariant exists to rule out. For attested providers the probed
|
|
622
|
-
// version rides the SAME durable write (B2).
|
|
623
|
-
// The spawn leg of the runner gate (MCP spec v6, review finding 4):
|
|
624
|
-
// the tuple re-proven against LIVE rows AFTER every awaited step, in
|
|
625
|
-
// the same breath as the stamp — a takeover during the attestation
|
|
626
|
-
// await can no longer slip a stale process through.
|
|
627
|
-
// THE PLANNER'S ROUTE, RE-PROVED AT THE SPAWN (final authority closure):
|
|
628
|
-
// the provenance the planner was admitted under is held to the authority
|
|
629
|
-
// its task holds RIGHT NOW — the strict working projection of a filed
|
|
630
|
-
// scope (exact terms, resolved profile, route parity, digest,
|
|
631
|
-
// live auth mode), or the bare word `legacy` on a task with no scope. A
|
|
632
|
-
// scope rewritten, corrupted, or unresolved between the claim and this
|
|
633
|
-
// instant invokes no provider: a value-shaped refusal, no spend.
|
|
634
452
|
if (run.role === "planner") {
|
|
635
453
|
const proved = store.proveRouteForSpawn(runId, clock());
|
|
636
454
|
if (!proved.ok) {
|
|
@@ -650,10 +468,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
650
468
|
diagnostic: "the run's runner custody lapsed before spawn — the lease, the runner, or its repo binding no longer stands",
|
|
651
469
|
};
|
|
652
470
|
}
|
|
653
|
-
// THE STOP FENCE at the spawn (v52): a stop recorded against this run
|
|
654
|
-
// — or the attempt it runs under — before this instant spawns nothing.
|
|
655
|
-
// A value-shaped refusal, no stamp, no process, no spend; the road's
|
|
656
|
-
// settlement seals the attempt as interrupted.
|
|
657
471
|
const stopBeforeSpawn = store.applicableStopFor(runId);
|
|
658
472
|
if (stopBeforeSpawn !== null) {
|
|
659
473
|
return {
|
|
@@ -663,10 +477,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
663
477
|
diagnostic: `stopped by ${stopBeforeSpawn.requestedBy} (run #${stopBeforeSpawn.run}) before the provider spawned — nothing was spent`,
|
|
664
478
|
};
|
|
665
479
|
}
|
|
666
|
-
// THE CONTAINMENT FENCE at the spawn (OS containment plan): a required
|
|
667
|
-
// native policy this runner cannot meet — macOS, an undelegated cgroup,
|
|
668
|
-
// a missing helper — spawns nothing. A value-shaped refusal in the
|
|
669
|
-
// policy's own words, no stamp, no process, no spend.
|
|
670
480
|
const containment = currentContainment();
|
|
671
481
|
if (containment.refusal !== null) {
|
|
672
482
|
return {
|
|
@@ -676,9 +486,7 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
676
486
|
diagnostic: containment.refusal,
|
|
677
487
|
};
|
|
678
488
|
}
|
|
679
|
-
// The ACP launch re-proved HERE, after every await: each bound file is still the one that passed its check.
|
|
680
489
|
if (acpCheckAsk !== null && acpCheckRequest !== null && acpCheckLaunch !== null) {
|
|
681
|
-
// The check request is read again here, after every await: still running, unexpired, owned, this step's run.
|
|
682
490
|
const still = store.acpCheckAdmitting(acpCheckAsk.requestId, acpCheckAsk.step, runId, clock());
|
|
683
491
|
if (still === null || still.launchJson !== acpCheckRequest.launchJson) {
|
|
684
492
|
return { kind: "refused", reason: "provider-unattested", providerVersion: null, diagnostic: "the check stopped admitting this run while it was being set up — nothing was started" };
|
|
@@ -688,7 +496,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
688
496
|
return { kind: "refused", reason: "provider-unattested", providerVersion: null, diagnostic: verified.problem };
|
|
689
497
|
}
|
|
690
498
|
if (acpAttestation !== null) {
|
|
691
|
-
// The record is read again here, after every await: a check revoked or replaced during setup starts nothing.
|
|
692
499
|
const live = store.acpAttestationFor(spec.provider, run.runner);
|
|
693
500
|
if (live === null || live.id !== acpAttestation.id) {
|
|
694
501
|
return { kind: "refused", reason: "provider-unattested", providerVersion: acpAttestation.agent.version, diagnostic: `${ACP_AGENTS[spec.provider].name}'s check was revoked or replaced while this run was being set up — nothing was started` };
|
|
@@ -698,8 +505,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
698
505
|
return { kind: "refused", reason: "provider-unattested", providerVersion: acpAttestation.agent.version, diagnostic: verified.problem };
|
|
699
506
|
}
|
|
700
507
|
}
|
|
701
|
-
// THE CHAIN'S LAST LOOK (fallback.ts): the walk's place, the approval, and for a paid entry the live grant, read in
|
|
702
|
-
// the one transaction that stamps the spend, after every await.
|
|
703
508
|
const chainRefusal = store.transact(() => {
|
|
704
509
|
const custody = invocation.phase === "review" ? null : chainCustodyProblem(store, runId);
|
|
705
510
|
if (custody !== null)
|
|
@@ -715,14 +520,8 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
715
520
|
if (chainRefusal !== null) {
|
|
716
521
|
return { kind: "refused", reason: "route-authority", providerVersion: attested === null ? null : attested.version, diagnostic: `the fallback chain's authority lapsed before spawn — ${chainRefusal}` };
|
|
717
522
|
}
|
|
718
|
-
// The brief is queued only once the checkout has passed the fence check.
|
|
719
523
|
liveInput?.begin(invocation.brief);
|
|
720
524
|
spawnedAt = Date.now();
|
|
721
|
-
// Under the stop watch (v52): the run's stop row is re-read while the
|
|
722
|
-
// provider runs, and a stop kills THIS run's process group through the
|
|
723
|
-
// handle registered under its owner tag — the exact-attempt road,
|
|
724
|
-
// never the global sweep. Settlement then reads the same row.
|
|
725
|
-
// An ACP agent starts through its attested launch (the pinned interpreter for a script), never a PATH lookup.
|
|
726
525
|
result = await underStopWatch(store, runId, () => acpLaunch !== null
|
|
727
526
|
? spawn(acpLaunch.file, [...acpLaunch.prefix, ...launchArgv], launchOptions)
|
|
728
527
|
: spawn(attested !== null ? attested.executable : adapter.binary, launchArgv, launchOptions));
|
|
@@ -731,8 +530,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
731
530
|
removeAgentDatabase(isolatedDb.dir);
|
|
732
531
|
tools?.cleanup();
|
|
733
532
|
codexHome?.cleanup();
|
|
734
|
-
// What the run's proxy saw (shown on its result): connections it made and refused. A connection the OS refused
|
|
735
|
-
// outright never reached it, and isn't counted.
|
|
736
533
|
if (invocation.phase !== "review" && grants.network !== undefined) {
|
|
737
534
|
store.recordRunNetwork(runId, {
|
|
738
535
|
mode: grants.network.mode, phase: "agent",
|
|
@@ -742,44 +539,25 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
742
539
|
}
|
|
743
540
|
await egress?.close();
|
|
744
541
|
}
|
|
745
|
-
// v105: the run's billing, fixed from evidence before its usage is priced: a key it was given is a key; otherwise
|
|
746
|
-
// what the CLI said (Claude's stream) or was last seen doing (Codex's account), and the setting only when neither.
|
|
747
542
|
const evidence = spec.provider === "claude" ? claudeBillingFrom(billingSeen)
|
|
748
|
-
// Codex signed in with ChatGPT is its plan, unless its plan is itself billed by use (seen by the console's probe).
|
|
749
543
|
: codexLogin === "subscription" ? seenBilling(store.handle, "codex") ?? "subscription" : codexLogin;
|
|
750
|
-
// What this computer's Claude does with no key from us (subagents and drafts bill the same way): learnt only from a
|
|
751
|
-
// run we gave no key that got as far as an answer.
|
|
752
544
|
if (spec.provider === "claude" && managedKey === null && authMode === "subscription" && billingSeen.answered && evidence !== null) {
|
|
753
545
|
store.recordProviderBilling("claude", evidence, new Date());
|
|
754
546
|
}
|
|
755
|
-
// An ACP run bills as its admission stamp says (store.acpBillingOfRun): its agent's own plan, or metered.
|
|
756
547
|
const acpBilling = isAcpProvider(spec.provider) ? (store.acpBillingOfRun(runId)?.kind === "plan" ? "subscription" : "api-key") : null;
|
|
757
548
|
store.fixRunBilling(runId, acpBilling ?? (authMode === "api-key" ? "api-key" : evidence ?? billingOf(spec.provider, store.handle)), new Date());
|
|
758
|
-
// v141: whether that billing is this run's own evidence or this computer's default (a guess: unknown money).
|
|
759
549
|
recordRunBillingBasis(store, runId, acpBilling !== null || authMode === "api-key" || evidence !== null ? "evidence" : "default");
|
|
760
550
|
const envelope = adapter.parse(result.stdout);
|
|
761
551
|
store.stampAgentReportedUsage(runId, envelope.agentReportedUsage ?? null);
|
|
762
|
-
// An installed CLI too old for a build's own setup refuses its flags
|
|
763
|
-
// before it starts: nothing ran, and the run says what to update.
|
|
764
552
|
const unsupported = result.code !== 0 && envelope.initObserved !== true && invocation.phase !== "review" ? isolationUnsupported(spec.provider, result.stderr) : null;
|
|
765
553
|
if (unsupported !== null) {
|
|
766
|
-
// The CLI refused its flags before any model turn: the run never started, whatever the stamp said.
|
|
767
554
|
store.withdrawProviderStart(runId);
|
|
768
555
|
return { kind: "refused", reason: "provider-unattested", providerVersion: attested === null ? null : attested.version, diagnostic: unsupported };
|
|
769
556
|
}
|
|
770
|
-
// The callback is the crash-safe early stamp; the parsed envelope is the
|
|
771
|
-
// authoritative completed-stream account. Stamp it as a fallback for an
|
|
772
|
-
// alternate transport. On fresh runs COALESCE makes callback/parser
|
|
773
|
-
// disagreement visible in the durable row; resumed runs need the separate
|
|
774
|
-
// callback latch because their row deliberately carries the input session.
|
|
775
557
|
if (envelope.sessionId !== null) {
|
|
776
558
|
store.stampRun(runId, { sessionId: envelope.sessionId });
|
|
777
559
|
}
|
|
778
560
|
const durableSessionId = store.getRun(runId)?.sessionId ?? null;
|
|
779
|
-
// The durable id, callback id, and retained envelope must all resolve to
|
|
780
|
-
// ONE identity. This deliberately includes resumed turns: a provider that
|
|
781
|
-
// returns a fork has not proved the same-session repair/warm-resume
|
|
782
|
-
// contract, and COALESCE must not disguise row A / process B as success.
|
|
783
561
|
const sessionIdentityProblem = transportSessionConflict
|
|
784
562
|
? "the provider transport announced conflicting session ids"
|
|
785
563
|
: transportAnnouncedSessionId !== null && transportAnnouncedSessionId !== envelope.sessionId
|
|
@@ -791,8 +569,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
791
569
|
? "the provider returned a session id different from the exact identity recorded for resume"
|
|
792
570
|
: "the provider session id was different from the identity durably recorded when the stream initialized"
|
|
793
571
|
: null;
|
|
794
|
-
// A run whose cost could not be read may still have spent up to its cap: it is charged the cap, never nothing, so
|
|
795
|
-
// the next run's remaining budget stays honest. With no cap it is unmeasured, as a Codex run is, and says so.
|
|
796
572
|
const unknownCost = envelope.costUnknown === true;
|
|
797
573
|
const cap = typeof invocation.maxBudgetUsd === "number" && Number.isFinite(invocation.maxBudgetUsd) && invocation.maxBudgetUsd > 0 ? invocation.maxBudgetUsd : null;
|
|
798
574
|
const costUsd = unknownCost ? cap : envelope.costUsd;
|
|
@@ -804,47 +580,29 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
804
580
|
...(envelope.tokensOut === null ? {} : { tokensOut: envelope.tokensOut + (options.accumulateUsage ? run.tokensOut ?? 0 : 0) }),
|
|
805
581
|
...(costUsd === null ? {} : { costUsd: costUsd + (options.accumulateUsage ? run.costUsd ?? 0 : 0) }),
|
|
806
582
|
...(usageJson === null ? {} : { usageJson }),
|
|
807
|
-
// How many agent turns it took, where the provider reports it (docs/plans/run-efficiency.md); unknown stays NULL.
|
|
808
583
|
...(envelope.ending?.turns == null ? {} : { agentTurns: envelope.ending.turns + (options.accumulateUsage ? run.agentTurns ?? 0 : 0) }),
|
|
809
584
|
});
|
|
810
|
-
// v141: a turn whose cost wasn't reported leaves the run's money unknown for good (a sticky column, never the note).
|
|
811
585
|
recordRunCostUnknown(store, runId, envelope.costUnknown === true);
|
|
812
|
-
// v140: the exact model the provider's own events named (null: not reported); a resumed turn adds its own to the run's.
|
|
813
586
|
recordRunModelReported(store, runId, envelope.modelReported ?? null, options.accumulateUsage === true);
|
|
814
|
-
// How the attempt ended, classified HERE where the structural terminal
|
|
815
|
-
// still exists; a sign-in that no longer works pauses its provider.
|
|
816
|
-
// A run that failed within seconds having produced nothing is read for
|
|
817
|
-
// the sign-in signal too: a CLI that is not logged in often says so on
|
|
818
|
-
// stderr before its structured stream starts.
|
|
819
587
|
const quietEarlyExit = result.code !== 0 && !result.timedOut && !result.notFound &&
|
|
820
588
|
Date.now() - spawnedAt <= AUTH_EARLY_EXIT_MS &&
|
|
821
589
|
envelope.promptConsumed !== true && (envelope.tokensOut ?? 0) === 0;
|
|
822
|
-
// Claude has no attested range (attest.ts), so a terminal that reads as a plan limit asks the installed CLI its version.
|
|
823
590
|
const limitVersion = !terminalMatchesLimit(spec.provider, authMode, envelope.structuralTerminal) ? null
|
|
824
591
|
: attested !== null ? attested.version : await reportedVersion(adapter.binary, options.versionProbe);
|
|
825
592
|
const terminalClass = classifyTerminal({
|
|
826
593
|
terminal: envelope.structuralTerminal,
|
|
827
594
|
run: { provider: spec.provider, authMode, version: limitVersion },
|
|
828
|
-
// stderr and plain stdout only: a JSON event line can carry the agent's
|
|
829
|
-
// own command output (codex aggregated_output), never its sign-in.
|
|
830
595
|
earlyExit: quietEarlyExit ? `${result.stderr.slice(-4096)}\n${plainLines(result.stdout).slice(-4096)}` : null,
|
|
831
596
|
});
|
|
832
|
-
// A plan limit counts only from a run whose protocol and identity hold (fallback.ts moves work on it): a terminal from a
|
|
833
|
-
// conflicting session, a minted id it didn't echo, or a failure on exit 0 is refused below and is never exhaustion.
|
|
834
597
|
const protocolClean = envelope.protocolError === null
|
|
835
598
|
&& !(startSessionId !== undefined && envelope.initObserved === true && envelope.sessionId !== startSessionId)
|
|
836
599
|
&& sessionIdentityProblem === null
|
|
837
600
|
&& !(result.code === 0 && envelope.structuralTerminal?.failed === true);
|
|
838
601
|
store.stampTerminalClass(runId, authMode, terminalClass === "usage-exhausted" && !protocolClean ? "not-exhausted" : terminalClass);
|
|
839
|
-
// What the provider said on its way out, saved for a person (provider-capture.ts). Nothing routes on it.
|
|
840
602
|
if (terminalClass !== "auth-expired" && !result.timedOut && !result.notFound && (result.code !== 0 || envelope.structuralTerminal?.failed === true)) {
|
|
841
603
|
captureProviderFailure(store, { run: runId, provider: spec.provider, model: spec.model ?? null, authMode, exitCode: result.code, code: envelope.structuralTerminal?.code ?? null,
|
|
842
604
|
texts: [envelope.structuralTerminal?.text, envelope.finalMessage?.slice(-1_000), result.stderr.slice(-2_000), plainLines(result.stdout).slice(-1_000)] }, new Date());
|
|
843
605
|
}
|
|
844
|
-
// Contradictory structural identity is a provider protocol failure, not
|
|
845
|
-
// a session selection problem. Usage above remains recorded because the
|
|
846
|
-
// process ran and spent, but no downstream handoff or repair may trust
|
|
847
|
-
// either id from this envelope.
|
|
848
606
|
if (envelope.protocolError !== null) {
|
|
849
607
|
return {
|
|
850
608
|
kind: "refused",
|
|
@@ -855,10 +613,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
855
613
|
...(envelope.acp === undefined ? {} : { acp: { ...envelope.acp, ...(acpIsolation === null ? {} : { isolation: acpIsolation }) } }),
|
|
856
614
|
};
|
|
857
615
|
}
|
|
858
|
-
// The minted-identity proof (A5): once the harness initialized, the id
|
|
859
|
-
// it announced must be the id the plane minted — anything else means
|
|
860
|
-
// the session on disk is not the session on record, and repair must
|
|
861
|
-
// never resume it. Usage above is already recorded: the spend happened.
|
|
862
616
|
if (startSessionId !== undefined &&
|
|
863
617
|
envelope.initObserved === true &&
|
|
864
618
|
envelope.sessionId !== startSessionId) {
|
|
@@ -873,10 +627,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
873
627
|
...(envelope.acp === undefined ? {} : { acp: { ...envelope.acp, ...(acpIsolation === null ? {} : { isolation: acpIsolation }) } }),
|
|
874
628
|
};
|
|
875
629
|
}
|
|
876
|
-
// An early transport announcement, a pre-existing resume identity, and
|
|
877
|
-
// the completed retained envelope must resolve to one canonical id. If
|
|
878
|
-
// either side is missing or different, no handoff or warm resume may use
|
|
879
|
-
// this run even though its spend remains on the record.
|
|
880
630
|
if (sessionIdentityProblem !== null) {
|
|
881
631
|
return {
|
|
882
632
|
kind: "refused",
|
|
@@ -887,9 +637,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
887
637
|
...(envelope.acp === undefined ? {} : { acp: { ...envelope.acp, ...(acpIsolation === null ? {} : { isolation: acpIsolation }) } }),
|
|
888
638
|
};
|
|
889
639
|
}
|
|
890
|
-
// A provider's explicit failure terminal always wins over its process exit
|
|
891
|
-
// status. Exit 0 only proves the wrapper closed cleanly; it cannot turn a
|
|
892
|
-
// failed model turn into a successful build.
|
|
893
640
|
if (result.code === 0 && envelope.structuralTerminal?.failed === true) {
|
|
894
641
|
return {
|
|
895
642
|
kind: "refused",
|
|
@@ -900,11 +647,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
900
647
|
...(envelope.acp === undefined ? {} : { acp: { ...envelope.acp, ...(acpIsolation === null ? {} : { isolation: acpIsolation }) } }),
|
|
901
648
|
};
|
|
902
649
|
}
|
|
903
|
-
// The terminal contract (A4): when the audit requires it, a zero exit is
|
|
904
|
-
// believed ONLY with initialization observed and the structural success
|
|
905
|
-
// terminal present. A missing, truncated, or error-status terminal on
|
|
906
|
-
// exit 0 is the harness breaking its own protocol — never a completed
|
|
907
|
-
// build, and the handoff is never ingested.
|
|
908
650
|
if (auditOf(spec.provider).terminalContract === "required" &&
|
|
909
651
|
result.code === 0 &&
|
|
910
652
|
!(envelope.initObserved === true && envelope.promptConsumed === true)) {
|
|
@@ -920,13 +662,11 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
920
662
|
...(envelope.acp === undefined ? {} : { acp: { ...envelope.acp, ...(acpIsolation === null ? {} : { isolation: acpIsolation }) } }),
|
|
921
663
|
};
|
|
922
664
|
}
|
|
923
|
-
// A run that worked proves its provider's sign-in works: a sign-in pause
|
|
924
|
-
// on it lifts, and its waiting tasks may start again.
|
|
925
665
|
if (result.code === 0 && envelope.structuralTerminal === null && envelope.promptConsumed !== false) {
|
|
926
666
|
try {
|
|
927
667
|
liftAuthPause(store, spec.provider, "run", `run #${runId}`, clock(), new Date(spawnedAt));
|
|
928
668
|
}
|
|
929
|
-
catch {
|
|
669
|
+
catch { }
|
|
930
670
|
}
|
|
931
671
|
return {
|
|
932
672
|
kind: "ran",
|
|
@@ -946,14 +686,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
946
686
|
tokensOut: envelope.tokensOut,
|
|
947
687
|
costUsd,
|
|
948
688
|
},
|
|
949
|
-
// Gated on the run having NOTHING to show (Codex M5-M8 audit, C-8),
|
|
950
|
-
// where "nothing to show" is STRUCTURAL when the transport can say so
|
|
951
|
-
// (arc 1 finding 15): a retained error result carries diagnostic text
|
|
952
|
-
// in finalMessage, and that prose must not read as an agent's attempt.
|
|
953
|
-
// Transports without the consumption signal keep the historical
|
|
954
|
-
// no-final-message rule. A nonzero exit WITH a consumed prompt is a
|
|
955
|
-
// failed agent turn — the agent ran, spoke, and failed — and must be
|
|
956
|
-
// classified as that, never as the harness failing to come up.
|
|
957
689
|
initFailed: envelope.initObserved === false &&
|
|
958
690
|
(envelope.promptConsumed === null
|
|
959
691
|
? envelope.finalMessage === null
|
|
@@ -963,7 +695,6 @@ export async function invokeAgent(store, runId, spec, invocation, options) {
|
|
|
963
695
|
},
|
|
964
696
|
};
|
|
965
697
|
}
|
|
966
|
-
/** The reported usage, when its kept text is whole JSON, to sit beside a cost note. */
|
|
967
698
|
function usageOf(raw) {
|
|
968
699
|
if (raw === null)
|
|
969
700
|
return {};
|
|
@@ -974,17 +705,12 @@ function usageOf(raw) {
|
|
|
974
705
|
return {};
|
|
975
706
|
}
|
|
976
707
|
}
|
|
977
|
-
/** What the plane recorded of a checkout's setup: its project and the setup stamped on it (null: none recorded). */
|
|
978
708
|
function linkedFor(store, worktree) {
|
|
979
709
|
const row = worktree === null ? null : store.getWorktree(worktree);
|
|
980
710
|
return row === null ? null : { repo: row.repo, setupDigest: row.setupDigest ?? null };
|
|
981
711
|
}
|
|
982
|
-
/** The paths this run's agent may not reach: the state folder around the live database (but not its own worktree),
|
|
983
|
-
* ~/.toolroll (or its older name), its task boundary and other launches' private folders; what the fence gives back
|
|
984
|
-
* (FenceGrants); and what only Claude's file tools refuse. */
|
|
985
712
|
async function runFence(store, runId, provider, keyHome, ownTools, writes = WRITES_DEFAULT, sandbox = LEGACY_SANDBOX) {
|
|
986
713
|
try {
|
|
987
|
-
// A plane always has a database file; an in-memory store (a test) has nothing to fence.
|
|
988
714
|
const databaseFile = store.databaseFile();
|
|
989
715
|
if (databaseFile === null)
|
|
990
716
|
return { fence: [], fileTools: [], grants: NO_GRANTS };
|
|
@@ -995,54 +721,34 @@ async function runFence(store, runId, provider, keyHome, ownTools, writes = WRIT
|
|
|
995
721
|
throw new CheckoutBindingError("The checkout's Git pointer was changed or its trusted binding could not be verified.");
|
|
996
722
|
const poolRoots = [join(dirname(databaseFile), "worktrees"), ...store.listWorktrees().map(record => poolRootOf(record.path, record.repo))];
|
|
997
723
|
const binding = worktree === null || row === null ? null : trustedWorktreeBinding(row.repo, worktree, poolRoots);
|
|
998
|
-
// The storage check, awaited off this thread (protected-storage.ts): a privacy prompt holds up only its child.
|
|
999
724
|
const storage = await prepareProtectedStorage(keyHome ?? homedir());
|
|
1000
725
|
const boundary = worktree === null ? null : taskBoundary({ worktree, provider, ...home, binding, policy: sandbox.policy, storage });
|
|
1001
726
|
const folders = runFolders(ownTools);
|
|
1002
|
-
// A build with a checkout writes only its workspace unless its approval said anywhere (arc 2): its checkout and
|
|
1003
|
-
// Git data, its launch folder, its project's caches and the provider state its CLI must write.
|
|
1004
727
|
const allowed = worktree === null || row === null || writes !== "workspace" ? null
|
|
1005
728
|
: writeAllowlist({ provider, home: keyHome ?? homedir(), worktree, binding, launchFolder: ownTools, cache: buildCacheFolder(row.repo, keyHome ?? homedir()) });
|
|
1006
|
-
// The shared install is granted only as the plane linked it: this checkout's project and stamped setup.
|
|
1007
|
-
// Every plane checkout pool is denied around this one: the plane's own beside the database, and the one this
|
|
1008
|
-
// checkout was recorded in (a --pool elsewhere), so another project's worktree, present at launch, is out of reach. Native wrappers also cover later creations.
|
|
1009
729
|
const launch = fenceFor(provider === "command" ? "command" : "build", { databaseFile, worktree, ...home, boundary, binding, runFolders: folders, poolRoots, storage,
|
|
1010
730
|
extra: allowed?.deny ?? [], linked: linkedFor(store, worktree), writes: allowed === null ? null : { writes: allowed.writes, readOnly: allowed.readOnly }, policy: sandbox.policy, provider,
|
|
1011
|
-
// This launch's code map file: exactly that file, read-only, inside the denied state folder. Commands don't get it.
|
|
1012
731
|
...(provider === "command" ? {} : { exactFile: deliveredFile(store, runId) }),
|
|
1013
|
-
// The sealed read denies, and whatever the project lists now too (adding a deny only narrows).
|
|
1014
732
|
readDeny: [...new Set([...sandbox.readDeny, ...(row === null ? [] : store.projectSandbox(row.repo).readDeny)])].map(one => readDenyPath(one, keyHome ?? homedir())), machLookup: sandbox.machLookup });
|
|
1015
733
|
return {
|
|
1016
734
|
fence: launch.fence,
|
|
1017
735
|
fileTools: boundary?.fileTools ?? [],
|
|
1018
736
|
grants: launch.fenceGrants,
|
|
1019
|
-
// The checkout's own Git data (a sign-ins check's network keeps it reachable).
|
|
1020
737
|
gitPaths: binding === null ? [] : [binding.gitdir, join(binding.main, ".git")],
|
|
1021
738
|
...(allowed === null || row === null ? {} : { cache: buildCacheFolder(row.repo, keyHome ?? homedir()) }),
|
|
1022
739
|
};
|
|
1023
740
|
}
|
|
1024
741
|
catch (error) {
|
|
1025
|
-
// The storage check's own words: what didn't finish, and which program macOS may need to allow.
|
|
1026
742
|
const refused = storageRefusalOf(error);
|
|
1027
743
|
if (refused !== null)
|
|
1028
744
|
return { fence: [], fileTools: [], grants: NO_GRANTS, problem: refused.message, storageRefused: true };
|
|
1029
745
|
return { fence: [], fileTools: [], grants: NO_GRANTS, problem: error instanceof CheckoutBindingError ? error.message : "The build fence could not be prepared." };
|
|
1030
746
|
}
|
|
1031
747
|
}
|
|
1032
|
-
/**
|
|
1033
|
-
* A build's setup and check commands, run in its fence (arc 2): the same denies as its agent's (Toolroll's state,
|
|
1034
|
-
* credentials, other projects and runs), its write allowlist when its approval sealed one (its checkout and Git data,
|
|
1035
|
-
* its project's caches, and a temp folder of the command's own), and its package managers pointed at those caches.
|
|
1036
|
-
* Their network stays as it was. A machine without an OS fence runs them as before; a fence that can't be prepared
|
|
1037
|
-
* (a checkout whose binding no longer proves) runs nothing.
|
|
1038
|
-
*/
|
|
1039
748
|
export function fencedCommands(store, runId, writes, inner, available = () => macosFenceAvailable() || linuxFenceAvailable(), access = CHECK_ACCESS_DEFAULT, network, sandbox = LEGACY_SANDBOX) {
|
|
1040
|
-
// An injected runner (tests) starts no real command, as an injected agent starts no real agent (invokeAgent).
|
|
1041
749
|
if (inner !== runCommand)
|
|
1042
750
|
return inner;
|
|
1043
751
|
return async (file, args, options) => {
|
|
1044
|
-
// As a build itself: where nothing can confine them, they run only when an instance operator allowed unconfined agents
|
|
1045
|
-
// (and the run says so: its checks ran without a sandbox, whatever was sealed).
|
|
1046
752
|
if (!available()) {
|
|
1047
753
|
if (store.unfencedAgentsAllowed()) {
|
|
1048
754
|
store.stampRunCheckAccess(runId, "unsandboxed");
|
|
@@ -1055,8 +761,6 @@ export function fencedCommands(store, runId, writes, inner, available = () => ma
|
|
|
1055
761
|
try {
|
|
1056
762
|
const temp = join(own, "tmp");
|
|
1057
763
|
mkdirSync(temp, { mode: 0o700 });
|
|
1058
|
-
// Not sandboxed (check-access.ts): the project's checks are trusted by the whole instance, as before 0.9.66. Never
|
|
1059
|
-
// while local mode is on (easy-start C5): then they run in the fence, sandboxed.
|
|
1060
764
|
if (access === "unsandboxed" && !localModeOn(store)) {
|
|
1061
765
|
stampLaunch(store, [runId], unfencedStamp());
|
|
1062
766
|
return await inner(file, args, { ...options, env: { ...(options?.env ?? {}), TMPDIR: temp, TMP: temp, TEMP: temp } });
|
|
@@ -1068,7 +772,6 @@ export function fencedCommands(store, runId, writes, inner, available = () => ma
|
|
|
1068
772
|
stampLaunch(store, [runId], unfencedStamp());
|
|
1069
773
|
return inner(file, args, options);
|
|
1070
774
|
}
|
|
1071
|
-
// A self-hosted check's own database (child-database.ts) is the command's to write too.
|
|
1072
775
|
const database = options?.env?.["TOOLROLL_DB"];
|
|
1073
776
|
const checkData = database === undefined || fenced.grants.writes === undefined ? null : grantFolder(dirname(database), false);
|
|
1074
777
|
const grants = checkData === null ? fenced.grants : { ...fenced.grants, writes: { ...fenced.grants.writes, subpaths: [...fenced.grants.writes.subpaths, checkData] } };
|
|
@@ -1079,8 +782,6 @@ export function fencedCommands(store, runId, writes, inner, available = () => ma
|
|
|
1079
782
|
if (signIns !== null && "problem" in signIns)
|
|
1080
783
|
return { code: 1, stdout: "", stderr: `${signIns.problem}\n`, timedOut: false, notFound: false };
|
|
1081
784
|
try {
|
|
1082
|
-
// Each sign-in file looked at again right before the launch: one no longer itself isn't granted.
|
|
1083
|
-
// Never the keychain: the sign-ins kept there come in the environment, read outside (keychainSignIns).
|
|
1084
785
|
const given = signIns === null ? grants : { ...grants, signIns: { ...signIns.grants, read: signIns.grants.read.filter(path => signInIsItself(realpathSync(homedir()), path)) }, network: signIns.network };
|
|
1085
786
|
stampLaunch(store, [runId], fencedStamp(signIns === null ? "sandboxed" : "sign-ins", fenced.fence, given, signIns === null ? undefined : network));
|
|
1086
787
|
return await inner(file, args, {
|
|
@@ -1101,12 +802,6 @@ export function fencedCommands(store, runId, writes, inner, available = () => ma
|
|
|
1101
802
|
}
|
|
1102
803
|
};
|
|
1103
804
|
}
|
|
1104
|
-
/**
|
|
1105
|
-
* A project's checks run in a checkout of a result's commit made for them (result-follow-ups.ts, batch-checks.ts), in
|
|
1106
|
-
* the same fence as a build's commands: Toolroll's state, credentials, other projects and runs denied; under the
|
|
1107
|
-
* project's writes setting, only that checkout, its Git data, its own temp folder, the project's caches and its check
|
|
1108
|
-
* database writable. Where nothing can confine them, they run only when an instance operator allowed unconfined agents.
|
|
1109
|
-
*/
|
|
1110
805
|
export function fencedCheckoutCommands(store, repo, checkout, inner, available = () => macosFenceAvailable() || linuxFenceAvailable(), access = CHECK_ACCESS_DEFAULT, network, sandbox = LEGACY_SANDBOX, stampRuns = []) {
|
|
1111
806
|
if (inner !== runCommand)
|
|
1112
807
|
return inner;
|
|
@@ -1127,8 +822,6 @@ export function fencedCheckoutCommands(store, repo, checkout, inner, available =
|
|
|
1127
822
|
try {
|
|
1128
823
|
const temp = join(own, "tmp");
|
|
1129
824
|
mkdirSync(temp, { mode: 0o700 });
|
|
1130
|
-
// Not sandboxed (check-access.ts): the project's checks are trusted by the whole instance, as before 0.9.66. Never
|
|
1131
|
-
// while local mode is on (easy-start C5): then they run in the fence, sandboxed.
|
|
1132
825
|
if (access === "unsandboxed" && !localModeOn(store)) {
|
|
1133
826
|
stampLaunch(store, stampRuns, unfencedStamp());
|
|
1134
827
|
return await inner(file, args, { ...options, env: { ...(options?.env ?? {}), TMPDIR: temp, TMP: temp, TEMP: temp } });
|
|
@@ -1158,15 +851,11 @@ export function fencedCheckoutCommands(store, repo, checkout, inner, available =
|
|
|
1158
851
|
readDeny: sandbox.readDeny.map(one => readDenyPath(one, homedir())), machLookup: sandbox.machLookup, policy: sandbox.policy,
|
|
1159
852
|
writes: allowed === null ? null : { writes: { ...allowed.writes, subpaths: [...allowed.writes.subpaths, ...(checkData === null ? [] : [checkData])] }, readOnly: allowed.readOnly } });
|
|
1160
853
|
const grants = launch.fenceGrants;
|
|
1161
|
-
// With sign-ins, under the network its caller proved for it (the narrowest of its results' sealed check networks and
|
|
1162
|
-
// the project's current one): none given, nothing runs.
|
|
1163
854
|
const signIns = access !== "sign-ins" ? null : network === undefined ? { problem: "A check with sign-ins has no network sealed for it, so nothing ran." }
|
|
1164
855
|
: await signInsLaunch(store, own, temp, checkout, network, [binding.gitdir, join(binding.main, ".git")]);
|
|
1165
856
|
if (signIns !== null && "problem" in signIns)
|
|
1166
857
|
return { code: 1, stdout: "", stderr: `${signIns.problem}\n`, timedOut: false, notFound: false };
|
|
1167
858
|
try {
|
|
1168
|
-
// Each sign-in file looked at again right before the launch: one no longer itself isn't granted.
|
|
1169
|
-
// Never the keychain: the sign-ins kept there come in the environment, read outside (keychainSignIns).
|
|
1170
859
|
const given = signIns === null ? grants : { ...grants, signIns: { ...signIns.grants, read: signIns.grants.read.filter(path => signInIsItself(realpathSync(homedir()), path)) }, network: signIns.network };
|
|
1171
860
|
stampLaunch(store, stampRuns, fencedStamp(signIns === null ? "sandboxed" : "sign-ins", launch.fence, given, signIns === null ? undefined : network));
|
|
1172
861
|
return await inner(file, args, {
|
|
@@ -1187,13 +876,10 @@ export function fencedCheckoutCommands(store, repo, checkout, inner, available =
|
|
|
1187
876
|
}
|
|
1188
877
|
};
|
|
1189
878
|
}
|
|
1190
|
-
/** What a build writes that a tool server must never run from: its checkout and its project's caches. A checkout with
|
|
1191
|
-
* no record never gets this far: its fence refuses the launch (runFence) before any tool server can start. */
|
|
1192
879
|
function toolUntrusted(store, workspace, keyHome) {
|
|
1193
880
|
const row = store.getWorktree(workspace);
|
|
1194
881
|
return [workspace, ...(row === null ? [] : [buildCacheFolder(row.repo, keyHome ?? homedir())])];
|
|
1195
882
|
}
|
|
1196
|
-
/** The operator's own model choices a build routed with no model keeps (provider-home.ts). */
|
|
1197
883
|
function inheritedDefaults(provider, env, home) {
|
|
1198
884
|
if (provider === "claude")
|
|
1199
885
|
return claudeDefaults(claudeConfigDir(env, home));
|
|
@@ -1201,15 +887,10 @@ function inheritedDefaults(provider, env, home) {
|
|
|
1201
887
|
return codexDefaults(codexHomeDir(env, home));
|
|
1202
888
|
return undefined;
|
|
1203
889
|
}
|
|
1204
|
-
/** How the fence reaches a provider: Codex through its own sandbox profile
|
|
1205
|
-
* (already in its argv; wrapping it would nest sandboxes), Claude and
|
|
1206
|
-
* Gemini inside the macOS sandbox the spawn road applies (`wrap`), Claude
|
|
1207
|
-
* elsewhere through its own file-tool rules only. */
|
|
1208
890
|
function fenceLaunch(provider, fence) {
|
|
1209
891
|
const method = fenceMethod(provider, fence.length > 0);
|
|
1210
892
|
return { wrap: method === "macos-sandbox" || method === "linux-bubblewrap" ? fence : [], method };
|
|
1211
893
|
}
|
|
1212
|
-
/** The fence a launch gets, from its provider, whether it has anything to fence, and what this platform supports. */
|
|
1213
894
|
function fenceMethod(provider, fenced) {
|
|
1214
895
|
if (!fenced)
|
|
1215
896
|
return "none";
|
|
@@ -1221,39 +902,20 @@ function fenceMethod(provider, fenced) {
|
|
|
1221
902
|
return "linux-bubblewrap";
|
|
1222
903
|
return provider === "claude" ? "claude-rules" : "none";
|
|
1223
904
|
}
|
|
1224
|
-
/** One launch's tools, or — when they cannot be prepared — the same isolation with none, never the operator's global servers. */
|
|
1225
905
|
async function runTools(store, runId, spec, keyHome, clock, readOnly, withheld, containment, broker) {
|
|
1226
906
|
try {
|
|
1227
907
|
return await prepareRunTools(store, runId, spec.provider, { ...(keyHome === undefined ? {} : { home: keyHome }), now: clock(), containment, ...(readOnly === undefined ? {} : { readOnly }), ...(withheld === undefined ? {} : { withheld }), broker });
|
|
1228
908
|
}
|
|
1229
909
|
catch (error) {
|
|
1230
|
-
// Sign-ins made for this run couldn't all be kept (and were revoked): it doesn't start.
|
|
1231
910
|
if (error instanceof RunSignInError)
|
|
1232
911
|
return { refused: error.message };
|
|
1233
912
|
return noToolsArgs(spec.provider);
|
|
1234
913
|
}
|
|
1235
914
|
}
|
|
1236
|
-
/** The lines of a harness's stdout that are not JSON events. */
|
|
1237
915
|
function plainLines(stdout) {
|
|
1238
916
|
return stdout.split("\n").filter(line => !line.trimStart().startsWith("{")).join("\n");
|
|
1239
917
|
}
|
|
1240
|
-
/** What a `sign-ins` check never inherits: a caller's choice of Claude's config folder (Claude's keychain sign-in is
|
|
1241
|
-
* keyed to its default one; check-access.ts). gh's and Codex's are set to the granted ones instead. */
|
|
1242
918
|
const SIGN_INS_OMITTED_ENV = ["CLAUDE_CONFIG_DIR"];
|
|
1243
|
-
/**
|
|
1244
|
-
* A `sign-ins` check's launch (check-access.ts, sandbox parity C10): its exact sign-in files, read by the check itself
|
|
1245
|
-
* through its sandbox (agent-fence.ts signInGrants: nothing privileged reads or copies one), its own transcript folder
|
|
1246
|
-
* and Codex's session and log folders; Codex, gh and XDG pointed at the real folders; and the network the check runs
|
|
1247
|
-
* under: open, or its allowlist through a proxy of its own (on Linux, relayed in by the sandbox runtime). Nothing about it is
|
|
1248
|
-
* started unless all of it is.
|
|
1249
|
-
*/
|
|
1250
|
-
/**
|
|
1251
|
-
* macOS: the sign-ins a check with sign-ins needs that live in the keychain, not in files: Claude Code's
|
|
1252
|
-
* ("Claude Code-credentials", its current access token as CLAUDE_CODE_OAUTH_TOKEN) and gh's ("gh:github.com", as
|
|
1253
|
-
* GH_TOKEN). Read here, by Toolroll, outside the sandbox, and handed to the check in its environment, so the check never
|
|
1254
|
-
* reaches securityd (sandbox-runtime.ts SEATBELT_NO_KEYCHAIN) and nothing else in the keychain. The check can't renew
|
|
1255
|
-
* Claude's token: one that has expired fails its sign-in. A value that isn't a plain token is left out.
|
|
1256
|
-
*/
|
|
1257
919
|
export const KEYCHAIN_SIGN_INS = [
|
|
1258
920
|
{ service: "Claude Code-credentials", env: "CLAUDE_CODE_OAUTH_TOKEN", token: secret => {
|
|
1259
921
|
try {
|
|
@@ -1264,18 +926,13 @@ export const KEYCHAIN_SIGN_INS = [
|
|
|
1264
926
|
return null;
|
|
1265
927
|
}
|
|
1266
928
|
} },
|
|
1267
|
-
// go-keyring (gh's) may keep it base64-encoded behind a prefix.
|
|
1268
929
|
{ service: "gh:github.com", env: "GH_TOKEN", token: secret => secret.startsWith("go-keyring-base64:") ? Buffer.from(secret.slice("go-keyring-base64:".length), "base64").toString("utf8") : secret },
|
|
1269
930
|
];
|
|
1270
931
|
const PLAIN_TOKEN = /^[A-Za-z0-9._~+/=-]{8,4096}$/;
|
|
1271
|
-
/** One keychain item's secret by its service, read with the system's `security` (null: none, or it can't be read). A
|
|
1272
|
-
* keychain file may be named (tests: a throwaway one); never the item's value in an argument. */
|
|
1273
932
|
export function readKeychainSecret(service, keychain) {
|
|
1274
933
|
const read = spawnSync("/usr/bin/security", ["find-generic-password", "-s", service, "-w", ...keychain === undefined ? [] : [keychain]], { encoding: "utf8", timeout: 10_000, env: { PATH: "/usr/bin:/bin", HOME: homedir() }, stdio: ["ignore", "pipe", "ignore"] });
|
|
1275
934
|
return read.status === 0 && typeof read.stdout === "string" ? read.stdout.replace(/\n$/, "") : null;
|
|
1276
935
|
}
|
|
1277
|
-
/** The keychain's sign-ins as a check's environment (macOS only; elsewhere, for anything missing, and where Toolroll
|
|
1278
|
-
* keeps nothing in the keychain (TOOLROLL_SECRET_STORE=files: the test suite), nothing). */
|
|
1279
936
|
export function keychainSignIns(platform = process.platform, read) {
|
|
1280
937
|
if (platform !== "darwin")
|
|
1281
938
|
return {};
|
|
@@ -1302,8 +959,6 @@ export async function signInsLaunch(store, own, temp, checkout, policy, gitPaths
|
|
|
1302
959
|
const env = { CODEX_HOME: join(home, ".codex"), GH_CONFIG_DIR: join(home, ".config", "gh"), XDG_CONFIG_HOME: join(home, ".config"), ...keychain() };
|
|
1303
960
|
if (policy.mode === "open")
|
|
1304
961
|
return { grants, network: { mode: "open" }, env, close };
|
|
1305
|
-
// Exactly the project's network: the services the sign-ins are for are reached only if the operator allowed their
|
|
1306
|
-
// hosts (check-access.ts signInHostsMissing says which are missing; never added here).
|
|
1307
962
|
egress = await startEgressProxy({ hosts: policy.hosts });
|
|
1308
963
|
const network = { mode: "allowlist", proxyPort: egress.port, brokerPorts: [], loopback: policy.loopback, socketRoots: [temp, realpathSync(checkout)], token: egress.secret };
|
|
1309
964
|
return { grants, network, env: { ...env, ...proxyEnv(egress, policy.loopback) }, close };
|
|
@@ -1313,21 +968,11 @@ export async function signInsLaunch(store, own, temp, checkout, policy, gitPaths
|
|
|
1313
968
|
return { problem: `The check's network could not be set up, so nothing ran: ${error instanceof Error ? error.message : String(error)}` };
|
|
1314
969
|
}
|
|
1315
970
|
}
|
|
1316
|
-
/** How a check at `access` actually runs here: unsandboxed where no OS fence exists (and an operator allowed that), else
|
|
1317
|
-
* as asked. Recorded on every check's receipt, so a check that ran without a sandbox is never shown as sandboxed. */
|
|
1318
971
|
export function actualCheckAccess(store, access) {
|
|
1319
972
|
return macosFenceAvailable() || linuxFenceAvailable() || !store.unfencedAgentsAllowed() ? access : "unsandboxed";
|
|
1320
973
|
}
|
|
1321
|
-
/**
|
|
1322
|
-
* A check of saved results, in their own checkout (batch-checks.ts, result-follow-ups.ts), worked out right before each
|
|
1323
|
-
* command: never wider than any of those results' own checks ran, nor than the project allows now; under sign-ins, the
|
|
1324
|
-
* narrowest of their sealed check networks and the project's current one. A result with no sealed network runs it
|
|
1325
|
-
* sandboxed.
|
|
1326
|
-
*/
|
|
1327
974
|
export function checkoutLaunchOf(store, repo, runIds, platform = process.platform) {
|
|
1328
|
-
// As checks can get it: sign-ins (off for now; a stamp or setting from before, or another database) run sandboxed.
|
|
1329
975
|
const asked = checkAccessHere(narrowestAccess([store.projectCheckAccess(repo), ...runIds.map(id => store.runCheckAccess(id))]), platform);
|
|
1330
|
-
// Easy-start C5: while local mode is on, never unsandboxed (re-read here, at launch).
|
|
1331
976
|
const access = localModeOn(store) ? localModeCap(asked) : asked;
|
|
1332
977
|
if (access !== "sign-ins")
|
|
1333
978
|
return { access, network: undefined };
|
|
@@ -1337,13 +982,9 @@ export function checkoutLaunchOf(store, repo, runIds, platform = process.platfor
|
|
|
1337
982
|
const live = resolveNetwork("command", store.projectNetwork(repo), repositoryEcosystems(repo));
|
|
1338
983
|
return { access, network: sealed.reduce((low, one) => narrowestNetwork(low, one), live) };
|
|
1339
984
|
}
|
|
1340
|
-
/** The widest level a check's commands actually ran at (what its receipt says). */
|
|
1341
985
|
export const widestRan = (levels) => levels.includes("unsandboxed") ? "unsandboxed" : levels.includes("sign-ins") ? "sign-ins" : CHECK_ACCESS_DEFAULT;
|
|
1342
|
-
/** A check log's line for how its commands ran, when wider than sandboxed (shown with the log). */
|
|
1343
986
|
export const ranAtLine = (level) => level === "sandboxed" ? null
|
|
1344
987
|
: `=== Check access ===\n${level === "unsandboxed" ? "These commands ran without a sandbox." : "These commands ran sandboxed, with model and GitHub sign-ins."}`;
|
|
1345
|
-
/** A saved result's check command runner (batch-checks.ts, result-follow-ups.ts): its level and network worked out right
|
|
1346
|
-
* now (checkoutLaunchOf), and how it actually runs told to `ran`. */
|
|
1347
988
|
export function checkoutRunner(store, repo, checkout, inner, runIds, ran, platform = process.platform) {
|
|
1348
989
|
return (file, args, options) => {
|
|
1349
990
|
const launch = checkoutLaunchOf(store, repo, runIds, platform);
|
|
@@ -1351,12 +992,6 @@ export function checkoutRunner(store, repo, checkout, inner, runIds, ran, platfo
|
|
|
1351
992
|
return fencedCheckoutCommands(store, repo, checkout, inner, undefined, launch.access, launch.network, checkoutSandboxOf(store, repo, runIds), runIds)(file, args, options);
|
|
1352
993
|
};
|
|
1353
994
|
}
|
|
1354
|
-
/**
|
|
1355
|
-
* A saved result's checks' sandbox terms (sandbox parity C9), never wider than any of those results' own approvals nor
|
|
1356
|
-
* the project now: v2 only when every result's approval sealed v2; every read deny any of them sealed or the project
|
|
1357
|
-
* lists now; mach services only those all of them sealed and the project still lists. A result with
|
|
1358
|
-
* no readable approval counts as v1 with nothing listed.
|
|
1359
|
-
*/
|
|
1360
995
|
export function checkoutSandboxOf(store, repo, runIds) {
|
|
1361
996
|
const sealed = runIds.map(id => {
|
|
1362
997
|
const taskRef = store.getRun(id)?.taskRef;
|
|
@@ -1372,8 +1007,6 @@ export function checkoutSandboxOf(store, repo, runIds) {
|
|
|
1372
1007
|
machLookup: common(one => one.machLookup, live.machLookup),
|
|
1373
1008
|
};
|
|
1374
1009
|
}
|
|
1375
|
-
/** A fenced launch's stamp: the level it runs at and exactly what it was given (check-stamp.ts), read from the grants the
|
|
1376
|
-
* launch itself takes, never from what was asked for. */
|
|
1377
1010
|
export function fencedStamp(level, fence, grants, network) {
|
|
1378
1011
|
const writes = grants.writes;
|
|
1379
1012
|
return {
|
|
@@ -1388,15 +1021,9 @@ function stampLaunch(store, runs, stamp) {
|
|
|
1388
1021
|
for (const runId of runs)
|
|
1389
1022
|
recordCheckStamp(store, runId, stamp, now);
|
|
1390
1023
|
}
|
|
1391
|
-
/** The digest of a launch's whole fence (its denied paths and grants, canonical), as stamped on its run (C11). */
|
|
1392
1024
|
export function fenceDigest(fence, grants) {
|
|
1393
1025
|
return createHash("sha256").update(`toolroll:fence:${canonicalJson({ fence: [...fence], grants: grants })}`).digest("hex").slice(0, 32);
|
|
1394
1026
|
}
|
|
1395
|
-
/**
|
|
1396
|
-
* One stream event's billing observation: the key source and model from the session's own init, plan windows from a
|
|
1397
|
-
* rate-limit event, and whether the main query answered. The session's own events only (stream-scope.ts): a
|
|
1398
|
-
* subagent's init, rate-limit event or result says nothing about this turn's billing.
|
|
1399
|
-
*/
|
|
1400
1027
|
export function observeClaudeBilling(seen, event) {
|
|
1401
1028
|
if (event["type"] === "system" && event["subtype"] === "init" && topLevelEvent(event)) {
|
|
1402
1029
|
if (typeof event["apiKeySource"] === "string")
|
|
@@ -1411,12 +1038,6 @@ export function observeClaudeBilling(seen, event) {
|
|
|
1411
1038
|
seen.answered = true;
|
|
1412
1039
|
}
|
|
1413
1040
|
}
|
|
1414
|
-
/**
|
|
1415
|
-
* What decides a child's credential: the environment it starts from (the plane's, then the caller's) and every variable
|
|
1416
|
-
* it sheds. Subscription: this provider's own keys too, so an ambient key can't force API billing over the login.
|
|
1417
|
-
* API key: every other own-key alias, so a stray one can't override the one key injected. Foreign keys and (for a
|
|
1418
|
-
* Claude build) plugin variables always. The live plan proof and the launch both use this one answer.
|
|
1419
|
-
*/
|
|
1420
1041
|
export function childAuthEnv(args) {
|
|
1421
1042
|
const env = { ...process.env, ...(args.runEnv ?? {}) };
|
|
1422
1043
|
return {
|
|
@@ -1424,7 +1045,6 @@ export function childAuthEnv(args) {
|
|
|
1424
1045
|
omitEnv: [
|
|
1425
1046
|
...(args.runOmitEnv ?? []),
|
|
1426
1047
|
...args.extraOmitEnv,
|
|
1427
|
-
// A Claude build loads no plugin, from settings or the environment (a review's safe mode already loads none).
|
|
1428
1048
|
...(args.provider === "claude" && args.phase !== "review" ? claudePluginEnv(env) : []),
|
|
1429
1049
|
...(args.authMode === "subscription" ? args.ownKeyEnv : args.ownKeyEnv.filter(name => name !== args.keyEnvName)),
|
|
1430
1050
|
],
|