toolroll 0.9.103 → 0.9.105
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/README.md +27 -27
- package/dist/accent-colors.js +0 -29
- package/dist/acp-agents.js +0 -3
- package/dist/acp-attest.js +0 -30
- package/dist/acp-check.js +3 -70
- package/dist/acp-client.js +3 -94
- package/dist/acp-inspect.js +1 -20
- package/dist/action-ledger.js +0 -8
- package/dist/activity-line.js +0 -14
- package/dist/actor.js +0 -15
- package/dist/advanced-schema.js +12 -0
- package/dist/advanced-view.js +26 -0
- package/dist/advanced.js +61 -0
- package/dist/agent-board.js +0 -117
- package/dist/agent-fence.js +11 -367
- package/dist/agent-onboard.js +12 -50
- package/dist/agent-pulse.js +5 -38
- package/dist/agent-state-words.js +0 -8
- package/dist/agent-state.js +1 -45
- package/dist/agent-turns.js +3 -17
- package/dist/agentconfig.js +1 -99
- package/dist/agents-board.js +0 -60
- package/dist/agents-live.js +1 -8
- package/dist/api-tokens.js +0 -27
- package/dist/approval-authority.js +0 -59
- package/dist/approval-password.js +0 -10
- package/dist/approval-policy.js +0 -29
- package/dist/approval-rules-ui.js +0 -9
- package/dist/assignment-adapters.js +0 -14
- package/dist/assignment-brief.js +1 -17
- package/dist/assignment-delivery.js +0 -22
- package/dist/assignment-presentation.js +0 -14
- package/dist/assignment-status.js +1 -30
- package/dist/assignment-ui.js +0 -12
- package/dist/assignment.js +117 -103
- package/dist/attest.js +0 -38
- package/dist/audit-cli.js +0 -9
- package/dist/backend.js +0 -59
- package/dist/backup-ui.js +0 -12
- package/dist/backup.js +8 -61
- package/dist/batch-checks.js +0 -20
- package/dist/batch-policy.js +0 -4
- package/dist/beads.js +0 -48
- package/dist/bin.js +0 -8
- package/dist/board.js +1 -36
- package/dist/boot-identity.js +0 -42
- package/dist/bounded-spawn.js +4 -28
- package/dist/brand-mark.js +0 -21
- package/dist/brief-fence.js +0 -16
- package/dist/browser/terminal.css +1 -1
- package/dist/browser/terminal.js +16 -16
- package/dist/browser/workspace.css +2 -2
- package/dist/browser/workspace.js +26 -26
- package/dist/browser-crew.js +0 -8
- package/dist/browser-shell.js +2 -15
- package/dist/browser-workspace.js +6 -30
- package/dist/budget-alerts.js +1 -4
- package/dist/build-review.js +2 -50
- package/dist/builder-restart.js +0 -13
- package/dist/builder.js +21 -1035
- package/dist/canonical-json.js +0 -12
- package/dist/capscan.js +1 -32
- package/dist/card-catalog.js +0 -12
- package/dist/card-cli.js +0 -1
- package/dist/card-render.js +0 -25
- package/dist/card-sources.js +0 -10
- package/dist/chat-acceptance.js +0 -7
- package/dist/chat-actions.js +5 -190
- package/dist/chat-admission.js +0 -7
- package/dist/chat-approval.js +0 -25
- package/dist/chat-ask.js +0 -17
- package/dist/chat-card-part.js +0 -3
- package/dist/chat-card.js +0 -6
- package/dist/chat-channel.js +2 -83
- package/dist/chat-continuity.js +0 -31
- package/dist/chat-controls.js +0 -7
- package/dist/chat-core.js +0 -55
- package/dist/chat-decide.js +2 -153
- package/dist/chat-delivery-state.js +0 -49
- package/dist/chat-delivery.js +2 -143
- package/dist/chat-display.js +0 -2
- package/dist/chat-evidence.js +0 -65
- package/dist/chat-flow.js +0 -72
- package/dist/chat-follow.js +0 -13
- package/dist/chat-inbox.js +0 -34
- package/dist/chat-live-schema.js +0 -14
- package/dist/chat-live.js +2 -87
- package/dist/chat-message-states.js +13 -40
- package/dist/chat-messages.js +0 -153
- package/dist/chat-migration.js +0 -57
- package/dist/chat-polish.js +0 -7
- package/dist/chat-quiet.js +0 -37
- package/dist/chat-review.js +0 -4
- package/dist/chat-rooms.js +0 -22
- package/dist/chat-settings-page.js +0 -4
- package/dist/chat-task-actions.js +0 -7
- package/dist/chat-terms.js +0 -21
- package/dist/chat-voice.js +0 -38
- package/dist/chat-warmth.js +1 -3
- package/dist/check-access.js +0 -30
- package/dist/check-facts.js +2 -62
- package/dist/check-failure.js +0 -98
- package/dist/check-levels-ui.js +4 -10
- package/dist/check-levels.js +3 -35
- package/dist/check-load.js +1 -49
- package/dist/check-only-standing.js +0 -6
- package/dist/check-only.js +0 -22
- package/dist/check-progress.js +0 -32
- package/dist/check-repair.js +2 -35
- package/dist/check-report.js +1 -108
- package/dist/check-stamp.js +0 -20
- package/dist/checkout-cleanup.js +0 -84
- package/dist/checkout-proof.js +1 -13
- package/dist/child-database.js +0 -3
- package/dist/claim.js +4 -508
- package/dist/claude-print.js +0 -10
- package/dist/cli-fast.js +0 -8
- package/dist/cli-help.js +90 -78
- package/dist/cli-http.js +0 -10
- package/dist/cli.js +26 -241
- package/dist/code-extract.js +0 -6
- package/dist/code-map-acts.js +0 -7
- package/dist/code-map-admission.js +2 -26
- package/dist/code-map-build.js +3 -24
- package/dist/code-map-cli.js +0 -4
- package/dist/code-map-main.js +0 -6
- package/dist/code-map-read.js +0 -12
- package/dist/code-map-report.js +0 -9
- package/dist/code-map-shape.js +0 -19
- package/dist/code-map-store.js +0 -26
- package/dist/codex-limits.js +1 -17
- package/dist/coding-context.js +0 -10
- package/dist/coding-handoff.js +0 -14
- package/dist/coding-provider.js +0 -39
- package/dist/coding-shipping-ui.js +0 -1
- package/dist/coding-ui.js +0 -1
- package/dist/coding-update.js +1 -18
- package/dist/coding-workspace.js +0 -27
- package/dist/commit-extract.js +0 -83
- package/dist/connect-cli.js +0 -19
- package/dist/console-chrome.js +1 -34
- package/dist/console-instance.js +2 -91
- package/dist/container-state.js +0 -4
- package/dist/containment.js +2 -105
- package/dist/contract-changes.js +0 -6
- package/dist/contracts/acceptance-terms.js +0 -7
- package/dist/contracts/chat-actions.js +0 -46
- package/dist/contracts/chat-callback-rows.js +0 -8
- package/dist/contracts/chat-card.js +0 -14
- package/dist/contracts/chat-content.js +0 -55
- package/dist/contracts/chat-tables.js +0 -7
- package/dist/contracts/cli.js +0 -59
- package/dist/contracts/coding-activity.js +0 -15
- package/dist/contracts/coding-context.js +0 -15
- package/dist/contracts/coding-handoff.js +0 -11
- package/dist/contracts/coding-workspace.js +0 -14
- package/dist/contracts/console-api.js +3 -54
- package/dist/contracts/contract-test.js +0 -14
- package/dist/contracts/contract.js +0 -48
- package/dist/contracts/decision.js +0 -20
- package/dist/contracts/diff-stat.js +0 -16
- package/dist/contracts/discord-callback.js +0 -9
- package/dist/contracts/flow-card.js +0 -18
- package/dist/contracts/flow-propose.js +0 -8
- package/dist/contracts/flow-send.js +0 -31
- package/dist/contracts/flow.js +0 -112
- package/dist/contracts/gateway-tools.js +0 -22
- package/dist/contracts/handoff.js +0 -22
- package/dist/contracts/integration-metadata.js +0 -39
- package/dist/contracts/lead-context.js +0 -14
- package/dist/contracts/lead-tools.js +0 -49
- package/dist/contracts/mcp-oauth.js +0 -12
- package/dist/contracts/memory-pass.js +0 -21
- package/dist/contracts/model-catalog.js +0 -9
- package/dist/contracts/observation-request.js +0 -11
- package/dist/contracts/plan.js +0 -16
- package/dist/contracts/project-knowledge.js +0 -26
- package/dist/contracts/project-memory.js +0 -16
- package/dist/contracts/project-skills.js +0 -31
- package/dist/contracts/proof.js +0 -23
- package/dist/contracts/provider.js +0 -9
- package/dist/contracts/recipes.js +0 -16
- package/dist/contracts/release-check.js +0 -61
- package/dist/contracts/release-terms.js +0 -27
- package/dist/contracts/retention.js +0 -12
- package/dist/contracts/review-findings.js +0 -13
- package/dist/contracts/route-results.js +0 -15
- package/dist/contracts/route.js +0 -33
- package/dist/contracts/scope.js +0 -29
- package/dist/contracts/scout-report.js +0 -34
- package/dist/contracts/slack-callback.js +0 -11
- package/dist/contracts/sort-answer.js +0 -24
- package/dist/contracts/stage-output.js +0 -46
- package/dist/contracts/storage.js +0 -8
- package/dist/contracts/store-json.js +0 -41
- package/dist/contracts/subagent-turn.js +0 -23
- package/dist/contracts/task-sizing.js +0 -10
- package/dist/contracts/teams-callback.js +0 -7
- package/dist/contracts/telegram-callback.js +0 -27
- package/dist/contracts/trigger-payloads.js +0 -41
- package/dist/contracts/update-journal.js +0 -47
- package/dist/contracts/verification-receipt.js +0 -36
- package/dist/contracts/verification-view.js +0 -15
- package/dist/contracts/youiyoux-request.js +0 -26
- package/dist/control-setup.js +0 -7
- package/dist/control-ui.js +0 -3
- package/dist/controller-service.js +0 -4
- package/dist/controller-supervisor.js +0 -15
- package/dist/converse.js +3 -129
- package/dist/coordinator-proposals.js +1 -6
- package/dist/coordinator.js +0 -65
- package/dist/credentials-ui.js +0 -6
- package/dist/daemon.js +0 -137
- package/dist/database-reclaim.js +0 -3
- package/dist/decision.js +0 -78
- package/dist/demo-chat.js +4 -15
- package/dist/demo-sign-in.js +77 -0
- package/dist/demo.js +5 -194
- package/dist/deploy-gate.js +0 -20
- package/dist/deploy-lock.js +0 -4
- package/dist/deploy-phase.js +0 -22
- package/dist/deploy-rescue.js +0 -21
- package/dist/deprecations.js +0 -12
- package/dist/design/kit.css +9 -6
- package/dist/design/kit.js +2 -33
- package/dist/desktop-access.js +0 -9
- package/dist/desktop-bundle.js +1 -3
- package/dist/desktop-host.js +0 -34
- package/dist/desktop-update-gate.js +0 -8
- package/dist/desktop-update-recovery.js +1 -18
- package/dist/desktop-update.js +2 -48
- package/dist/digest-times.js +0 -2
- package/dist/disclosure.js +0 -5
- package/dist/discord-api.js +0 -6
- package/dist/discord-chat.js +0 -31
- package/dist/discord.js +0 -7
- package/dist/discover.js +0 -50
- package/dist/dispatch.js +61 -60
- package/dist/dispose.js +0 -208
- package/dist/doctor.js +0 -48
- package/dist/easy-start-args.js +7 -7
- package/dist/easy-start.js +32 -45
- package/dist/egress.js +1 -63
- package/dist/email-settings.js +0 -8
- package/dist/envelope.js +50 -86
- package/dist/eval-gate.js +1 -37
- package/dist/eval-hooks.js +0 -120
- package/dist/eval-oracle-main.js +0 -7
- package/dist/eval-oracle.js +3 -42
- package/dist/eval-world.js +1 -23
- package/dist/evals.js +6 -134
- package/dist/evidence-pack.js +0 -29
- package/dist/evidence-pair.js +0 -17
- package/dist/evidence.js +4 -280
- package/dist/exec.js +19 -404
- package/dist/exhaustion.js +0 -30
- package/dist/export-ui.js +0 -7
- package/dist/export.js +1 -38
- package/dist/failing-first.js +0 -6
- package/dist/fallback-schema.js +0 -5
- package/dist/fallback.js +0 -81
- package/dist/fast-start.js +0 -97
- package/dist/fast-terms.js +0 -3
- package/dist/fenced-check-coverage.js +0 -11
- package/dist/findings.js +1 -63
- package/dist/first-run.js +4 -57
- package/dist/first-tasks-child.js +0 -5
- package/dist/flaky-ci.js +1 -24
- package/dist/flaky-cli.js +0 -4
- package/dist/flaky.js +0 -43
- package/dist/fleet-schema.js +0 -11
- package/dist/flow-actions.js +0 -31
- package/dist/flow-browser.js +0 -42
- package/dist/flow-cadence.js +1 -24
- package/dist/flow-card-task.js +0 -11
- package/dist/flow-changed.js +0 -16
- package/dist/flow-code.js +1 -45
- package/dist/flow-draft.js +0 -17
- package/dist/flow-engine.js +2 -76
- package/dist/flow-gallery-ui.js +0 -28
- package/dist/flow-gallery.js +0 -54
- package/dist/flow-insights.js +0 -12
- package/dist/flow-items.js +0 -27
- package/dist/flow-live.js +0 -31
- package/dist/flow-people.js +0 -14
- package/dist/flow-pull-request.js +0 -32
- package/dist/flow-replies.js +0 -9
- package/dist/flow-result-card.js +0 -8
- package/dist/flow-schedule.js +0 -74
- package/dist/flow-scripts.js +0 -13
- package/dist/flow-secrets.js +0 -10
- package/dist/flow-send.js +0 -45
- package/dist/flow-share.js +0 -60
- package/dist/flow-sort.js +1 -24
- package/dist/flow-starters-ui.js +0 -2
- package/dist/flow-starters.js +0 -13
- package/dist/flow-steps.js +0 -80
- package/dist/flow-triggers.js +2 -256
- package/dist/flow-unattended-words.js +0 -13
- package/dist/flow-unattended.js +2 -115
- package/dist/flows-cli.js +2 -36
- package/dist/flows-ui.js +0 -51
- package/dist/flows.js +0 -158
- package/dist/folder-gate.js +0 -21
- package/dist/folder-look.js +0 -42
- package/dist/follow-through-brief.js +0 -6
- package/dist/follow-through-cli.js +0 -5
- package/dist/fonts.js +0 -13
- package/dist/gaps.js +0 -20
- package/dist/gate-failure.js +0 -7
- package/dist/git-floor.js +0 -12
- package/dist/git-incident.js +2 -38
- package/dist/git-views.js +0 -24
- package/dist/git.js +0 -31
- package/dist/github-import.js +0 -22
- package/dist/github-jobs.js +0 -12
- package/dist/google-mail.js +2 -27
- package/dist/grant.js +0 -110
- package/dist/graph.js +0 -108
- package/dist/guides.js +4 -15
- package/dist/handover-note.js +0 -12
- package/dist/health-cli.js +0 -2
- package/dist/home-groups.js +0 -15
- package/dist/html.js +0 -54
- package/dist/install-method.js +0 -12
- package/dist/integrations-ui.js +0 -15
- package/dist/integrations.js +7 -50
- package/dist/invoke.js +1 -381
- package/dist/is-record.js +0 -1
- package/dist/issues.js +0 -48
- package/dist/jsonl-discriminants.js +0 -6
- package/dist/keymap.js +2 -16
- package/dist/keys.js +0 -56
- package/dist/kits-ui.js +0 -3
- package/dist/kits.js +1 -24
- package/dist/knowledge-cli.js +0 -4
- package/dist/knowledge-ui.js +0 -8
- package/dist/landed-cleanup.js +0 -119
- package/dist/laptop-background.js +0 -85
- package/dist/laptop-service.js +0 -67
- package/dist/latency-timeline.js +2 -23
- package/dist/lead-about.js +0 -7
- package/dist/lead-answer-eval.js +0 -39
- package/dist/lead-capabilities.js +0 -19
- package/dist/lead-cli-live.js +0 -22
- package/dist/lead-cli.js +0 -27
- package/dist/lead-commitments.js +1 -27
- package/dist/lead-context.js +2 -42
- package/dist/lead-contract.js +0 -8
- package/dist/lead-doors.js +0 -105
- package/dist/lead-follow.js +0 -41
- package/dist/lead-identity.js +1 -4
- package/dist/lead-latency-schema.js +0 -13
- package/dist/lead-people.js +3 -18
- package/dist/lead-progress.js +0 -12
- package/dist/lead-queue-runtime.js +0 -26
- package/dist/lead-queue.js +0 -35
- package/dist/lead-route.js +0 -33
- package/dist/lead-status.js +0 -37
- package/dist/lead-sweep.js +0 -18
- package/dist/lead-tools.js +0 -160
- package/dist/lead-voice.js +0 -54
- package/dist/lead.js +2 -105
- package/dist/learning-child.js +0 -6
- package/dist/learning-look.js +0 -14
- package/dist/ledger-chain.js +0 -34
- package/dist/ledger-csv.js +0 -2
- package/dist/ledger-view.js +0 -3
- package/dist/lesson-notes.js +0 -56
- package/dist/limits-ui.js +0 -14
- package/dist/link.js +0 -79
- package/dist/live-backup.js +3 -33
- package/dist/live-bus.js +7 -81
- package/dist/live-children-read.js +4 -47
- package/dist/live-children.js +4 -44
- package/dist/live-detail.js +0 -17
- package/dist/live-input.js +5 -68
- package/dist/live-main-read.js +1 -14
- package/dist/live-notes.js +0 -12
- package/dist/live-open.js +1 -23
- package/dist/live-records.js +4 -151
- package/dist/live-reply.js +1 -51
- package/dist/live-terminal.js +12 -111
- package/dist/live.js +4 -130
- package/dist/local-owner-acts.js +168 -0
- package/dist/local-owner.js +15 -80
- package/dist/log.js +0 -8
- package/dist/login-secrets.js +2 -38
- package/dist/machine-check.js +0 -2
- package/dist/machine-identity.js +1 -46
- package/dist/mailbox.js +0 -30
- package/dist/maintenance.js +1 -3
- package/dist/mcp-connect.js +0 -88
- package/dist/mcp-core.js +0 -45
- package/dist/mcp-http.js +0 -13
- package/dist/mcp-oauth.js +0 -37
- package/dist/mcp-person.js +0 -11
- package/dist/mcp.js +3 -73
- package/dist/memory-cli.js +0 -3
- package/dist/memory-pass.js +0 -53
- package/dist/memory-tidy.js +0 -55
- package/dist/memory-use.js +2 -24
- package/dist/merge-checklist.js +21 -29
- package/dist/metrics.js +0 -10
- package/dist/mobile-viewport.js +0 -6
- package/dist/model-catalog.js +1 -33
- package/dist/model-choices.js +9 -84
- package/dist/model-names.js +0 -9
- package/dist/models-cli.js +0 -13
- package/dist/models-ui.js +0 -17
- package/dist/modes.js +0 -35
- package/dist/monitoring-settings.js +2 -27
- package/dist/monitoring-ui.js +2 -14
- package/dist/monitoring.js +2 -38
- package/dist/names.js +0 -39
- package/dist/needs-you.js +7 -70
- package/dist/never-index.js +0 -9
- package/dist/nightly-check.js +0 -74
- package/dist/nightly-github.js +0 -168
- package/dist/notification-delivery.js +0 -3
- package/dist/notification-rows.js +0 -17
- package/dist/oauth-run-token.js +1 -37
- package/dist/observations.js +0 -16
- package/dist/oidc.js +1 -20
- package/dist/onboard.js +4 -57
- package/dist/one-step-chat-schema.js +0 -15
- package/dist/openrouter-models.js +0 -6
- package/dist/operate-remote-arguments.js +2 -17
- package/dist/operate-remote.js +0 -33
- package/dist/operate.js +280 -2304
- package/dist/orphan-sweep.js +3 -37
- package/dist/page-work-contract.js +0 -3
- package/dist/password-bearer.js +1 -11
- package/dist/passwordless.js +0 -3
- package/dist/peek-cli.js +0 -46
- package/dist/peek.js +2 -61
- package/dist/people-audit-ui.js +0 -6
- package/dist/person-proof.js +0 -6
- package/dist/phase-routing.js +8 -183
- package/dist/plain-schema.js +0 -14
- package/dist/plain-words.js +18 -12
- package/dist/plan-auto.js +3 -18
- package/dist/plan-login.js +0 -16
- package/dist/plan.js +0 -68
- package/dist/plane-review.js +0 -56
- package/dist/planner-source.js +0 -96
- package/dist/planner.js +0 -117
- package/dist/policy-ui.js +0 -8
- package/dist/policy.js +0 -47
- package/dist/prepared-evidence.js +0 -5
- package/dist/principal.js +0 -29
- package/dist/probe.js +0 -30
- package/dist/process-custody.js +0 -15
- package/dist/process-liveness.js +0 -32
- package/dist/process-tree.js +3 -29
- package/dist/project-access.js +0 -10
- package/dist/project-admission.js +1 -41
- package/dist/project-cli.js +0 -6
- package/dist/project-concurrency.js +0 -35
- package/dist/project-delete-ui.js +4 -29
- package/dist/project-delete.js +1 -73
- package/dist/project-demo.js +0 -13
- package/dist/project-file.js +0 -2
- package/dist/project-identity.js +0 -41
- package/dist/project-knowledge.js +0 -39
- package/dist/project-learning.js +3 -55
- package/dist/project-memory.js +2 -45
- package/dist/project-outcomes.js +0 -6
- package/dist/project-sandbox.js +0 -23
- package/dist/project-skills.js +0 -12
- package/dist/project-tools.js +6 -184
- package/dist/project.js +0 -48
- package/dist/prompt.js +0 -31
- package/dist/proof.js +0 -220
- package/dist/proposal.js +0 -50
- package/dist/protected-storage-look.js +0 -6
- package/dist/protected-storage.js +1 -84
- package/dist/provider-auth.js +3 -69
- package/dist/provider-capture.js +1 -15
- package/dist/provider-connection.js +0 -8
- package/dist/provider-home.js +0 -25
- package/dist/provider-limits.js +0 -14
- package/dist/provider.js +0 -324
- package/dist/public-access.js +11 -30
- package/dist/public-check.js +0 -16
- package/dist/publish.js +1 -150
- package/dist/pull-request-flow.js +6 -74
- package/dist/pull-request-schema.js +0 -4
- package/dist/pull-request-ui.js +0 -5
- package/dist/pulls.js +0 -80
- package/dist/push.js +5 -89
- package/dist/quick-start.js +1 -23
- package/dist/read-executor-worker.js +0 -1
- package/dist/read-executor.js +0 -10
- package/dist/read-only-request.js +0 -7
- package/dist/recipe-ui.js +0 -6
- package/dist/recipes.js +0 -13
- package/dist/release-adapters.js +6 -214
- package/dist/release-approval.js +0 -74
- package/dist/release-authority.js +0 -42
- package/dist/release-auto.js +0 -142
- package/dist/release-card.js +26 -103
- package/dist/release-carry.js +0 -132
- package/dist/release-ci-hold.js +0 -20
- package/dist/release-cli.js +0 -46
- package/dist/release-coverage.js +0 -16
- package/dist/release-gate.js +0 -30
- package/dist/release-git.js +0 -24
- package/dist/release-links.js +0 -17
- package/dist/release-net.js +0 -42
- package/dist/release-next.js +0 -25
- package/dist/release-recheck.js +0 -89
- package/dist/release-refusal.js +0 -18
- package/dist/release-view.js +0 -5
- package/dist/release.js +7 -341
- package/dist/releases.js +0 -49
- package/dist/remote-audit.js +0 -25
- package/dist/remote-command.js +0 -16
- package/dist/remote-destination.js +5 -26
- package/dist/remote-exec.js +1 -27
- package/dist/remote-main.js +1 -53
- package/dist/remote-run.js +0 -5
- package/dist/remote.js +0 -49
- package/dist/render.js +0 -133
- package/dist/reply-shape.js +0 -85
- package/dist/reply-voice.js +0 -7
- package/dist/report-summary.js +0 -5
- package/dist/reported-usage.js +0 -30
- package/dist/repos.js +9 -62
- package/dist/repository-context.js +1 -24
- package/dist/request-budget-ui.js +0 -4
- package/dist/request-budget.js +0 -23
- package/dist/restart-certification.js +0 -37
- package/dist/result-actions.js +0 -62
- package/dist/result-acts.js +0 -34
- package/dist/result-completion.js +9 -28
- package/dist/result-evidence-readers.js +0 -3
- package/dist/result-follow-ups.js +1 -39
- package/dist/result-review.js +0 -86
- package/dist/result-shots.js +0 -39
- package/dist/retention-ui.js +0 -7
- package/dist/retention.js +2 -46
- package/dist/review-context.js +0 -129
- package/dist/review-evidence.js +0 -4
- package/dist/review-switch.js +1 -7
- package/dist/reviewer.js +0 -35
- package/dist/route-change-check.js +0 -2
- package/dist/route-change.js +0 -16
- package/dist/route-hooks.js +0 -27
- package/dist/route-results.js +2 -58
- package/dist/route-rules.js +1 -106
- package/dist/route-savings.js +0 -36
- package/dist/route-store.js +1 -133
- package/dist/run-closeout.js +2 -50
- package/dist/run-efficiency.js +2 -44
- package/dist/run-ending.js +0 -13
- package/dist/runner-process.js +0 -33
- package/dist/runner.js +17 -189
- package/dist/sample-project.js +2 -27
- package/dist/sandbox-launch.js +4 -25
- package/dist/sandbox-runtime.js +1 -88
- package/dist/scan.js +0 -27
- package/dist/scope.js +88 -566
- package/dist/scout-browser-lock.js +0 -6
- package/dist/scout-browser.js +2 -68
- package/dist/scout-net.js +1 -32
- package/dist/scout-report.js +0 -22
- package/dist/scout.js +1 -116
- package/dist/secret-mint.js +0 -6
- package/dist/serve.js +29 -564
- package/dist/server/agents-computers.js +0 -10
- package/dist/server/agents-live-filed.js +0 -13
- package/dist/server/agents-live-lead.js +0 -19
- package/dist/server/agents-live-room.js +0 -19
- package/dist/server/chat.js +2 -194
- package/dist/server/chrome.js +17 -263
- package/dist/server/console.css +4 -4
- package/dist/server/edge-refusal.js +0 -3
- package/dist/server/flows.js +5 -74
- package/dist/server/guards.js +9 -86
- package/dist/server/handler-registry.js +0 -2
- package/dist/server/home-asks.js +1 -22
- package/dist/server/home.js +1 -30
- package/dist/server/http.js +0 -82
- package/dist/server/in-place.js +0 -15
- package/dist/server/kit-standalone.js +0 -20
- package/dist/server/kit.js +2 -114
- package/dist/server/last-checks.js +0 -2
- package/dist/server/live.js +1 -36
- package/dist/server/merge-ready-view.js +0 -6
- package/dist/server/mutation-key.js +3 -40
- package/dist/server/pages-assets.js +0 -16
- package/dist/server/pages.js +7 -195
- package/dist/server/people-tokens.js +3 -101
- package/dist/server/remote-hooks.js +0 -13
- package/dist/server/remote.js +0 -28
- package/dist/server/render-chat.js +8 -144
- package/dist/server/render-code-map.js +0 -5
- package/dist/server/render-flaky.js +0 -8
- package/dist/server/render-follow-through.js +2 -5
- package/dist/server/render-history.js +2 -34
- package/dist/server/render-new-task.js +2 -29
- package/dist/server/render-pages.js +1 -111
- package/dist/server/render-people.js +2 -46
- package/dist/server/render-projects.js +15 -32
- package/dist/server/render-release.js +1 -14
- package/dist/server/render-results.js +4 -355
- package/dist/server/render-settings.js +0 -15
- package/dist/server/render-tasks.js +17 -497
- package/dist/server/request-context.js +2 -9
- package/dist/server/retired-routes.js +0 -11
- package/dist/server/route-policy.js +0 -3
- package/dist/server/route-table.js +8 -133
- package/dist/server/runtime.js +0 -1
- package/dist/server/session.js +0 -28
- package/dist/server/settings.js +40 -246
- package/dist/server/signup-gate.js +0 -11
- package/dist/server/sweeps.js +0 -6
- package/dist/server/task-views.js +12 -227
- package/dist/server/tasks.js +37 -531
- package/dist/server/terminals.js +2 -46
- package/dist/server/welcome.js +2 -22
- package/dist/server-telemetry.js +0 -9
- package/dist/settings-groups-ui.js +50 -63
- package/dist/settings-kit-script.js +0 -19
- package/dist/settings-kit.js +0 -63
- package/dist/settings-proofs.js +0 -23
- package/dist/setup-guide.js +1 -9
- package/dist/shared-deps.js +9 -84
- package/dist/sign-in-guard.js +0 -27
- package/dist/skills-ui.js +0 -2
- package/dist/skills.js +2 -54
- package/dist/slack-api.js +0 -3
- package/dist/slack-chat.js +0 -25
- package/dist/slack-settings.js +0 -1
- package/dist/slack-socket.js +0 -5
- package/dist/slack.js +0 -4
- package/dist/sleep.js +0 -1
- package/dist/source-key.js +0 -10
- package/dist/spend-report.js +0 -29
- package/dist/spend-ui.js +0 -26
- package/dist/spend.js +0 -40
- package/dist/sqlite-runtime.js +0 -2
- package/dist/sqlite-telemetry.js +0 -9
- package/dist/sso-settings.js +0 -13
- package/dist/sso-ui.js +0 -2
- package/dist/staged-runtimes.js +5 -39
- package/dist/steer-capabilities.js +1 -7
- package/dist/steer-controls.js +0 -10
- package/dist/steer-live.js +0 -31
- package/dist/steer-mailbox.js +4 -65
- package/dist/steer-status.js +0 -7
- package/dist/stop-proof.js +5 -62
- package/dist/storage-sweep-child.js +1 -5
- package/dist/storage-sweep-process.js +2 -20
- package/dist/storage-sweep-schedule.js +0 -32
- package/dist/storage-sweep.js +2 -51
- package/dist/storage-ui.js +0 -18
- package/dist/storage.js +0 -31
- package/dist/store-baseline.js +0 -14
- package/dist/store.js +109 -4763
- package/dist/stream-scope.js +0 -16
- package/dist/structured-output.js +0 -39
- package/dist/style-asset.js +0 -2
- package/dist/subagent-admin.js +0 -9
- package/dist/subagent-desk.js +0 -29
- package/dist/subagent-memory.js +0 -38
- package/dist/subagent-question.js +0 -29
- package/dist/subagent-tools.js +1 -60
- package/dist/subagent-week.js +0 -28
- package/dist/subagent-work.js +1 -39
- package/dist/subagents-ui.js +1 -13
- package/dist/subagents.js +0 -40
- package/dist/subscription-chat.js +1 -42
- package/dist/summary.js +0 -19
- package/dist/surface.js +8 -73
- package/dist/sweep-gate.js +0 -2
- package/dist/sweep-quarantine.js +2 -13
- package/dist/sync.js +0 -47
- package/dist/tailnet.js +0 -9
- package/dist/tamper-scan.js +0 -15
- package/dist/task-activity.js +1 -16
- package/dist/task-aliases.js +0 -3
- package/dist/task-archive.js +0 -7
- package/dist/task-base.js +0 -18
- package/dist/task-composer.js +0 -2
- package/dist/task-control.js +0 -74
- package/dist/task-live.js +0 -23
- package/dist/task-moves.js +0 -28
- package/dist/task-outcome-cli.js +66 -19
- package/dist/task-review-brief.js +0 -7
- package/dist/task-sizing.js +0 -47
- package/dist/task-source.js +0 -23
- package/dist/task-status.js +0 -106
- package/dist/task-text.js +0 -12
- package/dist/team-chat-authorization.js +0 -3
- package/dist/team-contract.js +0 -2
- package/dist/team-http.js +0 -4
- package/dist/team-leads.js +1 -16
- package/dist/team-runtime.js +0 -13
- package/dist/team-ui.js +0 -1
- package/dist/team-updates.js +0 -4
- package/dist/teams-api.js +0 -12
- package/dist/teams-chat.js +0 -28
- package/dist/teams.js +0 -12
- package/dist/teardown-git.js +6 -294
- package/dist/telegram-flow.js +0 -51
- package/dist/telegram-lead.js +2 -203
- package/dist/telegram-live.js +1 -42
- package/dist/telegram-progress.js +0 -18
- package/dist/telegram-settings.js +0 -7
- package/dist/telegram-status.js +0 -46
- package/dist/telegram-team.js +1 -33
- package/dist/telegram.js +6 -454
- package/dist/templates.js +0 -24
- package/dist/terminal-catalog.js +2 -20
- package/dist/terminal-text.js +0 -12
- package/dist/test-infra.js +0 -50
- package/dist/test-temp.js +3 -26
- package/dist/text-limits.js +0 -92
- package/dist/tidy.js +0 -76
- package/dist/tier-report.js +0 -2
- package/dist/token-notices.js +1 -9
- package/dist/tokens-cli.js +0 -13
- package/dist/tool-broker.js +2 -53
- package/dist/tool-launcher.js +0 -14
- package/dist/tool-secret-store.js +3 -125
- package/dist/toolroll-update-cli.js +0 -9
- package/dist/toolroll-update-ui.js +0 -14
- package/dist/toolroll-update.js +13 -252
- package/dist/tools-ui.js +0 -17
- package/dist/transitions-recipes.js +0 -2
- package/dist/tree-proof.js +0 -23
- package/dist/tui-contract.js +0 -8
- package/dist/tui-source.js +91 -40
- package/dist/tui.js +54 -54
- package/dist/typed-start.js +0 -27
- package/dist/unfenced-test-support.js +0 -5
- package/dist/up-processes.js +1 -40
- package/dist/up-role-child.js +1 -13
- package/dist/update-notice.js +0 -1
- package/dist/vanished-retry.js +0 -40
- package/dist/verification-evidence.js +0 -39
- package/dist/version.js +0 -1
- package/dist/wake-hub.js +0 -28
- package/dist/webhook-limits.js +0 -7
- package/dist/webhook-readers.js +0 -30
- package/dist/webhook-signing.js +0 -14
- package/dist/webhooks.js +0 -54
- package/dist/welcome-facts.js +2 -14
- package/dist/when-html.js +0 -27
- package/dist/work-index.js +26 -98
- package/dist/work-summary.js +2 -17
- package/dist/workspace-motion.js +0 -2
- package/dist/workspace-revision.js +1 -21
- package/dist/workspace-ui.js +15 -135
- package/dist/worktree-notices.js +0 -3
- package/dist/worktree.js +0 -308
- package/dist/writes-mode.js +0 -1
- package/dist/youiyoux-intake.js +4 -159
- package/package.json +5 -4
- package/dist/accent-colors.d.ts +0 -51
- package/dist/acp-agents.d.ts +0 -43
- package/dist/acp-attest.d.ts +0 -44
- package/dist/acp-check.d.ts +0 -37
- package/dist/acp-client.d.ts +0 -163
- package/dist/acp-inspect.d.ts +0 -23
- package/dist/action-ledger.d.ts +0 -27
- package/dist/activity-line.d.ts +0 -29
- package/dist/actor.d.ts +0 -11
- package/dist/agent-board.d.ts +0 -229
- package/dist/agent-fence.d.ts +0 -479
- package/dist/agent-onboard.d.ts +0 -158
- package/dist/agent-pulse.d.ts +0 -43
- package/dist/agent-state-words.d.ts +0 -19
- package/dist/agent-state.d.ts +0 -65
- package/dist/agent-turns.d.ts +0 -52
- package/dist/agentconfig.d.ts +0 -191
- package/dist/agents-board.d.ts +0 -145
- package/dist/agents-live.d.ts +0 -31
- package/dist/api-tokens.d.ts +0 -80
- package/dist/approval-authority.d.ts +0 -51
- package/dist/approval-password.d.ts +0 -31
- package/dist/approval-policy.d.ts +0 -69
- package/dist/approval-rules-ui.d.ts +0 -40
- package/dist/assignment-adapters.d.ts +0 -152
- package/dist/assignment-brief.d.ts +0 -83
- package/dist/assignment-delivery.d.ts +0 -86
- package/dist/assignment-presentation.d.ts +0 -37
- package/dist/assignment-status.d.ts +0 -71
- package/dist/assignment-ui.d.ts +0 -68
- package/dist/assignment.d.ts +0 -318
- package/dist/attest.d.ts +0 -59
- package/dist/audit-cli.d.ts +0 -17
- package/dist/backend.d.ts +0 -97
- package/dist/backup-ui.d.ts +0 -32
- package/dist/backup.d.ts +0 -92
- package/dist/batch-checks.d.ts +0 -15
- package/dist/batch-policy.d.ts +0 -23
- package/dist/beads.d.ts +0 -34
- package/dist/bin.d.ts +0 -2
- package/dist/board.d.ts +0 -134
- package/dist/boot-identity.d.ts +0 -64
- package/dist/bounded-spawn.d.ts +0 -57
- package/dist/brand-icons.d.ts +0 -168
- package/dist/brand-mark.d.ts +0 -28
- package/dist/brief-fence.d.ts +0 -9
- package/dist/browser-crew.d.ts +0 -12
- package/dist/browser-shell.d.ts +0 -9
- package/dist/browser-workspace.d.ts +0 -1972
- package/dist/budget-alerts.d.ts +0 -19
- package/dist/build-review.d.ts +0 -38
- package/dist/builder-restart.d.ts +0 -21
- package/dist/builder.d.ts +0 -409
- package/dist/canonical-json.d.ts +0 -14
- package/dist/capscan.d.ts +0 -35
- package/dist/card-catalog.d.ts +0 -209
- package/dist/card-cli.d.ts +0 -43
- package/dist/card-render.d.ts +0 -43
- package/dist/card-sources.d.ts +0 -68
- package/dist/chat-acceptance.d.ts +0 -74
- package/dist/chat-actions.d.ts +0 -460
- package/dist/chat-admission.d.ts +0 -19
- package/dist/chat-approval.d.ts +0 -58
- package/dist/chat-ask.d.ts +0 -32
- package/dist/chat-card-part.d.ts +0 -11
- package/dist/chat-card.d.ts +0 -46
- package/dist/chat-channel.d.ts +0 -126
- package/dist/chat-continuity.d.ts +0 -32
- package/dist/chat-controls.d.ts +0 -117
- package/dist/chat-core.d.ts +0 -177
- package/dist/chat-decide.d.ts +0 -269
- package/dist/chat-delivery-state.d.ts +0 -132
- package/dist/chat-delivery.d.ts +0 -71
- package/dist/chat-display.d.ts +0 -1
- package/dist/chat-evidence.d.ts +0 -123
- package/dist/chat-flow.d.ts +0 -70
- package/dist/chat-follow.d.ts +0 -20
- package/dist/chat-inbox.d.ts +0 -57
- package/dist/chat-live-schema.d.ts +0 -17
- package/dist/chat-live.d.ts +0 -161
- package/dist/chat-message-states.d.ts +0 -75
- package/dist/chat-messages.d.ts +0 -338
- package/dist/chat-migration.d.ts +0 -30
- package/dist/chat-polish.d.ts +0 -17
- package/dist/chat-quiet.d.ts +0 -40
- package/dist/chat-review.d.ts +0 -51
- package/dist/chat-rooms.d.ts +0 -123
- package/dist/chat-settings-page.d.ts +0 -43
- package/dist/chat-task-actions.d.ts +0 -59
- package/dist/chat-terms.d.ts +0 -29
- package/dist/chat-voice.d.ts +0 -69
- package/dist/chat-warmth.d.ts +0 -21
- package/dist/check-access.d.ts +0 -54
- package/dist/check-facts.d.ts +0 -126
- package/dist/check-failure.d.ts +0 -113
- package/dist/check-levels-ui.d.ts +0 -36
- package/dist/check-levels.d.ts +0 -70
- package/dist/check-load.d.ts +0 -85
- package/dist/check-only-standing.d.ts +0 -36
- package/dist/check-only.d.ts +0 -15
- package/dist/check-progress.d.ts +0 -78
- package/dist/check-repair.d.ts +0 -47
- package/dist/check-report.d.ts +0 -177
- package/dist/check-stamp.d.ts +0 -46
- package/dist/checkout-cleanup.d.ts +0 -157
- package/dist/checkout-proof.d.ts +0 -28
- package/dist/child-database.d.ts +0 -12
- package/dist/claim.d.ts +0 -627
- package/dist/claude-print.d.ts +0 -12
- package/dist/cli-fast.d.ts +0 -8
- package/dist/cli-help.d.ts +0 -8
- package/dist/cli-http.d.ts +0 -58
- package/dist/cli.d.ts +0 -149
- package/dist/code-extract.d.ts +0 -44
- package/dist/code-map-acts.d.ts +0 -24
- package/dist/code-map-admission.d.ts +0 -52
- package/dist/code-map-build.d.ts +0 -63
- package/dist/code-map-cli.d.ts +0 -153
- package/dist/code-map-main.d.ts +0 -1
- package/dist/code-map-read.d.ts +0 -106
- package/dist/code-map-report.d.ts +0 -37
- package/dist/code-map-shape.d.ts +0 -172
- package/dist/code-map-store.d.ts +0 -136
- package/dist/codex-limits.d.ts +0 -15
- package/dist/coding-context.d.ts +0 -18
- package/dist/coding-handoff.d.ts +0 -39
- package/dist/coding-provider.d.ts +0 -88
- package/dist/coding-shipping-ui.d.ts +0 -5
- package/dist/coding-types.d.ts +0 -16
- package/dist/coding-ui.d.ts +0 -19
- package/dist/coding-update.d.ts +0 -28
- package/dist/coding-workspace.d.ts +0 -141
- package/dist/commit-extract.d.ts +0 -135
- package/dist/connect-cli.d.ts +0 -34
- package/dist/console-chrome.d.ts +0 -41
- package/dist/console-instance.d.ts +0 -157
- package/dist/container-state.d.ts +0 -5
- package/dist/containment.d.ts +0 -205
- package/dist/contract-changes.d.ts +0 -52
- package/dist/contracts/acceptance-terms.d.ts +0 -14
- package/dist/contracts/chat-actions.d.ts +0 -465
- package/dist/contracts/chat-callback-rows.d.ts +0 -59
- package/dist/contracts/chat-card.d.ts +0 -91
- package/dist/contracts/chat-content.d.ts +0 -551
- package/dist/contracts/chat-tables.d.ts +0 -12
- package/dist/contracts/cli.d.ts +0 -987
- package/dist/contracts/coding-activity.d.ts +0 -64
- package/dist/contracts/coding-context.d.ts +0 -97
- package/dist/contracts/coding-handoff.d.ts +0 -44
- package/dist/contracts/coding-workspace.d.ts +0 -165
- package/dist/contracts/console-api.d.ts +0 -539
- package/dist/contracts/contract-test.d.ts +0 -45
- package/dist/contracts/contract.d.ts +0 -92
- package/dist/contracts/decision.d.ts +0 -45
- package/dist/contracts/diff-stat.d.ts +0 -58
- package/dist/contracts/discord-callback.d.ts +0 -45
- package/dist/contracts/flow-card.d.ts +0 -53
- package/dist/contracts/flow-propose.d.ts +0 -334
- package/dist/contracts/flow-send.d.ts +0 -245
- package/dist/contracts/flow.d.ts +0 -19565
- package/dist/contracts/gateway-tools.d.ts +0 -472
- package/dist/contracts/handoff.d.ts +0 -91
- package/dist/contracts/health.d.ts +0 -82
- package/dist/contracts/integration-metadata.d.ts +0 -100
- package/dist/contracts/lead-context.d.ts +0 -165
- package/dist/contracts/lead-tools.d.ts +0 -2312
- package/dist/contracts/mcp-oauth.d.ts +0 -53
- package/dist/contracts/memory-pass.d.ts +0 -157
- package/dist/contracts/model-catalog.d.ts +0 -21
- package/dist/contracts/observation-request.d.ts +0 -37
- package/dist/contracts/plan.d.ts +0 -58
- package/dist/contracts/project-knowledge.d.ts +0 -159
- package/dist/contracts/project-memory.d.ts +0 -119
- package/dist/contracts/project-skills.d.ts +0 -120
- package/dist/contracts/proof.d.ts +0 -136
- package/dist/contracts/provider.d.ts +0 -40
- package/dist/contracts/recipes.d.ts +0 -166
- package/dist/contracts/release-check.d.ts +0 -371
- package/dist/contracts/release-terms.d.ts +0 -107
- package/dist/contracts/retention.d.ts +0 -42
- package/dist/contracts/review-findings.d.ts +0 -46
- package/dist/contracts/route-results.d.ts +0 -121
- package/dist/contracts/route.d.ts +0 -897
- package/dist/contracts/scope.d.ts +0 -105
- package/dist/contracts/scout-report.d.ts +0 -234
- package/dist/contracts/slack-callback.d.ts +0 -43
- package/dist/contracts/sort-answer.d.ts +0 -83
- package/dist/contracts/stage-output.d.ts +0 -127
- package/dist/contracts/storage.d.ts +0 -37
- package/dist/contracts/store-json.d.ts +0 -313
- package/dist/contracts/subagent-turn.d.ts +0 -43
- package/dist/contracts/task-sizing.d.ts +0 -24
- package/dist/contracts/teams-callback.d.ts +0 -13
- package/dist/contracts/telegram-callback.d.ts +0 -120
- package/dist/contracts/trigger-payloads.d.ts +0 -389
- package/dist/contracts/update-journal.d.ts +0 -254
- package/dist/contracts/verification-receipt.d.ts +0 -200
- package/dist/contracts/verification-view.d.ts +0 -102
- package/dist/contracts/youiyoux-request.d.ts +0 -248
- package/dist/control-setup.d.ts +0 -44
- package/dist/control-ui.d.ts +0 -37
- package/dist/controller-service.d.ts +0 -1
- package/dist/controller-supervisor.d.ts +0 -38
- package/dist/converse.d.ts +0 -316
- package/dist/coordinator-proposals.d.ts +0 -29
- package/dist/coordinator.d.ts +0 -186
- package/dist/credentials-ui.d.ts +0 -33
- package/dist/daemon.d.ts +0 -226
- package/dist/database-reclaim.d.ts +0 -4
- package/dist/decision.d.ts +0 -119
- package/dist/demo-chat.d.ts +0 -32
- package/dist/demo.d.ts +0 -153
- package/dist/deploy-gate.d.ts +0 -20
- package/dist/deploy-lock.d.ts +0 -8
- package/dist/deploy-phase.d.ts +0 -37
- package/dist/deploy-rescue.d.ts +0 -42
- package/dist/deprecations.d.ts +0 -20
- package/dist/design/kit.d.ts +0 -216
- package/dist/desktop-access.d.ts +0 -28
- package/dist/desktop-bundle.d.ts +0 -16
- package/dist/desktop-host.d.ts +0 -54
- package/dist/desktop-update-gate.d.ts +0 -12
- package/dist/desktop-update-recovery.d.ts +0 -14
- package/dist/desktop-update.d.ts +0 -147
- package/dist/digest-times.d.ts +0 -3
- package/dist/disclosure.d.ts +0 -6
- package/dist/discord-api.d.ts +0 -24
- package/dist/discord-chat.d.ts +0 -27
- package/dist/discord-settings.d.ts +0 -4
- package/dist/discord.d.ts +0 -10
- package/dist/discover.d.ts +0 -75
- package/dist/dispatch.d.ts +0 -123
- package/dist/dispose.d.ts +0 -194
- package/dist/doctor.d.ts +0 -67
- package/dist/easy-start-args.d.ts +0 -13
- package/dist/easy-start.d.ts +0 -77
- package/dist/egress.d.ts +0 -121
- package/dist/email-settings.d.ts +0 -34
- package/dist/envelope.d.ts +0 -47
- package/dist/eval-gate.d.ts +0 -51
- package/dist/eval-hooks.d.ts +0 -94
- package/dist/eval-oracle-main.d.ts +0 -1
- package/dist/eval-oracle.d.ts +0 -60
- package/dist/eval-world.d.ts +0 -17
- package/dist/evals.d.ts +0 -299
- package/dist/evidence-pack.d.ts +0 -186
- package/dist/evidence-pair.d.ts +0 -53
- package/dist/evidence.d.ts +0 -371
- package/dist/exec.d.ts +0 -355
- package/dist/exhaustion.d.ts +0 -58
- package/dist/export-ui.d.ts +0 -11
- package/dist/export.d.ts +0 -48
- package/dist/failing-first.d.ts +0 -31
- package/dist/fallback-schema.d.ts +0 -8
- package/dist/fallback.d.ts +0 -138
- package/dist/fast-start.d.ts +0 -213
- package/dist/fast-terms.d.ts +0 -9
- package/dist/fenced-check-coverage.d.ts +0 -62
- package/dist/findings.d.ts +0 -224
- package/dist/first-run.d.ts +0 -197
- package/dist/first-tasks-child.d.ts +0 -1
- package/dist/flaky-ci.d.ts +0 -31
- package/dist/flaky-cli.d.ts +0 -60
- package/dist/flaky.d.ts +0 -83
- package/dist/fleet-schema.d.ts +0 -17
- package/dist/flow-actions.d.ts +0 -79
- package/dist/flow-browser.d.ts +0 -103
- package/dist/flow-cadence.d.ts +0 -48
- package/dist/flow-card-task.d.ts +0 -11
- package/dist/flow-changed.d.ts +0 -14
- package/dist/flow-code.d.ts +0 -84
- package/dist/flow-draft.d.ts +0 -42
- package/dist/flow-engine.d.ts +0 -82
- package/dist/flow-gallery-ui.d.ts +0 -73
- package/dist/flow-gallery.d.ts +0 -147
- package/dist/flow-insights.d.ts +0 -104
- package/dist/flow-items.d.ts +0 -37
- package/dist/flow-live.d.ts +0 -16
- package/dist/flow-people.d.ts +0 -23
- package/dist/flow-pull-request.d.ts +0 -14
- package/dist/flow-replies.d.ts +0 -48
- package/dist/flow-result-card.d.ts +0 -22
- package/dist/flow-schedule.d.ts +0 -154
- package/dist/flow-scripts.d.ts +0 -31
- package/dist/flow-secrets.d.ts +0 -13
- package/dist/flow-send.d.ts +0 -54
- package/dist/flow-share.d.ts +0 -78
- package/dist/flow-sort.d.ts +0 -63
- package/dist/flow-starters-ui.d.ts +0 -15
- package/dist/flow-starters.d.ts +0 -63
- package/dist/flow-steps.d.ts +0 -52
- package/dist/flow-triggers.d.ts +0 -303
- package/dist/flow-unattended-words.d.ts +0 -48
- package/dist/flow-unattended.d.ts +0 -259
- package/dist/flows-cli.d.ts +0 -358
- package/dist/flows-ui.d.ts +0 -70
- package/dist/flows.d.ts +0 -136
- package/dist/folder-gate.d.ts +0 -32
- package/dist/folder-look.d.ts +0 -110
- package/dist/follow-through-brief.d.ts +0 -12
- package/dist/follow-through-cli.d.ts +0 -23
- package/dist/fonts.d.ts +0 -19
- package/dist/gaps.d.ts +0 -35
- package/dist/gate-failure.d.ts +0 -40
- package/dist/git-floor.d.ts +0 -16
- package/dist/git-incident.d.ts +0 -65
- package/dist/git-views.d.ts +0 -20
- package/dist/git.d.ts +0 -54
- package/dist/github-import.d.ts +0 -62
- package/dist/github-jobs.d.ts +0 -25
- package/dist/google-mail.d.ts +0 -59
- package/dist/grant.d.ts +0 -136
- package/dist/graph.d.ts +0 -164
- package/dist/guides.d.ts +0 -22
- package/dist/handover-note.d.ts +0 -33
- package/dist/health-cli.d.ts +0 -3
- package/dist/home-groups.d.ts +0 -39
- package/dist/html.d.ts +0 -85
- package/dist/install-method.d.ts +0 -17
- package/dist/integrations-ui.d.ts +0 -17
- package/dist/integrations.d.ts +0 -138
- package/dist/invoke.d.ts +0 -228
- package/dist/is-record.d.ts +0 -2
- package/dist/issues.d.ts +0 -41
- package/dist/jsonl-discriminants.d.ts +0 -11
- package/dist/keymap.d.ts +0 -41
- package/dist/keys.d.ts +0 -108
- package/dist/kits-ui.d.ts +0 -16
- package/dist/kits.d.ts +0 -88
- package/dist/knowledge-cli.d.ts +0 -132
- package/dist/knowledge-ui.d.ts +0 -45
- package/dist/landed-cleanup.d.ts +0 -175
- package/dist/laptop-background.d.ts +0 -187
- package/dist/laptop-service.d.ts +0 -111
- package/dist/latency-timeline.d.ts +0 -46
- package/dist/lead-about.d.ts +0 -35
- package/dist/lead-answer-eval.d.ts +0 -93
- package/dist/lead-capabilities.d.ts +0 -57
- package/dist/lead-cli-live.d.ts +0 -56
- package/dist/lead-cli.d.ts +0 -58
- package/dist/lead-commitments.d.ts +0 -84
- package/dist/lead-context.d.ts +0 -45
- package/dist/lead-contract.d.ts +0 -10
- package/dist/lead-doors.d.ts +0 -122
- package/dist/lead-follow.d.ts +0 -26
- package/dist/lead-identity.d.ts +0 -23
- package/dist/lead-latency-schema.d.ts +0 -24
- package/dist/lead-people.d.ts +0 -55
- package/dist/lead-progress.d.ts +0 -67
- package/dist/lead-queue-runtime.d.ts +0 -46
- package/dist/lead-queue.d.ts +0 -104
- package/dist/lead-route.d.ts +0 -56
- package/dist/lead-status.d.ts +0 -116
- package/dist/lead-sweep.d.ts +0 -67
- package/dist/lead-tools.d.ts +0 -167
- package/dist/lead-voice.d.ts +0 -85
- package/dist/lead.d.ts +0 -142
- package/dist/learning-child.d.ts +0 -1
- package/dist/learning-look.d.ts +0 -25
- package/dist/ledger-chain.d.ts +0 -46
- package/dist/ledger-csv.d.ts +0 -4
- package/dist/ledger-view.d.ts +0 -27
- package/dist/lesson-notes.d.ts +0 -81
- package/dist/limits-ui.d.ts +0 -34
- package/dist/link.d.ts +0 -72
- package/dist/live-backup.d.ts +0 -39
- package/dist/live-bus.d.ts +0 -141
- package/dist/live-children-read.d.ts +0 -52
- package/dist/live-children.d.ts +0 -73
- package/dist/live-detail.d.ts +0 -27
- package/dist/live-input.d.ts +0 -68
- package/dist/live-main-read.d.ts +0 -19
- package/dist/live-notes.d.ts +0 -20
- package/dist/live-open.d.ts +0 -28
- package/dist/live-records.d.ts +0 -149
- package/dist/live-reply.d.ts +0 -83
- package/dist/live-terminal.d.ts +0 -273
- package/dist/live.d.ts +0 -152
- package/dist/local-owner.d.ts +0 -124
- package/dist/log.d.ts +0 -7
- package/dist/login-secrets.d.ts +0 -60
- package/dist/machine-check.d.ts +0 -16
- package/dist/machine-identity.d.ts +0 -75
- package/dist/mailbox.d.ts +0 -57
- package/dist/maintenance.d.ts +0 -13
- package/dist/mcp-connect.d.ts +0 -181
- package/dist/mcp-core.d.ts +0 -110
- package/dist/mcp-http.d.ts +0 -32
- package/dist/mcp-oauth.d.ts +0 -92
- package/dist/mcp-person.d.ts +0 -22
- package/dist/mcp.d.ts +0 -20
- package/dist/memory-cli.d.ts +0 -768
- package/dist/memory-pass.d.ts +0 -151
- package/dist/memory-tidy.d.ts +0 -181
- package/dist/memory-use.d.ts +0 -35
- package/dist/merge-checklist.d.ts +0 -55
- package/dist/metrics.d.ts +0 -6
- package/dist/mobile-viewport.d.ts +0 -7
- package/dist/model-catalog.d.ts +0 -123
- package/dist/model-choices.d.ts +0 -235
- package/dist/model-names.d.ts +0 -6
- package/dist/models-cli.d.ts +0 -307
- package/dist/models-ui.d.ts +0 -161
- package/dist/modes.d.ts +0 -99
- package/dist/monitoring-settings.d.ts +0 -44
- package/dist/monitoring-ui.d.ts +0 -23
- package/dist/monitoring.d.ts +0 -34
- package/dist/names.d.ts +0 -67
- package/dist/needs-you.d.ts +0 -164
- package/dist/never-index.d.ts +0 -3
- package/dist/nightly-check.d.ts +0 -107
- package/dist/nightly-github.d.ts +0 -318
- package/dist/notification-delivery.d.ts +0 -19
- package/dist/notification-rows.d.ts +0 -30
- package/dist/oauth-run-token.d.ts +0 -51
- package/dist/observations.d.ts +0 -36
- package/dist/oidc.d.ts +0 -71
- package/dist/onboard.d.ts +0 -108
- package/dist/one-step-chat-schema.d.ts +0 -22
- package/dist/openrouter-models.d.ts +0 -34
- package/dist/operate-remote-arguments.d.ts +0 -36
- package/dist/operate-remote.d.ts +0 -98
- package/dist/operate.d.ts +0 -401
- package/dist/orphan-sweep.d.ts +0 -65
- package/dist/page-work-contract.d.ts +0 -21
- package/dist/password-bearer.d.ts +0 -25
- package/dist/passwordless.d.ts +0 -23
- package/dist/peek-cli.d.ts +0 -112
- package/dist/peek.d.ts +0 -110
- package/dist/people-audit-ui.d.ts +0 -16
- package/dist/person-proof.d.ts +0 -2
- package/dist/phase-routing.d.ts +0 -401
- package/dist/plain-schema.d.ts +0 -23
- package/dist/plain-words.d.ts +0 -20
- package/dist/plan-auto.d.ts +0 -25
- package/dist/plan-login.d.ts +0 -14
- package/dist/plan.d.ts +0 -188
- package/dist/plane-review.d.ts +0 -54
- package/dist/planner-source.d.ts +0 -225
- package/dist/planner.d.ts +0 -76
- package/dist/policy-ui.d.ts +0 -22
- package/dist/policy.d.ts +0 -92
- package/dist/prepared-evidence.d.ts +0 -17
- package/dist/principal.d.ts +0 -42
- package/dist/probe.d.ts +0 -46
- package/dist/process-custody.d.ts +0 -17
- package/dist/process-liveness.d.ts +0 -13
- package/dist/process-tree.d.ts +0 -39
- package/dist/project-access.d.ts +0 -17
- package/dist/project-activity.d.ts +0 -20
- package/dist/project-admission.d.ts +0 -105
- package/dist/project-cli.d.ts +0 -19
- package/dist/project-concurrency.d.ts +0 -62
- package/dist/project-delete-ui.d.ts +0 -96
- package/dist/project-delete.d.ts +0 -59
- package/dist/project-demo.d.ts +0 -12
- package/dist/project-file.d.ts +0 -3
- package/dist/project-identity.d.ts +0 -52
- package/dist/project-knowledge.d.ts +0 -124
- package/dist/project-learning.d.ts +0 -120
- package/dist/project-memory.d.ts +0 -70
- package/dist/project-outcomes.d.ts +0 -119
- package/dist/project-sandbox.d.ts +0 -59
- package/dist/project-skills.d.ts +0 -139
- package/dist/project-tools.d.ts +0 -318
- package/dist/project.d.ts +0 -65
- package/dist/prompt.d.ts +0 -33
- package/dist/proof.d.ts +0 -457
- package/dist/proposal.d.ts +0 -70
- package/dist/protected-storage-look.d.ts +0 -1
- package/dist/protected-storage.d.ts +0 -98
- package/dist/provider-auth.d.ts +0 -143
- package/dist/provider-capture.d.ts +0 -34
- package/dist/provider-connection.d.ts +0 -23
- package/dist/provider-home.d.ts +0 -22
- package/dist/provider-limits.d.ts +0 -37
- package/dist/provider.d.ts +0 -369
- package/dist/public-access.d.ts +0 -52
- package/dist/public-check.d.ts +0 -37
- package/dist/publish.d.ts +0 -146
- package/dist/pull-request-flow.d.ts +0 -189
- package/dist/pull-request-schema.d.ts +0 -5
- package/dist/pull-request-ui.d.ts +0 -25
- package/dist/pulls.d.ts +0 -121
- package/dist/push.d.ts +0 -120
- package/dist/quality.d.ts +0 -8
- package/dist/quick-start.d.ts +0 -26
- package/dist/read-executor-worker.d.ts +0 -1
- package/dist/read-executor.d.ts +0 -66
- package/dist/read-only-request.d.ts +0 -4
- package/dist/recipe-ui.d.ts +0 -21
- package/dist/recipes.d.ts +0 -56
- package/dist/release-adapters.d.ts +0 -205
- package/dist/release-approval.d.ts +0 -180
- package/dist/release-authority.d.ts +0 -173
- package/dist/release-auto.d.ts +0 -184
- package/dist/release-card.d.ts +0 -156
- package/dist/release-carry.d.ts +0 -261
- package/dist/release-ci-hold.d.ts +0 -41
- package/dist/release-cli.d.ts +0 -34
- package/dist/release-coverage.d.ts +0 -16
- package/dist/release-gate.d.ts +0 -84
- package/dist/release-git.d.ts +0 -43
- package/dist/release-links.d.ts +0 -29
- package/dist/release-net.d.ts +0 -90
- package/dist/release-next.d.ts +0 -48
- package/dist/release-recheck.d.ts +0 -146
- package/dist/release-refusal.d.ts +0 -32
- package/dist/release-view.d.ts +0 -37
- package/dist/release.d.ts +0 -806
- package/dist/releases.d.ts +0 -94
- package/dist/remote-audit.d.ts +0 -79
- package/dist/remote-command.d.ts +0 -45
- package/dist/remote-destination.d.ts +0 -36
- package/dist/remote-exec.d.ts +0 -38
- package/dist/remote-main.d.ts +0 -111
- package/dist/remote-run.d.ts +0 -20
- package/dist/remote.d.ts +0 -67
- package/dist/render.d.ts +0 -64
- package/dist/reply-shape.d.ts +0 -106
- package/dist/reply-voice.d.ts +0 -23
- package/dist/report-summary.d.ts +0 -22
- package/dist/reported-usage.d.ts +0 -69
- package/dist/repos.d.ts +0 -67
- package/dist/repository-context-ui.d.ts +0 -3
- package/dist/repository-context.d.ts +0 -66
- package/dist/request-budget-ui.d.ts +0 -14
- package/dist/request-budget.d.ts +0 -127
- package/dist/restart-certification.d.ts +0 -133
- package/dist/result-actions.d.ts +0 -36
- package/dist/result-acts.d.ts +0 -112
- package/dist/result-completion.d.ts +0 -35
- package/dist/result-evidence-readers.d.ts +0 -42
- package/dist/result-follow-ups.d.ts +0 -118
- package/dist/result-review.d.ts +0 -220
- package/dist/result-shots.d.ts +0 -59
- package/dist/retention-ui.d.ts +0 -21
- package/dist/retention.d.ts +0 -77
- package/dist/review-context.d.ts +0 -245
- package/dist/review-evidence.d.ts +0 -33
- package/dist/review-switch.d.ts +0 -36
- package/dist/reviewer.d.ts +0 -99
- package/dist/route-change-check.d.ts +0 -4
- package/dist/route-change.d.ts +0 -22
- package/dist/route-hooks.d.ts +0 -54
- package/dist/route-results.d.ts +0 -75
- package/dist/route-rules.d.ts +0 -324
- package/dist/route-savings.d.ts +0 -136
- package/dist/route-store.d.ts +0 -300
- package/dist/run-closeout.d.ts +0 -89
- package/dist/run-efficiency.d.ts +0 -74
- package/dist/run-ending.d.ts +0 -21
- package/dist/runner-process.d.ts +0 -76
- package/dist/runner.d.ts +0 -324
- package/dist/sample-project.d.ts +0 -31
- package/dist/sandbox-launch.d.ts +0 -1
- package/dist/sandbox-runtime.d.ts +0 -128
- package/dist/scan.d.ts +0 -32
- package/dist/scope.d.ts +0 -1067
- package/dist/scout-browser-lock.d.ts +0 -69
- package/dist/scout-browser.d.ts +0 -107
- package/dist/scout-net.d.ts +0 -25
- package/dist/scout-report.d.ts +0 -23
- package/dist/scout.d.ts +0 -142
- package/dist/secret-mint.d.ts +0 -1
- package/dist/serve.d.ts +0 -11
- package/dist/server/agents-computers.d.ts +0 -9
- package/dist/server/agents-live-filed.d.ts +0 -17
- package/dist/server/agents-live-lead.d.ts +0 -47
- package/dist/server/agents-live-room.d.ts +0 -23
- package/dist/server/chat.d.ts +0 -39
- package/dist/server/chrome.d.ts +0 -328
- package/dist/server/edge-refusal.d.ts +0 -7
- package/dist/server/flows.d.ts +0 -8
- package/dist/server/guards.d.ts +0 -80
- package/dist/server/handler-context.d.ts +0 -22
- package/dist/server/handler-registry.d.ts +0 -23
- package/dist/server/home-asks.d.ts +0 -45
- package/dist/server/home.d.ts +0 -65
- package/dist/server/http.d.ts +0 -337
- package/dist/server/in-place.d.ts +0 -15
- package/dist/server/kit-standalone.d.ts +0 -22
- package/dist/server/kit.d.ts +0 -452
- package/dist/server/last-checks.d.ts +0 -17
- package/dist/server/live.d.ts +0 -74
- package/dist/server/merge-ready-view.d.ts +0 -10
- package/dist/server/mutation-key.d.ts +0 -70
- package/dist/server/pages-assets.d.ts +0 -11
- package/dist/server/pages.d.ts +0 -8
- package/dist/server/people-tokens.d.ts +0 -18
- package/dist/server/remote-hooks.d.ts +0 -29
- package/dist/server/remote.d.ts +0 -59
- package/dist/server/render-chat.d.ts +0 -439
- package/dist/server/render-code-map.d.ts +0 -30
- package/dist/server/render-flaky.d.ts +0 -20
- package/dist/server/render-follow-through.d.ts +0 -11
- package/dist/server/render-history.d.ts +0 -51
- package/dist/server/render-new-task.d.ts +0 -54
- package/dist/server/render-pages.d.ts +0 -236
- package/dist/server/render-people.d.ts +0 -102
- package/dist/server/render-projects.d.ts +0 -104
- package/dist/server/render-release.d.ts +0 -19
- package/dist/server/render-results.d.ts +0 -754
- package/dist/server/render-settings.d.ts +0 -93
- package/dist/server/render-tasks.d.ts +0 -774
- package/dist/server/request-context.d.ts +0 -78
- package/dist/server/retired-routes.d.ts +0 -17
- package/dist/server/route-policy.d.ts +0 -18
- package/dist/server/route-table.d.ts +0 -114
- package/dist/server/runtime.d.ts +0 -342
- package/dist/server/session.d.ts +0 -192
- package/dist/server/settings.d.ts +0 -76
- package/dist/server/signup-gate.d.ts +0 -9
- package/dist/server/sweeps.d.ts +0 -4
- package/dist/server/task-views.d.ts +0 -98
- package/dist/server/tasks.d.ts +0 -83
- package/dist/server/terminals.d.ts +0 -31
- package/dist/server/welcome.d.ts +0 -28
- package/dist/server-telemetry.d.ts +0 -87
- package/dist/settings-groups-ui.d.ts +0 -286
- package/dist/settings-kit-script.d.ts +0 -21
- package/dist/settings-kit.d.ts +0 -173
- package/dist/settings-proofs.d.ts +0 -64
- package/dist/setup-guide.d.ts +0 -39
- package/dist/shared-deps.d.ts +0 -115
- package/dist/sign-in-guard.d.ts +0 -70
- package/dist/skills-ui.d.ts +0 -12
- package/dist/skills.d.ts +0 -99
- package/dist/slack-api.d.ts +0 -59
- package/dist/slack-chat.d.ts +0 -37
- package/dist/slack-settings.d.ts +0 -4
- package/dist/slack-socket.d.ts +0 -12
- package/dist/slack.d.ts +0 -6
- package/dist/sleep.d.ts +0 -2
- package/dist/source-key.d.ts +0 -2
- package/dist/spend-report.d.ts +0 -87
- package/dist/spend-ui.d.ts +0 -80
- package/dist/spend.d.ts +0 -142
- package/dist/sqlite-runtime.d.ts +0 -3
- package/dist/sqlite-telemetry.d.ts +0 -9
- package/dist/sso-settings.d.ts +0 -33
- package/dist/sso-ui.d.ts +0 -26
- package/dist/staged-runtimes.d.ts +0 -54
- package/dist/steer-capabilities.d.ts +0 -32
- package/dist/steer-controls.d.ts +0 -14
- package/dist/steer-live.d.ts +0 -19
- package/dist/steer-mailbox.d.ts +0 -46
- package/dist/steer-status.d.ts +0 -25
- package/dist/stop-proof.d.ts +0 -67
- package/dist/storage-sweep-child.d.ts +0 -1
- package/dist/storage-sweep-process.d.ts +0 -55
- package/dist/storage-sweep-schedule.d.ts +0 -30
- package/dist/storage-sweep.d.ts +0 -77
- package/dist/storage-ui.d.ts +0 -23
- package/dist/storage.d.ts +0 -68
- package/dist/store-baseline.d.ts +0 -19
- package/dist/store.d.ts +0 -8613
- package/dist/stream-scope.d.ts +0 -18
- package/dist/structured-output.d.ts +0 -57
- package/dist/style-asset.d.ts +0 -7
- package/dist/subagent-admin.d.ts +0 -53
- package/dist/subagent-desk.d.ts +0 -59
- package/dist/subagent-memory.d.ts +0 -65
- package/dist/subagent-question.d.ts +0 -59
- package/dist/subagent-tools.d.ts +0 -125
- package/dist/subagent-week.d.ts +0 -68
- package/dist/subagent-work.d.ts +0 -76
- package/dist/subagents-ui.d.ts +0 -22
- package/dist/subagents.d.ts +0 -146
- package/dist/subscription-chat.d.ts +0 -54
- package/dist/summary.d.ts +0 -33
- package/dist/surface.d.ts +0 -49
- package/dist/sweep-gate.d.ts +0 -10
- package/dist/sweep-quarantine.d.ts +0 -29
- package/dist/sync.d.ts +0 -94
- package/dist/tailnet.d.ts +0 -11
- package/dist/tamper-scan.d.ts +0 -4
- package/dist/task-activity.d.ts +0 -27
- package/dist/task-aliases.d.ts +0 -5
- package/dist/task-archive.d.ts +0 -13
- package/dist/task-base.d.ts +0 -39
- package/dist/task-composer.d.ts +0 -14
- package/dist/task-control.d.ts +0 -159
- package/dist/task-live.d.ts +0 -8
- package/dist/task-moves.d.ts +0 -90
- package/dist/task-outcome-cli.d.ts +0 -30
- package/dist/task-review-brief.d.ts +0 -69
- package/dist/task-sizing.d.ts +0 -58
- package/dist/task-source.d.ts +0 -77
- package/dist/task-status.d.ts +0 -324
- package/dist/task-text.d.ts +0 -31
- package/dist/team-chat-authorization.d.ts +0 -11
- package/dist/team-contract.d.ts +0 -103
- package/dist/team-http.d.ts +0 -25
- package/dist/team-leads.d.ts +0 -85
- package/dist/team-runtime.d.ts +0 -25
- package/dist/team-ui.d.ts +0 -4
- package/dist/team-updates.d.ts +0 -8
- package/dist/teams-api.d.ts +0 -33
- package/dist/teams-chat.d.ts +0 -36
- package/dist/teams-settings.d.ts +0 -14
- package/dist/teams.d.ts +0 -24
- package/dist/teardown-git.d.ts +0 -164
- package/dist/telegram-flow.d.ts +0 -112
- package/dist/telegram-lead.d.ts +0 -151
- package/dist/telegram-live.d.ts +0 -116
- package/dist/telegram-progress.d.ts +0 -20
- package/dist/telegram-settings.d.ts +0 -9
- package/dist/telegram-status.d.ts +0 -83
- package/dist/telegram-team.d.ts +0 -68
- package/dist/telegram.d.ts +0 -271
- package/dist/templates.d.ts +0 -69
- package/dist/terminal-catalog.d.ts +0 -11
- package/dist/terminal-text.d.ts +0 -11
- package/dist/test-infra.d.ts +0 -34
- package/dist/test-temp.d.ts +0 -40
- package/dist/text-limits.d.ts +0 -297
- package/dist/tidy.d.ts +0 -130
- package/dist/tier-report.d.ts +0 -44
- package/dist/token-notices.d.ts +0 -11
- package/dist/tokens-cli.d.ts +0 -21
- package/dist/tool-broker.d.ts +0 -52
- package/dist/tool-launcher.d.ts +0 -1
- package/dist/tool-secret-store.d.ts +0 -167
- package/dist/toolroll-update-cli.d.ts +0 -15
- package/dist/toolroll-update-ui.d.ts +0 -47
- package/dist/toolroll-update.d.ts +0 -265
- package/dist/tools-ui.d.ts +0 -51
- package/dist/transitions-recipes.d.ts +0 -1
- package/dist/tree-proof.d.ts +0 -34
- package/dist/tui-contract.d.ts +0 -144
- package/dist/tui-source.d.ts +0 -14
- package/dist/typed-start.d.ts +0 -51
- package/dist/unfenced-test-support.d.ts +0 -2
- package/dist/up-processes.d.ts +0 -162
- package/dist/up-role-child.d.ts +0 -1
- package/dist/update-notice.d.ts +0 -5
- package/dist/vanished-retry.d.ts +0 -30
- package/dist/verification-evidence.d.ts +0 -68
- package/dist/version.d.ts +0 -2
- package/dist/wake-hub.d.ts +0 -72
- package/dist/webhook-limits.d.ts +0 -23
- package/dist/webhook-readers.d.ts +0 -56
- package/dist/webhook-signing.d.ts +0 -27
- package/dist/webhooks.d.ts +0 -84
- package/dist/welcome-facts.d.ts +0 -18
- package/dist/when-html.d.ts +0 -40
- package/dist/work-index.d.ts +0 -175
- package/dist/work-summary.d.ts +0 -61
- package/dist/workspace-motion.d.ts +0 -4
- package/dist/workspace-revision.d.ts +0 -48
- package/dist/workspace-ui.d.ts +0 -385
- package/dist/worktree-notices.d.ts +0 -13
- package/dist/worktree.d.ts +0 -365
- package/dist/writes-mode.d.ts +0 -9
- package/dist/youiyoux-intake.d.ts +0 -234
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/** Task pages: approval, agents, plans, controls, decisions and the task body. */
|
|
2
1
|
import { archivedWords } from "../tidy.js";
|
|
3
2
|
import { btn, stepRows } from "./kit.js";
|
|
4
3
|
import { whenUtc } from "../when-html.js";
|
|
@@ -24,7 +23,7 @@ import {} from "../browser-workspace.js";
|
|
|
24
23
|
import { permissionPlainWords } from "../chat-decide.js";
|
|
25
24
|
import { CHAT_TASK_ACTIONS } from "../chat-task-actions.js";
|
|
26
25
|
import {} from "../contracts/console-api.js";
|
|
27
|
-
import {} from "../dispatch.js";
|
|
26
|
+
import { NO_AGENT_TITLE } from "../dispatch.js";
|
|
28
27
|
import {} from "../evidence.js";
|
|
29
28
|
import { taskRoad } from "../first-run.js";
|
|
30
29
|
import { starterForWork } from "../flow-starters.js";
|
|
@@ -72,14 +71,6 @@ export function contractChangeHtml(change) {
|
|
|
72
71
|
}
|
|
73
72
|
}
|
|
74
73
|
}
|
|
75
|
-
/**
|
|
76
|
-
* The contract panel (contract handoff, task 1): whether the drafted plan
|
|
77
|
-
* reproduced the filed goal, exclusions, touches, and rubric exactly, or
|
|
78
|
-
* proposes an amendment — every addition, change, and removal listed, the
|
|
79
|
-
* planner's stated reason beside them, and the plain consequence that
|
|
80
|
-
* approving binds the AMENDED terms. "full" is the task page's card;
|
|
81
|
-
* "ceremony" is the restatement inside the approval form and /next.
|
|
82
|
-
*/
|
|
83
74
|
export function planContractHtml(view, mode) {
|
|
84
75
|
if (view === null) {
|
|
85
76
|
return mode === "full" ? html `` : html `<p class="meta contract-note">No record compares this plan with your request. Check the plan above against what you asked for before approving.</p>`;
|
|
@@ -94,7 +85,6 @@ export function planContractHtml(view, mode) {
|
|
|
94
85
|
: html `<p class="meta contract-note">Nothing was filed before planning: every part above is the planner's.</p>`;
|
|
95
86
|
}
|
|
96
87
|
if (view.revision === true) {
|
|
97
|
-
// A send-back: the terms were copied from the previous version, and the planner updated them with the notes.
|
|
98
88
|
if (view.changes.length === 0) {
|
|
99
89
|
return html `<div class="contract-panel contract-preserved"><p class="approval-label">updated plan</p><p><strong>Same plan as before</strong> <span class="meta">your notes fit the previous plan · <a href="/r/${view.run}">Planner's record</a></span></p>${stale}</div>`;
|
|
100
90
|
}
|
|
@@ -121,29 +111,19 @@ export function planContractHtml(view, mode) {
|
|
|
121
111
|
html `</div>`,
|
|
122
112
|
]);
|
|
123
113
|
}
|
|
124
|
-
/** The exact path limits, one per line (UI polish 2026-09-13): a long
|
|
125
|
-
* comma run was the least readable term on a phone. Every path, verbatim. */
|
|
126
114
|
export function approvalPathsHtml(touches) {
|
|
127
115
|
if (touches.length === 0)
|
|
128
116
|
return html `<p>anything</p>`;
|
|
129
117
|
return html `<ul class="approval-paths">${touches.map(one => html `<li><span class="mono">${one}</span></li>`)}</ul>`;
|
|
130
118
|
}
|
|
131
|
-
/** The rubric, restated above the seal (v39) — the same claim the digest
|
|
132
|
-
* line already makes ("approval binds to this exact wording") extended to
|
|
133
|
-
* the acceptance terms: an id in Geist Mono (a machine fact the proof must
|
|
134
|
-
* answer by), a statement in Geist, the signed evidence kinds after
|
|
135
|
-
* it. `how` never renders here — it is advisory, never signed. Empty
|
|
136
|
-
* renders nothing: a grandfathered scope's ceremony is unchanged. */
|
|
137
119
|
export function acceptanceCeremonyHtml(criteria) {
|
|
138
120
|
if (criteria.length === 0)
|
|
139
121
|
return html ``;
|
|
140
122
|
return html `<p class="meta">Acceptance</p><ul class="recap acceptance-rubric">${criteria.map(c => html `<li><code>${c.id}</code> ${c.statement} <span class="meta">[requires: ${c.evidence.join(", ")}]</span></li>`)}</ul>`;
|
|
141
123
|
}
|
|
142
|
-
/** "claude" + "opus" → "Claude Opus"; "claude-opus-5-5" → "Claude Opus 5.5"; anything else keeps its exact id. */
|
|
143
124
|
export function agentNameWords(provider, model) {
|
|
144
125
|
return agentModelName(provider, model);
|
|
145
126
|
}
|
|
146
|
-
/** The permission a sealed profile grants, in two or three words. */
|
|
147
127
|
export function permissionWordsOf(profile) {
|
|
148
128
|
if (profile === null || profile === undefined)
|
|
149
129
|
return null;
|
|
@@ -154,9 +134,6 @@ export function permissionWordsOf(profile) {
|
|
|
154
134
|
: isAcpProfile(profile) ? "Full access"
|
|
155
135
|
: profile.sandboxMode === "danger-full-access" ? "Full access" : "Workspace sandbox";
|
|
156
136
|
}
|
|
157
|
-
/** One plain sentence for a revision (approval critique, Oct 2):
|
|
158
|
-
* "Fixes what build #9 missed: <criterion>." The notes, paths and lineage
|
|
159
|
-
* stay in the Details fold. */
|
|
160
137
|
export function revisionSentence(revision, acceptance) {
|
|
161
138
|
const build = `build #${revision.sourceRun}`;
|
|
162
139
|
if (revision.kind === "ci-repair")
|
|
@@ -171,8 +148,6 @@ export function revisionSentence(revision, acceptance) {
|
|
|
171
148
|
const notes = revision.comments.map(one => clean(one.note)).filter(one => one !== "");
|
|
172
149
|
return notes.length === 0 ? `Sends back ${build}.` : `Fixes what ${build} missed: ${notes.join("; ")}.`;
|
|
173
150
|
}
|
|
174
|
-
/** A planner's amendment, said plainly and kept in view: approving binds
|
|
175
|
-
* the amended terms, so this is never folded away. */
|
|
176
151
|
export function approvalAmendmentHtml(view) {
|
|
177
152
|
if (view === null || view === undefined || "problem" in view || !view.filed && view.revision !== true || view.changes.length === 0)
|
|
178
153
|
return html ``;
|
|
@@ -193,27 +168,14 @@ export function approvalAmendmentHtml(view) {
|
|
|
193
168
|
html `</div>`,
|
|
194
169
|
]);
|
|
195
170
|
}
|
|
196
|
-
/** Whether a fragment renders nothing. */
|
|
197
171
|
const isEmptyHtml = (fragment) => htmlString(fragment) === "";
|
|
198
|
-
/** A fragment's markup for a JSON field of the browser workspace ("" when absent). */
|
|
199
172
|
const fragmentString = (fragment) => fragment === "" ? "" : htmlString(fragment);
|
|
200
|
-
/**
|
|
201
|
-
* The approval sheet (approval critique, Oct 2): the plan open, in plain
|
|
202
|
-
* rows — Goal, Changes, Won't touch, Done when — one line of who builds,
|
|
203
|
-
* one Approve & start beside the password, and every remaining signed
|
|
204
|
-
* term (lineage, routing, runtime limits, the seal) in one Details fold.
|
|
205
|
-
* Presentation only: the same hidden fields, nonce, digest and password
|
|
206
|
-
* post to the same route, and the task page and chat card share it.
|
|
207
|
-
*/
|
|
208
|
-
/** v126: a task's origin as a line of words (the identity line). */
|
|
209
173
|
function originWords(origin) {
|
|
210
174
|
const flow = origin.flow === null ? null : origin.flow === "hidden" ? "from a flow" : origin.flow === "removed" ? "from a flow (removed)" : `from flow “${origin.flow.name}”`;
|
|
211
175
|
const source = origin.source === null ? null : `${origin.source.label} (${origin.source.proved})`;
|
|
212
176
|
const request = origin.request == null ? null : `from ${requestName(origin.request)}`;
|
|
213
177
|
return [flow, source, request].filter(one => one !== null).join(" · ");
|
|
214
178
|
}
|
|
215
|
-
/** v126: a task's origin as a fact: the flow, linked for those who may open it, and the outside event, linked to where
|
|
216
|
-
* it lives, with that link's host always shown. */
|
|
217
179
|
function originParts(origin) {
|
|
218
180
|
const parts = [];
|
|
219
181
|
if (origin.flow !== null)
|
|
@@ -221,7 +183,6 @@ function originParts(origin) {
|
|
|
221
183
|
if (origin.source !== null) {
|
|
222
184
|
if (parts.length > 0)
|
|
223
185
|
parts.push(" · ");
|
|
224
|
-
// The link shows where it goes (host and path), beside what it is.
|
|
225
186
|
parts.push(origin.source.label, ` (${origin.source.proved})`);
|
|
226
187
|
if (origin.source.url !== null)
|
|
227
188
|
parts.push(" · ", { label: linkWords(origin.source.url), href: origin.source.url });
|
|
@@ -234,7 +195,6 @@ function originParts(origin) {
|
|
|
234
195
|
}
|
|
235
196
|
return parts;
|
|
236
197
|
}
|
|
237
|
-
/** The approval sheet: one form that restates every term it signs, the password, and Approve & start. */
|
|
238
198
|
export function approvalSheetHtml(input) {
|
|
239
199
|
const parts = approvalSheetParts(input);
|
|
240
200
|
return joinHtml([
|
|
@@ -250,7 +210,6 @@ export function approvalSheetHtml(input) {
|
|
|
250
210
|
: html `<p class="approval-password-note" id="${parts.passwordNote}" data-approval-fresh>Your password from ${whenTime(input.freshSince)} is remembered on this computer — leave this blank to approve with it, or type it again.</p>`,
|
|
251
211
|
html `<button type="submit" data-primary-action>${parts.submit}</button></div>`,
|
|
252
212
|
html `<p class="approval-after">${parts.after}</p>`,
|
|
253
|
-
// Approve, Request changes, Reject (docs/plans/plain-toolroll.md P1.3): Reject is the task's own Cancel, one tap away.
|
|
254
213
|
html `<div class="approval-secondary">${parts.editor ?? html `<a class="approval-link" href="${input.editHref}">Request changes</a>`}<a class="approval-link" href="${input.surface === "task" ? "#cancel-task" : input.notNowHref}">${input.surface === "task" ? "Reject" : "Not now"}</a></div>`,
|
|
255
214
|
parts.details,
|
|
256
215
|
]), {
|
|
@@ -261,14 +220,8 @@ export function approvalSheetHtml(input) {
|
|
|
261
220
|
parts.editorForm,
|
|
262
221
|
]);
|
|
263
222
|
}
|
|
264
|
-
/** The approval sheet's parts: what it says first, the signed rows, the in-place editor and its own form, the
|
|
265
|
-
* details fold, and the words the act and its outcome use. The task page (src/design/KIT.md) shows the rows in its
|
|
266
|
-
* Plan tab and the act in its approval box; the chat and /next keep the one sheet. */
|
|
267
223
|
export function approvalSheetParts(input) {
|
|
268
224
|
const { scope, route } = input;
|
|
269
|
-
// A machine-drafted repair appends its brief to the signed goal; the row
|
|
270
|
-
// shows the goal and one sentence says what the repair fixes. The whole
|
|
271
|
-
// signed goal stays in Details.
|
|
272
225
|
const repairText = / — (repair exactly the unmet criteria named below; a comment cannot widen the scope\. Unmet: ([^.]+)\.|Collect only the missing observations for ([^.]+)\. .*|Diagnose the saved failed project check and repair within the original scope\. .*)$/s.exec(scope.goal);
|
|
273
226
|
const goalShown = repairText === null ? scope.goal : scope.goal.slice(0, repairText.index);
|
|
274
227
|
const statementsOf = (ids) => ids.split(",").map(id => id.trim()).map(id => scope.acceptance.find(one => one.id === id)?.statement ?? id).map(one => one.replace(/[.\s]+$/, "")).join("; ");
|
|
@@ -293,7 +246,6 @@ export function approvalSheetParts(input) {
|
|
|
293
246
|
const doneWhen = scope.acceptance.length === 0
|
|
294
247
|
? html `<p>You decide when you review the result.</p>`
|
|
295
248
|
: html `<ul class="approval-done">${scope.acceptance.map(one => html `<li>${one.statement}</li>`)}</ul>`;
|
|
296
|
-
// Who builds, in one line: the builder and planner by name, the cap, and full access when granted.
|
|
297
249
|
const legs = route?.projection?.legs ?? [];
|
|
298
250
|
const legOf = (phase) => legs.find(one => one.phase === phase);
|
|
299
251
|
const who = [];
|
|
@@ -305,27 +257,20 @@ export function approvalSheetParts(input) {
|
|
|
305
257
|
else if (scope.profile != null)
|
|
306
258
|
who.push(`Builder ${agentNameWords(scope.profile.provider, scope.profile.model)}`);
|
|
307
259
|
const planner = legOf("plan");
|
|
308
|
-
// A small change makes no plan: no planner is named (a person's chosen planner still is).
|
|
309
260
|
const sized = route?.projection?.size ?? null;
|
|
310
261
|
const unplanned = route?.projection != null && makesNoPlan(sized, route.projection.risk) && planner?.chosen === "recommended";
|
|
311
262
|
if (planner !== undefined && !unplanned)
|
|
312
263
|
who.push(`Planner ${agentNameWords(planner.provider, planner.model)}`);
|
|
313
|
-
// What the yes allows, in plain words, right above it: the agent's
|
|
314
|
-
// permissions, the per-attempt limit, and an earlier version still running.
|
|
315
264
|
const allowing = [];
|
|
316
|
-
// The clauses of `allowing` the plan sheet says under Worth knowing (a paid fallback, an earlier version still
|
|
317
|
-
// running): warnings, said first, never folded.
|
|
318
265
|
const warnings = [];
|
|
319
266
|
const allowed = permissionPlainWords(scope.profile);
|
|
320
267
|
if (allowed !== null)
|
|
321
268
|
allowing.push(allowed);
|
|
322
269
|
allowing.push(scope.budgetMicrousd === null ? "no attempt limit" : `up to ${money(scope.budgetMicrousd)} per attempt`);
|
|
323
|
-
// Fallback agents are terms: who takes over when an agent runs out, with any that spend money said before the yes.
|
|
324
270
|
const chain = chainTermsLines(scope);
|
|
325
271
|
const fallbacks = liveChainFromJson(scope.proposedChainJson ?? null)?.slice(1) ?? [];
|
|
326
272
|
if (fallbacks.length > 0) {
|
|
327
273
|
const paid = fallbacks.filter(one => one.authMode === "api-key" || SUBSCRIPTION_CAPABLE[one.profile.provider] !== true);
|
|
328
|
-
// Each agent named once, the paid one said where it stands in the order.
|
|
329
274
|
const clause = `if it runs out of its plan, the work moves to ${fallbacks.map(one => `${agentNameWords(one.profile.provider, one.profile.model)}${paid.includes(one) ? " on an API key, which spends money" : ""}`).join(", then ")}`;
|
|
330
275
|
allowing.push(clause);
|
|
331
276
|
if (paid.length > 0)
|
|
@@ -348,7 +293,6 @@ export function approvalSheetParts(input) {
|
|
|
348
293
|
? html `An agent investigates without changing the repository. You'll hear when its report is ready.`
|
|
349
294
|
: html `An agent starts in its own branch. You'll hear when it's ready to review.`;
|
|
350
295
|
const submit = rebuild !== null ? html `Approve and retry` : html `Approve`;
|
|
351
|
-
// Everything else the digest binds, one tap away.
|
|
352
296
|
const detail = (title, body, attrs = html ``) => isEmptyHtml(body) ? html `` : html `<section class="approval-detail"${attrs}><h3>${title}</h3>${body}</section>`;
|
|
353
297
|
const revisionBody = input.revision === null ? html `` : joinHtml([
|
|
354
298
|
html `<div class="revision-card" data-revision-feedback>`,
|
|
@@ -384,7 +328,6 @@ export function approvalSheetParts(input) {
|
|
|
384
328
|
scope.budgetMicrousd === null ? "" : html `<p class="meta">Each build attempt has a ${money(scope.budgetMicrousd)} agent-reported usage cap. On a subscription this limits work; it is not an API charge.</p>`,
|
|
385
329
|
]);
|
|
386
330
|
const details = joinHtml([
|
|
387
|
-
// On the task page the details are open: the page without script shows every term before the yes. Chat keeps the fold.
|
|
388
331
|
html `<details class="approval-details"${input.surface === "task" ? html ` open` : ""}><summary>Plan details</summary>`,
|
|
389
332
|
revisionDetail,
|
|
390
333
|
repairText === null ? "" : detail("Full goal", html `<p>${scope.goal}</p>`),
|
|
@@ -397,17 +340,10 @@ export function approvalSheetParts(input) {
|
|
|
397
340
|
html `</details>`,
|
|
398
341
|
]);
|
|
399
342
|
const passwordNote = input.surface === "task" ? "approval-password-note" : "chat-approval-password-note";
|
|
400
|
-
// Edit plan, in place (task page): the rows become fields and save
|
|
401
|
-
// through the scope's own route. The fields belong to a form after this
|
|
402
|
-
// one (forms never nest), so Approve never carries them.
|
|
403
343
|
const edit = input.edit;
|
|
404
344
|
const draft = edit?.draft ?? null;
|
|
405
345
|
const editForm = "plan-editor-form";
|
|
406
|
-
// Each field opens tall enough for what it holds (up to ten lines).
|
|
407
346
|
const field = (name, value, rows, label, hint = "") => html `<label class="approval-field"><span class="approval-field-label">${label}</span>${hint === "" ? "" : html `<span class="approval-field-hint">${hint}</span>`}<textarea name="${name}" rows="${Math.min(10, Math.max(rows, value.split("\n").reduce((sum, line) => sum + Math.max(1, Math.ceil(line.length / 80)), 0)))}" form="${editForm}">${value}</textarea></label>`;
|
|
408
|
-
// Done when, one line per requirement in the signed order; the server
|
|
409
|
-
// matches them back by position (the digest guard keeps that order).
|
|
410
|
-
// Each requirement says how we'll know it is met (#19): a picker over the kinds a plan names, read back by position.
|
|
411
347
|
const howPicker = (name, chosen, label, planned) => html `<select name="${name}" aria-label="${label}" form="${editForm}" class="approval-how">${planned !== null && planned.length > 1 ? html `<option value="keep"${chosen === "keep" ? html ` selected` : ""}>${`As planned: ${planned.map(kind => EVIDENCE_PLAIN[kind] ?? kind).join(", ")}`}</option>` : ""}${HOW_WE_KNOW.map(kind => html `<option value="${kind}"${chosen === kind ? html ` selected` : ""}>${HOW_WE_KNOW_WORDS[kind]}</option>`)}</select>`;
|
|
412
348
|
const requirement = (name, value, label, how, placeholder = "") => html `<li><input type="text" name="${name}" value="${value}" aria-label="${label}"${placeholder === "" ? "" : html ` placeholder="${placeholder}"`} form="${editForm}">${how}</li>`;
|
|
413
349
|
const requirements = draft?.getAll("requirement") ?? scope.acceptance.map(one => one.statement);
|
|
@@ -428,7 +364,6 @@ export function approvalSheetParts(input) {
|
|
|
428
364
|
requirement("requirement-new", added, "Add a requirement", howPicker("requirement-new-how", addedHow, "How we'll know the new requirement is met", null), "Add a requirement"),
|
|
429
365
|
html `</ul></fieldset>`,
|
|
430
366
|
html `<div class="approval-edit-act"><button type="submit" form="${editForm}">Save plan</button>`,
|
|
431
|
-
// A plan with written steps keeps its own editor for them.
|
|
432
367
|
edit.stepsHref === null ? "" : html `<a class="approval-link" href="${edit.stepsHref}">Edit steps</a>`, html `</div>`,
|
|
433
368
|
html `</div></details>`,
|
|
434
369
|
]);
|
|
@@ -436,15 +371,10 @@ export function approvalSheetParts(input) {
|
|
|
436
371
|
const editorForm = edit === null ? "" : postForm(edit.action, null, {
|
|
437
372
|
attrs: { id: editForm, class: "approval-editor-form" },
|
|
438
373
|
hidden: {
|
|
439
|
-
// A refused save keeps the version its draft was edited from, so a
|
|
440
|
-
// plan that changed meanwhile is never silently overwritten.
|
|
441
374
|
sawDigest: draft?.get("sawDigest") ?? scope.digest,
|
|
442
|
-
// The terms the editor doesn't show ride along unchanged: a repair's
|
|
443
|
-
// brief after its goal (it stays in Details), permissions, checks, cap.
|
|
444
375
|
"goal-brief": repairText === null ? null : repairText[0],
|
|
445
376
|
"permission-mode": keptMode,
|
|
446
377
|
"quality-mode": scope.qualityMode ?? "default",
|
|
447
|
-
// The cap rides in exact millionths ("none" keeps no limit).
|
|
448
378
|
"budget-microusd": scope.budgetMicrousd === null ? "none" : String(scope.budgetMicrousd),
|
|
449
379
|
},
|
|
450
380
|
});
|
|
@@ -455,8 +385,6 @@ export function approvalSheetParts(input) {
|
|
|
455
385
|
input.deliverable === "report" ? html `<p class="approval-note">Read-only: it reports back and changes nothing in the repository.</p>` : "",
|
|
456
386
|
originNote(input.origin) === null ? "" : html `<p class="approval-note" data-approval-origin>${originNote(input.origin)}</p>`,
|
|
457
387
|
]);
|
|
458
|
-
// A release's terms are part of what the yes agrees to (the digest signs them): said whole on every approval
|
|
459
|
-
// surface (the plan sheet, the page without script, chat), before Approve, with nothing folded.
|
|
460
388
|
const releaseBody = scope.releaseTerms == null && scope.releaseCheck == null ? "" : joinHtml([
|
|
461
389
|
scope.releaseTerms == null ? "" : html `<p>${releaseTermsSentence(scope.releaseTerms)}</p>`,
|
|
462
390
|
scope.releaseCheck == null ? "" : html `<p>${releaseCheckSentence(scope.releaseCheck)}</p>`,
|
|
@@ -473,15 +401,11 @@ export function approvalSheetParts(input) {
|
|
|
473
401
|
chain.length === 0 ? "" : row("If it runs out", html `<p>${chain[0]}</p><ol class="approval-steps" data-approval-fallback>${chain.slice(1).map(one => html `<li>${one.replace(/^\d+\. /, "")}</li>`)}</ol>`),
|
|
474
402
|
html `</dl>`,
|
|
475
403
|
amendment,
|
|
476
|
-
// The size, said once and plainly beside who builds: "Small change: fast model, no plan".
|
|
477
404
|
projection === null ? "" : sizeLineHtml(projection),
|
|
478
405
|
who.length === 0 ? "" : html `<p class="approval-who">${who.join(" · ")}</p>`,
|
|
479
406
|
routeEvidenceHtml(route, "approval-evidence"),
|
|
480
407
|
consent,
|
|
481
408
|
]);
|
|
482
|
-
// The plan sheet (docs/plans/task-page-steps.md): the same parts, re-ordered and re-labelled to read top to bottom —
|
|
483
|
-
// one lead sentence, Steps, Done when, Will change / Won't touch, Worth knowing, the agent — with nothing a person
|
|
484
|
-
// signs inside a fold. Never a second reading of the scope: every term below is one of the parts above.
|
|
485
409
|
const parsedPlan = plan !== null && plan.ok ? plan.document : null;
|
|
486
410
|
const approach = parsedPlan?.approach.trim() ?? "";
|
|
487
411
|
const firstSentence = (text) => /^[\s\S]+?[.!?](?=\s|$)/.exec(text)?.[0] ?? text;
|
|
@@ -490,7 +414,6 @@ export function approvalSheetParts(input) {
|
|
|
490
414
|
const part = (title, body, attrs = html ``) => body === "" || isEmptyHtml(body) ? html `` : html `<section class="plan-sheet-part"${attrs}><h3 class="plan-sheet-h">${title}</h3>${body}</section>`;
|
|
491
415
|
const statementKey = (text) => text.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
|
|
492
416
|
const signedKeys = scope.acceptance.map(one => statementKey(one.statement));
|
|
493
|
-
// The plan's proof lines a requirement doesn't already say, word for word: a line that adds a condition to one stays.
|
|
494
417
|
const extraProof = (parsedPlan?.proof ?? []).filter(line => { const key = statementKey(line); return key !== "" && !signedKeys.includes(key); });
|
|
495
418
|
const doneWhenSheet = joinHtml([
|
|
496
419
|
scope.acceptance.length === 0 ? html `<p>You decide when you review the result.</p>` : html `<ul class="plan-sheet-done">${scope.acceptance.map(one => html `<li><span>${one.statement}</span><span class="plan-sheet-how">${one.evidence.map(kind => EVIDENCE_SHEET[kind] ?? kind).join(" · ")}</span></li>`)}</ul>`,
|
|
@@ -506,7 +429,6 @@ export function approvalSheetParts(input) {
|
|
|
506
429
|
originNote(input.origin) === null ? "" : html `<p class="approval-note" data-plan-origin>${originNote(input.origin)}</p>`,
|
|
507
430
|
html `<p class="${sheetLead.length > 180 ? "plan-sheet-lead plan-sheet-lead-long" : "plan-sheet-lead"}">${sheetLead}</p>`,
|
|
508
431
|
approachRest === "" ? "" : html `<p class="plan-sheet-text">${approachRest}</p>`,
|
|
509
|
-
// An older plan that doesn't parse keeps its text, as written.
|
|
510
432
|
plan !== null && !plan.ok ? html `<pre class="recap plan-doc">${input.planDocument ?? ""}</pre>` : "",
|
|
511
433
|
goalShown.trim() === sheetLead ? "" : part("Goal", html `<p class="approval-goal">${goalShown}</p>`),
|
|
512
434
|
repairText === null ? "" : part("Full goal", html `<p>${scope.goal}</p>`),
|
|
@@ -541,29 +463,21 @@ export function approvalSheetParts(input) {
|
|
|
541
463
|
]);
|
|
542
464
|
return { lead, rows, editor, editorForm, details, submit, label: rebuild !== null ? "Approve and retry" : "Approve", after, allowing, passwordNote, sheet, sheetLead };
|
|
543
465
|
}
|
|
544
|
-
/** The plan sheet: what an approval signs, read top to bottom (approvalSheetParts' own parts, re-ordered). */
|
|
545
466
|
export function planSheetHtml(input) {
|
|
546
467
|
return approvalSheetParts(input).sheet;
|
|
547
468
|
}
|
|
548
|
-
/** Evidence kinds on the plan sheet: how each requirement is proven, in plain words. */
|
|
549
469
|
export const EVIDENCE_SHEET = { check: "Runs automatically", screenshot: "Shown in a screenshot", "changed-path": "Seen in the changed files", "manual-review": "You review it" };
|
|
550
|
-
/** Earlier versions of a task still in flight, in plain words: queued
|
|
551
|
-
* while they only wait, running once one has started; null when none. */
|
|
552
470
|
export function earlierVersionsWords(active, running) {
|
|
553
471
|
if (active <= 0)
|
|
554
472
|
return null;
|
|
555
473
|
const still = running >= active ? "running" : running <= 0 ? "queued" : "queued or running";
|
|
556
474
|
return active === 1 ? `an earlier version is still ${still}` : `${active} earlier versions are still ${still}`;
|
|
557
475
|
}
|
|
558
|
-
/** An in-place plan edit that would change the agent's permissions: thrown to roll the save back. */
|
|
559
476
|
export class PermissionsWouldChange extends Error {
|
|
560
477
|
}
|
|
561
|
-
/** Evidence kinds in plain words, for the signed criteria in Details. */
|
|
562
478
|
export const EVIDENCE_PLAIN = { check: "the project check", screenshot: "screenshots", "changed-path": "changed files", "manual-review": "your own check" };
|
|
563
|
-
/** The kinds a requirement's "How we'll know" picker offers, in the order it lists them (#19). */
|
|
564
479
|
export const HOW_WE_KNOW = ["check", "screenshot", "changed-path", "manual-review"];
|
|
565
480
|
export const HOW_WE_KNOW_WORDS = { check: "The project check passes", screenshot: "A screenshot shows it", "changed-path": "The changed files show it", "manual-review": "You check it yourself" };
|
|
566
|
-
/** The permission choice a sealed profile carries, as the scope form names it. */
|
|
567
481
|
export function permissionModeOfProfile(profile) {
|
|
568
482
|
if (profile === null || profile === undefined)
|
|
569
483
|
return null;
|
|
@@ -574,12 +488,6 @@ export function permissionModeOfProfile(profile) {
|
|
|
574
488
|
: isAcpProfile(profile) ? "bypassPermissions"
|
|
575
489
|
: profile.sandboxMode === "danger-full-access" ? "bypassPermissions" : "auto";
|
|
576
490
|
}
|
|
577
|
-
/** Done when, from the in-place editor: each line keeps its requirement's
|
|
578
|
-
* id by position, and its evidence and guidance while its words stand; a
|
|
579
|
-
* rewritten one is yours to check, like an added one; an emptied one is
|
|
580
|
-
* dropped. A "How we'll know" choice beside a line (#19) names its one kind
|
|
581
|
-
* instead; "keep", or no choice at all (an older form), changes nothing. The
|
|
582
|
-
* saved plan is a new version either way: it needs approving like any edit. */
|
|
583
491
|
export function requirementsFromEditor(body, current) {
|
|
584
492
|
const used = new Set(current.map(one => one.id));
|
|
585
493
|
let next = 1;
|
|
@@ -608,13 +516,6 @@ export function consentDoorOf(scope, route) {
|
|
|
608
516
|
if (scope.profileState === "unresolved") {
|
|
609
517
|
return { open: false, title: "The agent setup isn’t ready yet", why: scope.unresolvedReason ?? "the plan can't say exactly what would run", road: "scope" };
|
|
610
518
|
}
|
|
611
|
-
// THE SAME STRICT PROJECTION THE SEAL USES (v48 integrity): before any
|
|
612
|
-
// nonce, password field, or approve action renders, the stored scope
|
|
613
|
-
// must prove exactly — exact-key profile, chain, and route; safe and
|
|
614
|
-
// timer-safe numbers; a well-formed auth mode on every chain entry;
|
|
615
|
-
// build/repair parity; the profile as the chain's entry zero; the
|
|
616
|
-
// digest re-derived complete. What the seal would refuse, no surface
|
|
617
|
-
// offers.
|
|
618
519
|
const authority = scopeAuthorityOf(scope, { authMode: provider => readAuthModeStrict(provider) });
|
|
619
520
|
if (!authority.ok) {
|
|
620
521
|
if (authority.reason === "auth-mode") {
|
|
@@ -638,8 +539,6 @@ export function consentDoorOf(scope, route) {
|
|
|
638
539
|
}
|
|
639
540
|
return { open: true };
|
|
640
541
|
}
|
|
641
|
-
/** The closed door, rendered: no nonce, no password, no approve button —
|
|
642
|
-
* the reason and the one act that opens it. */
|
|
643
542
|
export function consentClosedHtml(taskId, door, surface) {
|
|
644
543
|
const href = `${taskHref(taskId)}#${door.road === "agents" ? "agents" : "scope"}`;
|
|
645
544
|
const act = door.road === "agents" ? "Change the agents →" : "Edit the plan →";
|
|
@@ -673,12 +572,9 @@ export function profileWords(scope) {
|
|
|
673
572
|
: isAcpProfile(profile)
|
|
674
573
|
? html `<p class="meta">Runs on <span class="mono">${ACP_AGENTS[profile.provider].name} (via ACP) · ${profile.model}</span> — full access inside Toolroll's sandbox; the agent runs any tool it chooses and nothing asks. No turn limit: stops after ${Math.round(profile.timeoutSeconds / 60)} min, or ${Math.round(profile.idleTimeoutSeconds / 60)} min silent; repairs on ${repair}, ${Math.round(profile.repairTimeoutSeconds / 60)} min, or ${Math.round(profile.repairIdleTimeoutSeconds / 60)} min silent.</p>`
|
|
675
574
|
: html `<p class="meta">Runs on <span class="mono">${profile.provider} · ${profile.model}</span> — ${profile.sandboxMode === "danger-full-access" ? "FULL permissions via --dangerously-bypass-approvals-and-sandbox; nothing asks" : "workspace-write sandbox"}, no turn limit (${Math.round(profile.timeoutSeconds / 60)} min ${profile.timeoutKind === "idle" ? "without progress" : "per attempt"}); repairs on ${repair}, ${Math.round(profile.repairTimeoutSeconds / 60)} min</p>`;
|
|
676
|
-
// What the build may reach is part of what is approved (egress.ts): said on every approval form.
|
|
677
|
-
// Its sandbox terms (project-sandbox.ts): what it reads always, and any widening, part of what the yes agrees to.
|
|
678
575
|
const terms = sandboxTermsWords(profile);
|
|
679
576
|
return html `${base}<p class="meta" data-scope-network>${networkWords(profile.network ?? null)}</p><p class="meta" data-scope-writes>Writes: ${writesWords(profile.writes)}.</p>${profile.checkAccess === undefined ? "" : html `<p class="meta" data-scope-checks>Checks: ${checkAccessWords(profile.checkAccess)}.</p>`}<p class="meta" data-scope-reads>Reads: ${terms.reads}.</p>${terms.mach === null ? "" : html `<p class="meta" data-scope-mach>${terms.mach.charAt(0).toUpperCase()}${terms.mach.slice(1)}.</p>`}`;
|
|
680
577
|
}
|
|
681
|
-
/** The evidence line beside the agents, only when an earned rule chose the builder. */
|
|
682
578
|
export function routeEvidenceHtml(view, className = "meta") {
|
|
683
579
|
const words = view?.evidence ?? null;
|
|
684
580
|
if (words === null)
|
|
@@ -698,14 +594,11 @@ export function agentsStandingWords(view) {
|
|
|
698
594
|
? "awaiting approval"
|
|
699
595
|
: "recommended";
|
|
700
596
|
}
|
|
701
|
-
/** The size line an approval leads its agents with — "Small change: fast
|
|
702
|
-
* model, no plan" — and, quietly, why it was sized so. */
|
|
703
597
|
export function sizeLineHtml(projection) {
|
|
704
598
|
if (projection.sizeWords === null)
|
|
705
599
|
return html ``;
|
|
706
600
|
return html `<p class="agents-size"><strong>${projection.sizeWords}.</strong>${projection.sizeReason === null ? "" : html ` <span class="meta">${projection.sizeReason}</span>`}</p>`;
|
|
707
601
|
}
|
|
708
|
-
/** What a size does, for a proposal card. */
|
|
709
602
|
export function sizeConsequence(size, risky) {
|
|
710
603
|
if (size === "small" && !risky)
|
|
711
604
|
return "Small change: fast model, no plan";
|
|
@@ -713,7 +606,6 @@ export function sizeConsequence(size, risky) {
|
|
|
713
606
|
return `${size === "large" ? "Large" : "Risky"} change: strongest agents plan and build`;
|
|
714
607
|
return "Medium change: everyday agents";
|
|
715
608
|
}
|
|
716
|
-
/** The one plain-English line: who does what. */
|
|
717
609
|
export function agentsSummaryWords(view) {
|
|
718
610
|
if (view.projection !== null)
|
|
719
611
|
return view.projection.summary;
|
|
@@ -721,18 +613,13 @@ export function agentsSummaryWords(view) {
|
|
|
721
613
|
return `${view.legacy.provider} · ${view.legacy.model} builds and repairs (repair model ${view.legacy.repairModel}); the planner and reviewer come from configuration at run time`;
|
|
722
614
|
return view.problem ?? "the agents cannot be read";
|
|
723
615
|
}
|
|
724
|
-
/** A risk badge only when there is something to say: a risky change, or an
|
|
725
|
-
* older route sealed at elevated or high risk. */
|
|
726
616
|
export function riskBadgeHtml(projection) {
|
|
727
617
|
return projection.riskTitle === "Routine" ? html `` : html `<span class="badge">${sentenceCase(projection.riskTitle)}</span>`;
|
|
728
618
|
}
|
|
729
|
-
/** Neutral metadata badges: risk (when not routine), posture, and standing. */
|
|
730
619
|
export function agentsBadgesHtml(view) {
|
|
731
620
|
const p = view.projection;
|
|
732
621
|
return html `${p === null ? "" : riskBadgeHtml(p)}${p === null ? "" : html `<span class="badge">${sentenceCase(p.postureWords)}</span>`}<span class="badge">${sentenceCase(agentsStandingWords(view))}</span>`;
|
|
733
622
|
}
|
|
734
|
-
/** Volatile availability, per provider on the route — shown beside the
|
|
735
|
-
* agents, never inside the approval's terms. */
|
|
736
623
|
export function agentsAvailabilityHtml(projection) {
|
|
737
624
|
const seen = new Map();
|
|
738
625
|
for (const leg of projection.legs)
|
|
@@ -745,7 +632,6 @@ export function agentsAvailabilityHtml(projection) {
|
|
|
745
632
|
});
|
|
746
633
|
return html `<p class="meta agents-availability-label">Availability right now</p><ul class="agents-availability">${items}</ul>`;
|
|
747
634
|
}
|
|
748
|
-
/** The closed details: one row per role, with the reasons. */
|
|
749
635
|
export function agentsWhyHtml(projection, summaryLabel = "Why these agents") {
|
|
750
636
|
return joinHtml([
|
|
751
637
|
html `<details class="agents-why"><summary>${summaryLabel}</summary>`,
|
|
@@ -762,14 +648,10 @@ export function agentsWhyHtml(projection, summaryLabel = "Why these agents") {
|
|
|
762
648
|
html `</dl></details>`,
|
|
763
649
|
]);
|
|
764
650
|
}
|
|
765
|
-
/** The ceremony's agents block: what the yes agrees to — the agents and
|
|
766
|
-
* their reasons. Availability is volatile and deliberately absent here. */
|
|
767
651
|
export function agentsCeremonyHtml(view) {
|
|
768
652
|
if (view === null || view === undefined)
|
|
769
653
|
return html ``;
|
|
770
654
|
if (view.projection === null) {
|
|
771
|
-
// A proven pre-routing approval: its sealed profile is the whole
|
|
772
|
-
// agents term, said in the same place with the same label.
|
|
773
655
|
if (view.legacy !== null) {
|
|
774
656
|
return html `<div class="agents-ceremony"><p class="approval-label">agents</p><p class="agents-summary">${agentsSummaryWords(view)}</p></div>`;
|
|
775
657
|
}
|
|
@@ -785,11 +667,6 @@ export function agentsCeremonyHtml(view) {
|
|
|
785
667
|
html `<p class="meta">These exact agents are part of what you approve; changing any of them asks for a fresh approval.</p></div>`,
|
|
786
668
|
]);
|
|
787
669
|
}
|
|
788
|
-
/** The runtime limits the sealed profile binds — permissions, turn and
|
|
789
|
-
* time bounds, repairs — restated on the ceremony as
|
|
790
|
-
* a CLOSED disclosure (v48): a term the yes covers, one tap away, never a
|
|
791
|
-
* wall of switches between the reader and the password. An unresolved
|
|
792
|
-
* profile still speaks in the open: that is a refusal, not a detail. */
|
|
793
670
|
export function runtimeDetailsHtml(scope) {
|
|
794
671
|
if (scope.profileState === "unresolved")
|
|
795
672
|
return profileWords(scope);
|
|
@@ -798,9 +675,6 @@ export function runtimeDetailsHtml(scope) {
|
|
|
798
675
|
return html ``;
|
|
799
676
|
return html `<details class="agents-runtime"><summary>Runtime limits</summary>${words}</details>`;
|
|
800
677
|
}
|
|
801
|
-
/** The task page's Agents card: the summary, availability, closed reasons,
|
|
802
|
-
* and — for an approver — closed change controls. Every change re-files
|
|
803
|
-
* the scope; an approval given under the earlier agents needs renewing. */
|
|
804
678
|
export function agentsCardHtml(taskId, view, canEdit) {
|
|
805
679
|
if (view === null || view === undefined)
|
|
806
680
|
return html ``;
|
|
@@ -816,14 +690,7 @@ export function agentsCardHtml(taskId, view, canEdit) {
|
|
|
816
690
|
: "",
|
|
817
691
|
html `</li>`,
|
|
818
692
|
]))}</ul>`;
|
|
819
|
-
// The controls (v48): a size choice that says what each size does, and
|
|
820
|
-
// — per role — ONLY the configured, role-valid agents the operator may
|
|
821
|
-
// pick from. Nothing is typed free-hand, no command line is quoted; the
|
|
822
|
-
// reasons above already say why the current agents were chosen.
|
|
823
693
|
const roleForms = ROUTE_PHASES.filter(phase => phase !== "review").map(phase => {
|
|
824
|
-
// Selectable choices are the role's own configured agents; a current
|
|
825
|
-
// agent the configuration no longer names is DISPLAY-ONLY — said
|
|
826
|
-
// beside the control, never an option the form could re-pick.
|
|
827
694
|
const options = view.choices[phase].filter(one => one.selectable);
|
|
828
695
|
const stale = view.choices[phase].find(one => one.current && !one.selectable) ?? null;
|
|
829
696
|
const staleNote = stale === null ? "" : html `<p class="meta agents-stale">Runs today on <span class="mono">${`${stale.provider} · ${stale.model}`}</span>, which is no longer in your configuration — pick a configured agent to replace it.</p>`;
|
|
@@ -844,7 +711,6 @@ export function agentsCardHtml(taskId, view, canEdit) {
|
|
|
844
711
|
html `<details class="agents-change"><summary>Change agents</summary>`,
|
|
845
712
|
postForm(route, joinHtml([
|
|
846
713
|
html `<label>Size<select name="size" aria-label="task size">${TASK_SIZES.map(one => html `<option value="${one}"${one === (p?.size?.size ?? "medium") ? html ` selected` : ""}>${sizeConsequence(one, false)}</option>`)}</select></label>`,
|
|
847
|
-
// The hidden "no" says the form showed the box: unticked means not risky; a request without either keeps the flag.
|
|
848
714
|
html `<input type="hidden" name="risky" value="no"><label class="agents-risky"><input type="checkbox" name="risky" value="yes"${p?.size?.risky === true ? html ` checked` : ""}> Risky</label>`,
|
|
849
715
|
html `<button type="submit" class="secondary">Set size</button>`,
|
|
850
716
|
]), { attrs: { class: "agents-form-risk" }, hidden: { sawDigest } }),
|
|
@@ -872,26 +738,20 @@ export function agentsCardHtml(taskId, view, canEdit) {
|
|
|
872
738
|
html `</section>`,
|
|
873
739
|
]);
|
|
874
740
|
}
|
|
875
|
-
/** The chat's always-visible strip: the summary and a way to the details. */
|
|
876
741
|
export function agentsStripHtml(view, taskId) {
|
|
877
742
|
if (view === null)
|
|
878
743
|
return html ``;
|
|
879
|
-
// A broken setup is not secondary detail: keep its failure visible.
|
|
880
744
|
if (view.kind === "unreadable")
|
|
881
745
|
return html `<p class="task-chat-agents">${agentsSummaryWords(view)} <a href="${taskHref(taskId)}#agents">Review agent setup</a></p>`;
|
|
882
746
|
return html `<details class="task-chat-agents"><summary>Agent setup</summary><p>${agentsSummaryWords(view)}</p><a href="${taskHref(taskId)}#agents">View agents</a></details>`;
|
|
883
747
|
}
|
|
884
|
-
/** A ceremony nonce as stored: the sha256 hex of the value the form carried. */
|
|
885
748
|
export function nonceHashOf(value) {
|
|
886
749
|
return createHash("sha256").update(value).digest("hex");
|
|
887
750
|
}
|
|
888
|
-
/** The approve POST's refusal, in words a person can act on. */
|
|
889
|
-
/** A release task's automatic approval, in words (docs/plans/auto-approve-green.md). */
|
|
890
751
|
export function autoReleaseWords(auto) {
|
|
891
752
|
return auto.kind === "approved" ? `Approved automatically: CI and release check passed on ${auto.candidate.slice(0, 7)}`
|
|
892
753
|
: `Checking automatically: approves itself once CI and the release check pass on ${auto.candidate.slice(0, 7)}`;
|
|
893
754
|
}
|
|
894
|
-
/** " (password remembered from 10:42)" when the approval stood on a remembered password or sign-in; nothing otherwise. */
|
|
895
755
|
export function approvalProofWords(proof) {
|
|
896
756
|
if (proof == null)
|
|
897
757
|
return "";
|
|
@@ -907,7 +767,6 @@ export function approvalProofWords(proof) {
|
|
|
907
767
|
return " (from your paired chat)";
|
|
908
768
|
if (proof.method === "carried")
|
|
909
769
|
return " (from the release approval)";
|
|
910
|
-
// Easy-start C5: this computer's owner approving attended work in local mode, with no password.
|
|
911
770
|
if (proof.method === "local-owner")
|
|
912
771
|
return " (on this computer, no password)";
|
|
913
772
|
return "";
|
|
@@ -928,17 +787,10 @@ export function approveRefusalWords(reason) {
|
|
|
928
787
|
return "not approved: the plan can't name an exact agent for every role. Fix the agent setup, then save the plan again";
|
|
929
788
|
if (reason === "password-now")
|
|
930
789
|
return "not approved: this needs your password typed now — protected work, raised permissions, or a plan an agent wrote can't use a remembered one";
|
|
931
|
-
// A wrong password, someone who isn't an approver (or not for this project), a revoked login: one answer for all, so
|
|
932
|
-
// the refusal never tells a guesser which it was.
|
|
933
790
|
if (reason === "not-an-approver")
|
|
934
791
|
return "That password didn't match.";
|
|
935
792
|
return `not approved: ${reason}`;
|
|
936
793
|
}
|
|
937
|
-
/** The browser's one-click approval binds not only the signed scope but the
|
|
938
|
-
* exact advisory plan revision shown beside it. The scope digest remains the
|
|
939
|
-
* durable authority; this composite makes a stale open tab fail when somebody
|
|
940
|
-
* edits the plan before approval. The empty middle slot keeps the bytes of
|
|
941
|
-
* forms already open (it once held other terms, always empty here). */
|
|
942
794
|
export function approvalFormDigest(scopeDigest, planSha) {
|
|
943
795
|
if (planSha === null)
|
|
944
796
|
return scopeDigest;
|
|
@@ -951,17 +803,11 @@ export function approvalFormDigest(scopeDigest, planSha) {
|
|
|
951
803
|
.update(planSha ?? "", "utf8")
|
|
952
804
|
.digest("hex");
|
|
953
805
|
}
|
|
954
|
-
/** The one task-level road from a truthful dispatch diagnosis to its nearest
|
|
955
|
-
* existing repair. This is navigation, never authority: every destination
|
|
956
|
-
* still owns its original confirmation, password, CSRF, and transactional
|
|
957
|
-
* checks. Keeping the map here also means the focused chat and task overview
|
|
958
|
-
* cannot send a person to different fixes for the same gate. */
|
|
959
806
|
export function taskRecoveryHref(taskId, diagnosis) {
|
|
960
807
|
if (diagnosis?.action === null || diagnosis?.action === undefined)
|
|
961
808
|
return null;
|
|
962
809
|
const task = taskHref(taskId);
|
|
963
810
|
switch (diagnosis.action) {
|
|
964
|
-
// The task page only repeats that no builder is connected: lead to the command that connects one.
|
|
965
811
|
case "start-worker":
|
|
966
812
|
return startBuilderHref(taskId);
|
|
967
813
|
case "repair-dependency":
|
|
@@ -990,25 +836,12 @@ export function taskRecoveryHref(taskId, diagnosis) {
|
|
|
990
836
|
return `${task}#task-control`;
|
|
991
837
|
}
|
|
992
838
|
}
|
|
993
|
-
/** The resume ceremony's digest (v52): the exact run, its settlement, and
|
|
994
|
-
* the scope approval as it stands — a nonce minted over one set of facts
|
|
995
|
-
* cannot confirm a resume under another. */
|
|
996
839
|
export function resumeDigestOf(taskId, runId, settledAt, scope) {
|
|
997
840
|
return createHash("sha256")
|
|
998
841
|
.update(JSON.stringify([taskId, runId, settledAt, scope?.digest ?? null, scope?.approvedDigest ?? null, scope?.approvedAt ?? null, scope?.approvedBy ?? null]))
|
|
999
842
|
.digest("hex");
|
|
1000
843
|
}
|
|
1001
844
|
export const stopWhen = (iso) => iso.replace("T", " ").replace(/\.\d{3}Z$/, "Z");
|
|
1002
|
-
/**
|
|
1003
|
-
* The exact-run control (v52): ONE component on the task page, the
|
|
1004
|
-
* focused chat, and the status fragment, so every surface names the same
|
|
1005
|
-
* run and shows the same state. Stop is one guarded post naming the run;
|
|
1006
|
-
* Stopping… is a disabled control with who asked and when; Resume opens
|
|
1007
|
-
* the password ceremony; a stopped review points at Review again. Forms
|
|
1008
|
-
* carry the CSRF token and the exact run id, nothing else.
|
|
1009
|
-
*/
|
|
1010
|
-
/** Presentation only: the same projected words and action on all task
|
|
1011
|
-
* surfaces. Approval keeps its action on the exact-terms disclosure. */
|
|
1012
845
|
export function taskStatusCard(status, taskId, dispatch, runId, approvalAction = false) {
|
|
1013
846
|
const task = taskHref(taskId);
|
|
1014
847
|
const recovery = status.token === "waiting-decision" ? `${task}#task-questions` : status.token === "stopping" || status.token === "stopped"
|
|
@@ -1036,9 +869,6 @@ export function taskControlDetailsHtml(control, taskId, csrf, surface, inert = f
|
|
|
1036
869
|
return control.kind === "paused" || control.kind === "review-stopped" || control.kind === "stopping"
|
|
1037
870
|
? html `<details id="task-control-details"><summary>${control.kind === "paused" ? "Preserved work and resume" : "Stop details"}</summary>${card}</details>` : card;
|
|
1038
871
|
}
|
|
1039
|
-
/** Pause and Pause and steer beside the task page's Stop (live steering): the same exact run, each form under its own
|
|
1040
|
-
* request id so a repeated submit is the same request. Pause hides once asked; a paused build says until when it can
|
|
1041
|
-
* wait and offers Resume, or the note to continue with. */
|
|
1042
872
|
function pauseFormsHtml(taskId, livePause) {
|
|
1043
873
|
const form = (fields, button, control, extra = {}) => postForm(`${taskHref(taskId)}/pause`, html `${fields}${button}`, { attrs: { class: "inline task-control-form", "data-task-control": control }, returnTo: "task", hidden: { run: livePause.run, request: `web-${randomUUID()}`, ...extra } });
|
|
1044
874
|
const paused = livePause.state === "paused";
|
|
@@ -1101,12 +931,8 @@ export function taskControlHtml(control, taskId, csrf, surface, inert = false, s
|
|
|
1101
931
|
}
|
|
1102
932
|
return html `<details class="card task-control" id="task-control" data-task-control="review-stopped"><summary>Previous assessment stopped</summary><p>Run #${control.run} was stopped by ${control.stop.requestedBy}. The saved result is unchanged.</p></details>`;
|
|
1103
933
|
}
|
|
1104
|
-
/** The resume confirmation (v52): the exact run restated, what resuming
|
|
1105
|
-
* does and does not do, the gate that would still keep work from
|
|
1106
|
-
* starting, and the password typed again. */
|
|
1107
934
|
export function resumeCeremonyPage(chrome, data) {
|
|
1108
935
|
const control = data.control;
|
|
1109
|
-
// One card, one button (docs/plans/plain-toolroll.md P1.3): the same post, nonce, run and password rule as before.
|
|
1110
936
|
const blocked = !data.approved ? "The plan isn't approved as it stands, so nothing builds until it is approved again."
|
|
1111
937
|
: data.gate === null ? null : `${data.gate.summary}: ${data.gate.detail}`;
|
|
1112
938
|
return screen("resume", joinHtml([
|
|
@@ -1133,7 +959,6 @@ export function publicationFactsOf(publication) {
|
|
|
1133
959
|
? null
|
|
1134
960
|
: { state: publication.state, prNumber: publication.prNumber, prUrl: publication.prUrl, remoteState: publication.remoteState, lastCheckState: publication.lastCheckState };
|
|
1135
961
|
}
|
|
1136
|
-
/** Where a status's next act lives, for a row that links out. */
|
|
1137
962
|
export function statusActionHref(status, taskId, runId, prUrl, repo) {
|
|
1138
963
|
if (status.action === null)
|
|
1139
964
|
return null;
|
|
@@ -1147,9 +972,6 @@ export function statusActionHref(status, taskId, runId, prUrl, repo) {
|
|
|
1147
972
|
default: return taskHref(taskId);
|
|
1148
973
|
}
|
|
1149
974
|
}
|
|
1150
|
-
/** The one status line every surface renders: a dot in the tone, the
|
|
1151
|
-
* label, and the `data-work-status` token tests and CSS key off. */
|
|
1152
|
-
/** A not-yet-finished task's shared headline from its dispatch diagnosis (task-status.ts). */
|
|
1153
975
|
export function dispatchHeadline(d) {
|
|
1154
976
|
const read = stageOfDispatch(d);
|
|
1155
977
|
return taskStatusOf({ stage: read.stage, ...(read.need === undefined ? {} : { need: read.need }), ...(read.wait === undefined ? {} : { wait: read.wait }) }).headline;
|
|
@@ -1160,16 +982,6 @@ export function statusLineHtml(status, extra = "") {
|
|
|
1160
982
|
export function workDiagnosticsHtml(diagnostics) {
|
|
1161
983
|
return joinHtml((diagnostics ?? []).map(one => html `<p class="work-detail" data-work-diagnostic="${one.token}"><strong>${one.label}</strong> · ${one.detail}</p>`));
|
|
1162
984
|
}
|
|
1163
|
-
/**
|
|
1164
|
-
* The decision card everywhere a person may ANSWER (portfolio, the
|
|
1165
|
-
* selected-project inbox; the task page joins in slice 3): a reversible
|
|
1166
|
-
* option answers with one tap on the card, labeled with its own words —
|
|
1167
|
-
* never a letter; an irreversible option is a LINK to the decision page,
|
|
1168
|
-
* where the server-side confirm=yes guard lives. The roll-up inbox keeps
|
|
1169
|
-
* its links-only cards and never renders this partial. The recommended
|
|
1170
|
-
* option wears a neutral badge — recommendation is not urgency, and magenta
|
|
1171
|
-
* stays on the card's outline.
|
|
1172
|
-
*/
|
|
1173
985
|
export function decisionAnswerCard(decision, csrf, now, chip, returnTo = null) {
|
|
1174
986
|
const detailsHref = `/d/${decision.id}${returnTo === null ? "" : `?return=${encodeURIComponent(returnTo)}`}`;
|
|
1175
987
|
const options = decision.options
|
|
@@ -1196,21 +1008,11 @@ export function decisionAnswerCard(decision, csrf, now, chip, returnTo = null) {
|
|
|
1196
1008
|
html `<div class="decide-options">${joinHtml(options, "\n")}</div></div>`,
|
|
1197
1009
|
]);
|
|
1198
1010
|
}
|
|
1199
|
-
/**
|
|
1200
|
-
* The inline-answer enhancement (portfolio arc §2): submits a reversible
|
|
1201
|
-
* option's form as the urlencoded POST the forms-only gate expects, follows
|
|
1202
|
-
* the redirect, and — because an answered decision leaves the open list —
|
|
1203
|
-
* replaces ONLY that card with the answered receipt parsed from the
|
|
1204
|
-
* decision page's own rendering, or removes the card. Anything unexpected
|
|
1205
|
-
* (auth, a page that is not the decision's) navigates instead of inserting.
|
|
1206
|
-
* Nothing else on the page is touched: typed input elsewhere survives.
|
|
1207
|
-
*/
|
|
1208
1011
|
export function decisionAnswerScript() {
|
|
1209
1012
|
return (`document.addEventListener("submit",function(e){` +
|
|
1210
1013
|
`var f=e.target;if(!f||!f.classList||!f.classList.contains("decide-inline"))return;` +
|
|
1211
1014
|
`e.preventDefault();` +
|
|
1212
1015
|
`var card=f.closest("[data-decision-id]");` +
|
|
1213
|
-
// The action attribute, not f.action: a field named "action" would shadow that property (DOM clobbering).
|
|
1214
1016
|
`var to=new URL(HTMLFormElement.prototype.getAttribute.call(f,"action")||"",location.href).href;` +
|
|
1215
1017
|
`var page=to.replace(/\\/answer$/,"");` +
|
|
1216
1018
|
`fetch(to,{method:"POST",credentials:"same-origin",` +
|
|
@@ -1226,9 +1028,6 @@ export function decisionAnswerScript() {
|
|
|
1226
1028
|
`if(receipt){card.replaceChildren(document.importNode(receipt,true))}else{card.remove()}` +
|
|
1227
1029
|
`},function(){location.href=page})});`);
|
|
1228
1030
|
}
|
|
1229
|
-
/** A plan is stored as inert Markdown for portability into the builder
|
|
1230
|
-
* brief, but the console renders its known structure as a useful control
|
|
1231
|
-
* surface. Historical free-form plans keep their safe plain-text fallback. */
|
|
1232
1031
|
export const MILESTONE_STATE_WORDS = {
|
|
1233
1032
|
pending: "Pending",
|
|
1234
1033
|
current: "In progress",
|
|
@@ -1238,11 +1037,6 @@ export const MILESTONE_STATE_WORDS = {
|
|
|
1238
1037
|
export function milestoneStateWord(state) {
|
|
1239
1038
|
return MILESTONE_STATE_WORDS[state] ?? "Pending";
|
|
1240
1039
|
}
|
|
1241
|
-
/** Adaptive execution plans (v44): the live milestone projection a running
|
|
1242
|
-
* (or finished) build has reported. A shared render used by BOTH the task
|
|
1243
|
-
* page and the focused chat's live region (c2) — labeled clearly as an
|
|
1244
|
-
* agent's own report, since a milestone claim is never completion proof
|
|
1245
|
-
* (Priority 2's proof contract is the only thing that adjudicates "done"). */
|
|
1246
1040
|
export function milestoneProgressHtml(milestones) {
|
|
1247
1041
|
if (milestones === null || milestones === undefined || milestones.length === 0)
|
|
1248
1042
|
return html ``;
|
|
@@ -1254,16 +1048,7 @@ export function milestoneProgressHtml(milestones) {
|
|
|
1254
1048
|
html `</ul><p class="meta milestone-progress-note">Live checkpoints from the agent.</p></section>`,
|
|
1255
1049
|
]);
|
|
1256
1050
|
}
|
|
1257
|
-
/** Adaptive execution plans (v44): the current plan revision's own reason
|
|
1258
|
-
* and evidence, any revision still awaiting an operator's accept/reject,
|
|
1259
|
-
* and the immutable history. A shared render used by BOTH the task page
|
|
1260
|
-
* and the focused chat's live region (c2), reading a document already
|
|
1261
|
-
* verified before a byte reached this function (c5). `csrf` is only a
|
|
1262
|
-
* guard now: an empty one renders no forms; postForm writes the field. */
|
|
1263
1051
|
export function planRevisionLedgerHtml(ledger, taskId, csrf) {
|
|
1264
|
-
// Nothing to show yet unless a plan has actually been revised: a task
|
|
1265
|
-
// still on its synthetic revision-1 projection, with no pending proposal
|
|
1266
|
-
// and no persisted history, is exactly what the plan card already shows.
|
|
1267
1052
|
if (ledger === null || ledger === undefined || ledger.current === null || (ledger.pending === null && ledger.history.length === 0))
|
|
1268
1053
|
return html ``;
|
|
1269
1054
|
const current = ledger.current;
|
|
@@ -1329,15 +1114,6 @@ export function executionPlanHtml(document, compact = false) {
|
|
|
1329
1114
|
function revisionImageLink(image) {
|
|
1330
1115
|
return image == null ? html `` : html `<a href="/r/${image.run}/evidence/${image.artifact}">Screenshot ${image.artifact} · result #${image.run}</a> · `;
|
|
1331
1116
|
}
|
|
1332
|
-
/**
|
|
1333
|
-
* A revision's lineage and ACTUAL terms, in the same words on the task
|
|
1334
|
-
* page, the approval card, and chat (contract handoff task 2): which
|
|
1335
|
-
* source and build it revises, the ancestry to its root, the terms the
|
|
1336
|
-
* child really carries (read from its own scope — never restated from the
|
|
1337
|
-
* brief), what is re-resolved for THIS approval, what never inherits, and
|
|
1338
|
-
* — when the task continues a repair chain — the attempts used against
|
|
1339
|
-
* the signed cap.
|
|
1340
|
-
*/
|
|
1341
1117
|
export function revisionLineageWords(lineage) {
|
|
1342
1118
|
const words = [];
|
|
1343
1119
|
if (lineage.problem !== undefined)
|
|
@@ -1373,13 +1149,6 @@ export function revisionLineageHtml(lineage) {
|
|
|
1373
1149
|
export function taskBodyParts(data) {
|
|
1374
1150
|
const { task, scope } = data;
|
|
1375
1151
|
const stopControlsActive = data.control !== undefined && ["stopping", "paused", "review-stopped"].includes(data.control.kind);
|
|
1376
|
-
// The result's shared status (workspace package 1): the same projection
|
|
1377
|
-
// the Work row, the focused chat, and the review cockpit render for this
|
|
1378
|
-
// run, so a done task with failed or missing proof never wears a bare
|
|
1379
|
-
// "done" badge here while another surface says otherwise.
|
|
1380
|
-
// The receipt re-verified the stored bytes (repair 2026-09-14), so the
|
|
1381
|
-
// box wears the receipt's own status whenever a receipt exists — the
|
|
1382
|
-
// two never disagree on one page about damaged evidence.
|
|
1383
1152
|
const resultStatus = task.state !== "done"
|
|
1384
1153
|
? null
|
|
1385
1154
|
: data.completion?.receipt !== null && data.completion?.receipt !== undefined
|
|
@@ -1397,19 +1166,8 @@ export function taskBodyParts(data) {
|
|
|
1397
1166
|
review: data.completion.review ?? null,
|
|
1398
1167
|
}, publicationFactsOf(data.publication ?? null));
|
|
1399
1168
|
const status = data.status ?? workStatusOf({ id: task.id, title: task.title, repo: data.repo, state: task.state, updatedAt: task.updatedAt, dispatch: data.dispatch ?? null, result: null, publication: null, liveRunId: data.liveRunId ?? null, control: data.control ?? { kind: "none" } }, resultStatus ?? undefined);
|
|
1400
|
-
// A review in flight leads the status box too (review fixes, finding
|
|
1401
|
-
// 4): the box keeps its recorded-verdict sentence as history under the
|
|
1402
|
-
// review's own words, and reads neutral rather than ok/problem while the
|
|
1403
|
-
// machine is still deciding.
|
|
1404
1169
|
const inReview = resultStatus !== null && REVIEW_TOKENS.has(resultStatus.token);
|
|
1405
1170
|
const act = (verb, label, hidden = {}) => postForm(`${taskHref(task.id)}/${verb}`, html `<button type="submit">${label}</button>`, { attrs: { class: "inline" }, hidden });
|
|
1406
|
-
// The active attempt panel (slice 1c): the run whose lease is the task's
|
|
1407
|
-
// CURRENT claim, named by its one unambiguous identity — build number and
|
|
1408
|
-
// worker (runsFor mixes roles newest-first, so an "attempt N" ordinal is
|
|
1409
|
-
// undefined and not used). The live peek and transcript embed here,
|
|
1410
|
-
// polled from the RUN's own authenticated fragments; a serve that never
|
|
1411
|
-
// asserted its runner says so in the same words the run page uses; a
|
|
1412
|
-
// page carrying a password ceremony degrades to the static line.
|
|
1413
1171
|
const liveRunId = data.liveRunId ?? null;
|
|
1414
1172
|
const liveRun = liveRunId === null ? undefined : data.runs.find(one => one.id === liveRunId);
|
|
1415
1173
|
const liveHistoryRunId = data.control?.kind === "stop" && data.control.role === "reviewer" && data.completion?.review?.reviewerAlive === true ? data.control.run : liveRunId;
|
|
@@ -1423,25 +1181,13 @@ export function taskBodyParts(data) {
|
|
|
1423
1181
|
if (data.degraded !== undefined) {
|
|
1424
1182
|
return html `<div class="card attempt-live" data-live-run="${liveRun.id}">${head}<p class="meta">${data.degraded === "sensitive" ? "This page carries a password ceremony, so the live view stays on the build page" : "The live view is on the build page"}</p>${door}</div>`;
|
|
1425
1183
|
}
|
|
1426
|
-
// With the live file view off there is nothing live to show here: no panel (the build's own page says why).
|
|
1427
1184
|
if (data.peekable !== true)
|
|
1428
1185
|
return "";
|
|
1429
1186
|
const peek = html `<p class="meta">What is changing right now</p><div id="run-peek"><p class="meta">Watching… the first look lands within 15 seconds</p></div><p class="meta" id="run-peek-stamp"></p>`;
|
|
1430
|
-
// What the agent is saying is the work panel's (Watch the work): the same records, read by the workspace.
|
|
1431
1187
|
return html `<div class="card attempt-live" data-live-run="${liveRun.id}">${head}${peek}${door}</div>`;
|
|
1432
1188
|
})();
|
|
1433
|
-
// One truthful answer to the first question on a queued task: "will this
|
|
1434
|
-
// run?" The badge alone cannot distinguish approval, dependency,
|
|
1435
|
-
// capability, and worker gates. This card does, in priority order, and
|
|
1436
|
-
// gives the nearest concrete repair rather than making the operator infer
|
|
1437
|
-
// it from the rest of the page.
|
|
1438
1189
|
const dispatchStatus = (() => {
|
|
1439
|
-
// data-work-status is the shared projection's token (package 1) —
|
|
1440
|
-
// the same one the Work row, chat, and cockpit carry for this task.
|
|
1441
1190
|
const workToken = resultStatus?.token ?? data.dispatch?.code ?? "unknown";
|
|
1442
|
-
// A diagnosis under Task options: the exact technical reason, one tap
|
|
1443
|
-
// away from the shared headline (task-status.ts). Red only when that
|
|
1444
|
-
// headline is Failed.
|
|
1445
1191
|
const headline = status.label;
|
|
1446
1192
|
const box = (kind, title, detail, code, controls = "") => html `<div class="${kind === "problem" && !inReview && headline === "Failed" ? "problem" : "answered"} dispatch-status" id="run-status" data-dispatch-status="${code ?? title.toLowerCase().replace(/[^a-z0-9]+/g, "-")}" data-work-status="${workToken}"><div class="dispatch-copy"><strong>${inReview ? "Recorded checks" : title}</strong><span class="meta">${detail}</span></div>${controls}</div>`;
|
|
1447
1193
|
if (task.state !== "done") {
|
|
@@ -1462,7 +1208,6 @@ export function taskBodyParts(data) {
|
|
|
1462
1208
|
case "approve-scope": return html ` <a href="#approve">Review the plan and approve it</a>.`;
|
|
1463
1209
|
case "answer-decision": return html ` <a href="#decisions">Answer the waiting question</a>.`;
|
|
1464
1210
|
case "unhold": return diagnosis.code === "storage-blocked" ? html ` Use <strong>Try again</strong> once it's allowed.` : html ` Use <strong>Remove hold</strong> when it can continue.`;
|
|
1465
|
-
// The reason is the detail itself; Retry is the status card's own act, said once.
|
|
1466
1211
|
case "retry-task": return "";
|
|
1467
1212
|
case "repair-capability": return html ` <a href="/caps">Repair the requirement</a>.`;
|
|
1468
1213
|
case "repair-dependency":
|
|
@@ -1505,7 +1250,6 @@ export function taskBodyParts(data) {
|
|
|
1505
1250
|
html `<p><a href="${startBuilderHref(task.id)}">See connection status →</a></p></div></details>`,
|
|
1506
1251
|
]);
|
|
1507
1252
|
}
|
|
1508
|
-
// Never a link to this page's own acts: Retry sits on the status card and below.
|
|
1509
1253
|
const href = diagnosis.action === "retry-task" ? null : taskRecoveryHref(task.id, diagnosis);
|
|
1510
1254
|
return href === null ? "" : html `<a class="button-link dispatch-action-link" href="${href}">${dispatchActionLabel(diagnosis)}</a>`;
|
|
1511
1255
|
})();
|
|
@@ -1533,19 +1277,12 @@ export function taskBodyParts(data) {
|
|
|
1533
1277
|
semanticCoverageHtml(proof.proofMatrix, proof.qualityMode ?? "default"), html `</div></details>`,
|
|
1534
1278
|
]);
|
|
1535
1279
|
}
|
|
1536
|
-
// v50: the independent review's own card — attempt counts, what is
|
|
1537
|
-
// running or queued, the latest failure in words, and the ONE
|
|
1538
|
-
// explicit act (Retry review) exactly when the allowance admits it.
|
|
1539
1280
|
const reviewCard = reviewRetryPanel(task.id, proof.runId, proof.reviewRetry ?? null, {
|
|
1540
1281
|
csrf: data.csrf,
|
|
1541
1282
|
canAct: data.canRetryReview === true,
|
|
1542
1283
|
returnTo: null,
|
|
1543
1284
|
});
|
|
1544
1285
|
const withReview = (...parts) => joinHtml([reviewCard, ...parts]);
|
|
1545
|
-
// A no-change conclusion never owes a proof — there is no diff to
|
|
1546
|
-
// check acceptance criteria or a changed-path claim against — so it
|
|
1547
|
-
// keeps reading on the two presence facts alone, exactly as before
|
|
1548
|
-
// the proof system existed (the "attested floor" this preserves).
|
|
1549
1286
|
if (proof.outcome === "no-change") {
|
|
1550
1287
|
const missing = [proof.hasHandoff ? null : "agent handoff", proof.hasTerminalDiff ? null : "terminal diff"]
|
|
1551
1288
|
.filter((one) => one !== null);
|
|
@@ -1553,46 +1290,27 @@ export function taskBodyParts(data) {
|
|
|
1553
1290
|
? box("problem", resultStatus.label, html `<a href="/r/${proof.runId}">Build #${proof.runId}</a> concluded no change was needed, but its ${missing.join(" and ")} is missing.`, resultStatus.token)
|
|
1554
1291
|
: box("ok", resultStatus.label, html `<a href="/r/${proof.runId}">Build #${proof.runId}</a> concluded no change was needed; its handoff and machine-captured diff are on record.`, resultStatus.token));
|
|
1555
1292
|
}
|
|
1556
|
-
// A built run's verdict is the machine's own — computed once at
|
|
1557
|
-
// completion by adjudicate() (Priority 2), never re-derived here.
|
|
1558
|
-
// Acceptance changes the CLASS (problem → ok) and the words, never
|
|
1559
|
-
// the underlying token: the surfaces still agree on what happened.
|
|
1560
1293
|
const accepted = proof.proofAccepted;
|
|
1561
1294
|
const humanReview = manualReviewOnly({ verdict: proof.proofVerdict ?? "", reasons: proof.proofReasons, matrix: proof.proofMatrix });
|
|
1562
|
-
// Accepting contradictory or incomplete evidence is an explicit,
|
|
1563
|
-
// recorded exception—not the ordinary magenta approval ceremony.
|
|
1564
1295
|
const acceptForm = accepted || data.csrf === ""
|
|
1565
1296
|
? ""
|
|
1566
1297
|
: html `<details class="proof-exception"><summary>${humanReview ? "Accept result" : "Accept with exception"}</summary>${postForm(`${taskHref(task.id)}/accept-proof`, html `<input type="text" name="note" maxlength="500" placeholder="${humanReview ? "What did you verify?" : "Why is this safe to accept?"}" aria-label="${humanReview ? "review note" : "exception reason"}" required><button type="submit">${humanReview ? "Accept result" : "Accept with exception"}</button>`, {
|
|
1567
1298
|
attrs: { class: "proof-exception-form" },
|
|
1568
1299
|
hidden: { run: proof.runId },
|
|
1569
1300
|
})}</details>`;
|
|
1570
|
-
// v40: the machine's own pre-fold verdict, restated when a review
|
|
1571
|
-
// moved it — "the machine attested it; reviewer:codex contradicted
|
|
1572
|
-
// c2" — never pretending the machine always disagreed.
|
|
1573
1301
|
const machineNote = !reviewConflict(proof.proofMatrix, proof.machineVerdict, proof.proofVerdict)
|
|
1574
1302
|
? ""
|
|
1575
1303
|
: html `<p class="meta">An independent review found the report doesn't match the changes.</p>`;
|
|
1576
1304
|
const chainHtml = repairChainHtml(proof.repairChain);
|
|
1577
|
-
// v51: semantic coverage sits beside the matrix, never inside the
|
|
1578
|
-
// verdict word — what the independent reviewer settled, under the
|
|
1579
|
-
// signed policy, with every context gap named.
|
|
1580
1305
|
const coverageHtml = semanticCoverageHtml(proof.proofMatrix, proof.qualityMode ?? "default");
|
|
1581
1306
|
const proofDetails = proof.proofMatrix.length === 0 && machineNote === "" && isEmptyHtml(chainHtml)
|
|
1582
1307
|
? ""
|
|
1583
1308
|
: html `<details class="dispatch-proof-details"><summary>${proof.proofMatrix.length === 0 ? "Verification details" : `${proof.proofMatrix.length} requirement${proof.proofMatrix.length === 1 ? "" : "s"}`} · View details</summary><div class="dispatch-proof-body">${criterionMatrixHtml(proof.proofMatrix, { compact: true, runId: proof.runId, links: proof.proofMatrixLinks, verdict: proof.proofVerdict })}${coverageHtml}${machineNote}${chainHtml}</div></details>`;
|
|
1584
|
-
// The publication fact is separate from the evidence fact: a PR or
|
|
1585
|
-
// an observed merge is named from its record; nothing is "deployed".
|
|
1586
1309
|
const publicationWords = (data.publication === null || data.publication === undefined ? "" : ` ${receiptPublicationWords(publicationFactsOf(data.publication))}`) +
|
|
1587
|
-
// Shortened records say so here too (repair 2026-09-14).
|
|
1588
1310
|
(proof.receipt === null ? "" : ` ${evidenceShortenedWords(proof.receipt.facts.evidenceHealth)}`).replace(/ $/, "");
|
|
1589
|
-
// Damaged evidence (repair 2026-09-14): the box wears the receipt's
|
|
1590
|
-
// own problem words — never "ok" with a verdict that predates the damage.
|
|
1591
1311
|
if (resultStatus.token === "evidence-damaged") {
|
|
1592
1312
|
return withReview(box("problem", resultStatus.label, html `<a href="/r/${proof.runId}">Build #${proof.runId}</a> finished. ${resultStatus.detail}${publicationWords}`, "evidence-damaged"), html `<div class="proof-review-actions"><a class="button-link" href="/r/${proof.runId}">Review what doesn't match</a></div>`, proofDetails);
|
|
1593
1313
|
}
|
|
1594
|
-
// A recorded pass the check read now doesn't stand behind (unreadable, failed since, or not read here) never
|
|
1595
|
-
// reads "passed": the box says what holds now (task-status.ts approvedCheckOf).
|
|
1596
1314
|
if (proof.proofVerdict === "verified" && !accepted && !(proof.receipt?.checks !== undefined && ["ready-to-review", "pr-opened", "merge-observed", "pr-closed"].includes(resultStatus.token))) {
|
|
1597
1315
|
return withReview(box(resultStatus.tone === "problem" ? "problem" : "ok", resultStatus.label, html `<a href="/r/${proof.runId}">Build #${proof.runId}</a> finished. ${resultStatus.detail}${publicationWords}`, resultStatus.token), proofDetails);
|
|
1598
1316
|
}
|
|
@@ -1605,16 +1323,11 @@ export function taskBodyParts(data) {
|
|
|
1605
1323
|
if (proof.proofVerdict === "attested" && !accepted) {
|
|
1606
1324
|
return withReview(box("ok", resultStatus.label, html `<a href="/r/${proof.runId}">Build #${proof.runId}</a> finished as ${proof.outcome ?? "terminal"}. No independent project check ran: the checks listed are the agent's own report, and each item below is labeled by source.${publicationWords}`, dispatchStatusToken("attested")), proofDetails);
|
|
1607
1325
|
}
|
|
1608
|
-
// A refuted, short, or absent verdict — and an accepted one, which
|
|
1609
|
-
// stays visibly an exception: the words never say checks passed.
|
|
1610
1326
|
const machineToken = proof.proofVerdict === "refuted" ? dispatchStatusToken("refuted") : dispatchStatusToken("short");
|
|
1611
1327
|
return withReview(box(accepted ? "ok" : "problem", resultStatus.label, html `<a href="/r/${proof.runId}">Build #${proof.runId}</a> finished. ${verificationExplanation(proof.proofVerdict, proof.proofReasons)}${accepted ? html ` An approver accepted it by hand; that acceptance leaves the machine's verdict above unchanged.` : ""}${publicationWords}`, machineToken), html `<div class="proof-review-actions"><a class="button-link" href="${reviewHref(task.id)}">${accepted ? "Review the recorded exception" : resultStatus.action?.label ?? "Review evidence"}</a>${acceptForm}</div>`, proofDetails);
|
|
1612
1328
|
}
|
|
1613
1329
|
return box("problem", "Can't tell yet", "Reload this task to see whether it can start.", "unknown");
|
|
1614
1330
|
})();
|
|
1615
|
-
// Operator steering (arc 1, v120): notes for the agent, each wearing the
|
|
1616
|
-
// same words the CLI and the lead use — read (and when), waiting for the
|
|
1617
|
-
// running agent, bound for the next attempt, or ended unread.
|
|
1618
1331
|
const steering = data.steering ?? [];
|
|
1619
1332
|
const steeringLive = data.steeringLive === true;
|
|
1620
1333
|
const steerState = (one) => {
|
|
@@ -1633,17 +1346,12 @@ export function taskBodyParts(data) {
|
|
|
1633
1346
|
? ""
|
|
1634
1347
|
: joinHtml([
|
|
1635
1348
|
html `<h2>Holds</h2>`,
|
|
1636
|
-
joinHtml(data.holds.map(
|
|
1637
|
-
// The storage check's hold (dispose.ts holdForStorage) says what it waits for, in the check's own words.
|
|
1638
|
-
hold => html `<p class="row">${hold.ownerKind === "backoff" && hold.reason.startsWith(STORAGE_HOLD_PREFIX) ? `waiting for macOS permission — ${hold.reason.slice(STORAGE_HOLD_PREFIX.length)}` : `${holdOwnerWords(hold.ownerKind)} — ${hold.reason}`}${hold.until === null ? "" : html ` <span class="meta">until ${whenTime(hold.until)}</span>`}</p>`), "\n"),
|
|
1349
|
+
joinHtml(data.holds.map(hold => html `<p class="row">${hold.ownerKind === "backoff" && hold.reason.startsWith(STORAGE_HOLD_PREFIX) ? `waiting for macOS permission — ${hold.reason.slice(STORAGE_HOLD_PREFIX.length)}` : `${holdOwnerWords(hold.ownerKind)} — ${hold.reason}`}${hold.until === null ? "" : html ` <span class="meta">until ${whenTime(hold.until)}</span>`}</p>`), "\n"),
|
|
1639
1350
|
html `<p class="meta">Only your hold can be lifted here. Waits for a question, repeated failures or a retry clear on their own.</p>`,
|
|
1640
1351
|
]);
|
|
1641
1352
|
const approval = approvalOf(scope);
|
|
1642
|
-
// A refused save from the sheet's in-place editor reopens that editor with
|
|
1643
|
-
// its draft; the full scope form below stays as it was.
|
|
1644
1353
|
const inlineScopeDraft = data.scopeDraft?.has("requirement-new") === true;
|
|
1645
1354
|
const scopeDraft = inlineScopeDraft ? undefined : data.scopeDraft;
|
|
1646
|
-
// A release's terms in the scope card (the page without script); the plan sheet says them whole (approvalSheetParts).
|
|
1647
1355
|
const releaseTermsHtml = scope == null || (scope.releaseTerms == null && scope.releaseCheck == null) ? "" : html `<p><strong>Release</strong></p>${scope.releaseTerms == null ? "" : html `<p class="recap">${releaseTermsSentence(scope.releaseTerms)}</p>`}${scope.releaseCheck == null ? "" : html `<p class="recap">${releaseCheckSentence(scope.releaseCheck)}</p>`}${data.releaseCiRunning === true ? html `<p class="meta">${RELEASE_CI_RUNNING_WORDS}</p>` : ""}${scope.releaseTerms?.policy.carry === true ? html `<p><strong>What asks again</strong></p><ul>${joinHtml(releaseAsksAgainWords(scope.releaseTerms).map(line => html `<li>${line}</li>`), "")}</ul>` : ""}`;
|
|
1648
1356
|
const scopeCard = scope === null
|
|
1649
1357
|
? html `<p class="meta">No plan yet. Nothing builds until one is approved.</p>`
|
|
@@ -1664,10 +1372,6 @@ export function taskBodyParts(data) {
|
|
|
1664
1372
|
: html `<p class="meta">${approval.reason === "changed" ? "Edited after approval" : "Not approved"}</p>${planVersionDetailsHtml(scope.digest)}`,
|
|
1665
1373
|
html `</div>`,
|
|
1666
1374
|
], "\n");
|
|
1667
|
-
// The scout's report (mate arc §10): title, summary, the document inert,
|
|
1668
|
-
// and each follow-up as a filing the operator makes with one tap. A
|
|
1669
|
-
// report that exists but cannot be verified is a named problem, never a
|
|
1670
|
-
// blank — the same rule as the revision brief.
|
|
1671
1375
|
const reportCard = data.report === null || data.report === undefined
|
|
1672
1376
|
? data.deliverable === "report"
|
|
1673
1377
|
? html `<div class="card"><p><strong>Research task</strong> <span class="meta">delivers a report, never a branch. A read-only session looks into the goal, and its report appears here when it finishes.</span></p></div>`
|
|
@@ -1694,13 +1398,6 @@ export function taskBodyParts(data) {
|
|
|
1694
1398
|
]),
|
|
1695
1399
|
html `</div>`,
|
|
1696
1400
|
], "\n");
|
|
1697
|
-
// The plan a planner drafted, when one exists: rendered inert above the
|
|
1698
|
-
// approval it proposes. The scope stays the contract; this is the road.
|
|
1699
|
-
// Adaptive execution plans (v44): once approved, the CURRENT revision's
|
|
1700
|
-
// text displays here — the same document the builder actually reads —
|
|
1701
|
-
// rather than the original artifact frozen at approval time; the edit
|
|
1702
|
-
// form and its staleness guard stay bound to that original artifact,
|
|
1703
|
-
// since editing is a pre-approval act this ledger does not touch.
|
|
1704
1401
|
const currentRevisionForDisplay = data.planRevisions?.current ?? null;
|
|
1705
1402
|
const displayedPlanDocument = currentRevisionForDisplay !== null && currentRevisionForDisplay.revision > 1
|
|
1706
1403
|
? currentRevisionForDisplay.document
|
|
@@ -1712,11 +1409,8 @@ export function taskBodyParts(data) {
|
|
|
1712
1409
|
: approval.approved
|
|
1713
1410
|
? "approved"
|
|
1714
1411
|
: "review before starting";
|
|
1715
|
-
// While the approval sheet is open it states any amendment; the plan
|
|
1716
|
-
// card does not repeat it (one #contract-amendment on the page).
|
|
1717
1412
|
const sheetStatesContract = scope !== null && !approval.approved && data.plan === "drafted" && data.dispatch?.action !== "repair-dependency" &&
|
|
1718
1413
|
!(data.revision != null && "problem" in data.revision) && scope.profileState !== "unresolved" && consentDoorOf(scope, data.route).open;
|
|
1719
|
-
// The plan document's own editor (#plan-edit): the plan card holds it, and the task page's Plan row.
|
|
1720
1414
|
const planEditorHtml = data.planDocument === null || data.csrf === "" || data.planSha == null || approval.approved
|
|
1721
1415
|
? ""
|
|
1722
1416
|
: html `<details class="plan-editor" id="plan-edit"><summary>Edit plan</summary>${postForm(`${taskHref(task.id)}/plan-edit`, joinHtml([
|
|
@@ -1726,12 +1420,13 @@ export function taskBodyParts(data) {
|
|
|
1726
1420
|
]), { hidden: { "saw-plan": data.planSha } })}</details>`;
|
|
1727
1421
|
const planCard = data.planDocument === null
|
|
1728
1422
|
? data.plan === "requested"
|
|
1729
|
-
|
|
1730
|
-
? data.dispatch?.code === "planner-source"
|
|
1423
|
+
? data.dispatch?.code === "planner-source" || data.dispatch?.code === "signed-out"
|
|
1731
1424
|
? ""
|
|
1732
1425
|
: data.revision != null && !("problem" in data.revision)
|
|
1733
1426
|
? html `<div class="card planner-status"><span class="planner-orb" aria-hidden="true"></span><p><strong>Updating the plan</strong><span class="meta">Adding your notes to the plan. You approve any change before it builds.</span></p></div>`
|
|
1734
|
-
: html `<div class="card planner-status"><span class="planner-orb" aria-hidden="true"></span><p><strong>Planning requested</strong><span class="meta">${data.planAuto ? "Automatic approval is enabled for a verified plan that preserves your filed contract. Amendments and unanswered questions still pause."
|
|
1427
|
+
: html `<div class="card planner-status"><span class="planner-orb" aria-hidden="true"></span><p><strong>Planning requested</strong><span class="meta">${data.planAuto ? "Automatic approval is enabled for a verified plan that preserves your filed contract. Amendments and unanswered questions still pause."
|
|
1428
|
+
: data.dispatch?.code === "running" ? "The agent is inspecting the repository and drafting the goal, acceptance criteria, and approach. It will ask only if a missing answer changes the work."
|
|
1429
|
+
: "It waits for an agent to start on it."}</span></p></div>`
|
|
1735
1430
|
: ""
|
|
1736
1431
|
: joinHtml([
|
|
1737
1432
|
approval.approved ? html `<details class="card planner-plan planner-plan-collapsed"><summary class="execution-plan-head">` : html `<section class="card planner-plan"><div class="execution-plan-head">`,
|
|
@@ -1745,9 +1440,6 @@ export function taskBodyParts(data) {
|
|
|
1745
1440
|
]);
|
|
1746
1441
|
const progressCard = milestoneProgressHtml(data.milestoneProgress);
|
|
1747
1442
|
const revisionLedgerCard = planRevisionLedgerHtml(data.planRevisions, task.id, data.csrf);
|
|
1748
|
-
// The revision batch (M6.8), restated on the SAME screen as the approval
|
|
1749
|
-
// it belongs to: the approver sees exactly the comments the brief carries.
|
|
1750
|
-
// A brief that cannot be verified is a named problem, never a blank.
|
|
1751
1443
|
const revisionCard = data.revision === null || data.revision === undefined
|
|
1752
1444
|
? ""
|
|
1753
1445
|
: "problem" in data.revision
|
|
@@ -1759,24 +1451,12 @@ export function taskBodyParts(data) {
|
|
|
1759
1451
|
revisionLineageHtml(data.revision.lineage),
|
|
1760
1452
|
html `</div>`,
|
|
1761
1453
|
], "\n");
|
|
1762
|
-
// The approval form restates every field the digest binds — an operator
|
|
1763
|
-
// approves what is on this form, not what is elsewhere on the page — and
|
|
1764
|
-
// requires the token typed again. The session got you here; only the
|
|
1765
|
-
// token agrees. The sheet shows the plan open in plain rows with one
|
|
1766
|
-
// Approve & start; the rest of the signed terms sit in its Details fold.
|
|
1767
|
-
// An unapprovable scope gets the problem and the edit road instead of a
|
|
1768
|
-
// password it cannot use.
|
|
1769
1454
|
const consentDoor = consentDoorOf(scope, data.route);
|
|
1770
1455
|
const revisionInApproval = scope !== null && !approval.approved && data.plan !== "requested" &&
|
|
1771
1456
|
scope.profileState !== "unresolved" && consentDoor.open && data.dispatch?.action !== "repair-dependency" &&
|
|
1772
1457
|
(data.revision == null || !("problem" in data.revision));
|
|
1773
|
-
// The approval is the next step when dispatch waits on it, or when the plan was rewritten after a build (the
|
|
1774
|
-
// assignment's one action): then it is shown open under the status, never folded.
|
|
1775
1458
|
const approvalLeads = data.dispatch?.action === "approve-scope" ||
|
|
1776
1459
|
(data.assignment?.primaryAction?.code === "approve-scope" && data.assignment.primaryAction.target.taskId === task.id);
|
|
1777
|
-
// The sheet's terms, when this person can approve them here: the task page's kit approval box (its Plan tab shows
|
|
1778
|
-
// the rows) and the legacy sheet both read these.
|
|
1779
|
-
// A cancelled task asks for no approval: nothing would start, so its page offers no Approve (reopening asks again).
|
|
1780
1460
|
const sheetInput = scope === null || approval.approved || task.state === "cancelled" || data.plan === "requested" || (data.revision != null && "problem" in data.revision) ||
|
|
1781
1461
|
scope.profileState === "unresolved" || !consentDoor.open ? null : {
|
|
1782
1462
|
surface: "task",
|
|
@@ -1854,11 +1534,7 @@ export function taskBodyParts(data) {
|
|
|
1854
1534
|
], "\n"), { attrs: { class: "scope-editor" }, hidden: { sawDigest: scopeDraft?.get("sawDigest") ?? scope?.digest ?? "" } }),
|
|
1855
1535
|
html `</details>`,
|
|
1856
1536
|
], "\n");
|
|
1857
|
-
// 41_237 → "41k": token counts read at a glance; exactness lives on the run page.
|
|
1858
1537
|
const compactCount = (count) => count >= 1000 ? `${Math.round(count / 1000)}k` : String(count);
|
|
1859
|
-
// The attempt ledger (M5.5): every attempt with its provider, duration,
|
|
1860
|
-
// tokens, and dollars — or the honest word "unmeasured" — so a retry
|
|
1861
|
-
// storm reads as the spike it is instead of hiding inside a total.
|
|
1862
1538
|
const minutesOf = (run) => {
|
|
1863
1539
|
if (run.finishedAt === null)
|
|
1864
1540
|
return null;
|
|
@@ -1868,9 +1544,6 @@ export function taskBodyParts(data) {
|
|
|
1868
1544
|
const tokensOf = (run) => run.tokensIn === null && run.tokensOut === null
|
|
1869
1545
|
? null
|
|
1870
1546
|
: `${run.tokensIn === null ? "?" : compactCount(run.tokensIn)}/${run.tokensOut === null ? "?" : compactCount(run.tokensOut)} tok`;
|
|
1871
|
-
// Ledger rows (slice 1c): the same row grammar as the portfolio's terminal
|
|
1872
|
-
// ledger — identity, outcome chip, one mono meta run of provider · model ·
|
|
1873
|
-
// duration · tokens · measured-or-unmeasured cost.
|
|
1874
1547
|
const runRows = joinHtml(data.runs
|
|
1875
1548
|
.map(run => {
|
|
1876
1549
|
const bits = [
|
|
@@ -1884,9 +1557,6 @@ export function taskBodyParts(data) {
|
|
|
1884
1557
|
return html `<p class="row"><a href="/r/${run.id}" class="mono">#${run.id}</a> ${runOutcomeBadge(run, run.id === liveHistoryRunId)}${run.reason === null ? "" : html ` <span class="meta">${reasonWords(run.reason)}</span>`} <span class="meta mono">${bits.join(" · ")}</span><span class="right meta mono">${whenTime(run.startedAt)}</span></p>`;
|
|
1885
1558
|
}), "\n");
|
|
1886
1559
|
const runs = data.runs.length === 0 ? "" : html `<h2>Attempts</h2>${runRows}`;
|
|
1887
|
-
// ---- the right rail (slice 1c) ------------------------------------------
|
|
1888
|
-
// Dollars stated per attempt set, measured or unmeasured in words — a
|
|
1889
|
-
// missing figure is never summed as $0.
|
|
1890
1560
|
const spendWords = (rows) => {
|
|
1891
1561
|
if (rows.length === 0)
|
|
1892
1562
|
return "no attempt yet";
|
|
@@ -1896,8 +1566,6 @@ export function taskBodyParts(data) {
|
|
|
1896
1566
|
const subscriptionEquivalent = subscription.reduce((sum, one) => sum + (one.costUsd ?? 0), 0);
|
|
1897
1567
|
const metered = measured.filter(one => one.authMode !== "subscription");
|
|
1898
1568
|
const meteredDollars = metered.reduce((sum, one) => sum + (one.costUsd ?? 0), 0);
|
|
1899
|
-
// Tokens count only where an attempt reported them; a null report is
|
|
1900
|
-
// said, never summed as zero (commit-3 review, finding 2).
|
|
1901
1569
|
const reported = rows.filter(one => one.tokensIn !== null || one.tokensOut !== null);
|
|
1902
1570
|
const tokens = reported.reduce((sum, one) => sum + (one.tokensIn ?? 0) + (one.tokensOut ?? 0), 0);
|
|
1903
1571
|
const tokenWords = reported.length === 0
|
|
@@ -1930,8 +1598,6 @@ export function taskBodyParts(data) {
|
|
|
1930
1598
|
prop("this attempt", thisAttempt === undefined ? "no attempt yet" : spendWords([thisAttempt])),
|
|
1931
1599
|
prop("task total", spendWords(data.runs)),
|
|
1932
1600
|
]);
|
|
1933
|
-
// "publishes as": push, open-PR, and merge are INDEPENDENT fields on the
|
|
1934
|
-
// grant — each phrased on its own; absent means exactly that.
|
|
1935
1601
|
const publishesAs = (() => {
|
|
1936
1602
|
const grant = data.grant ?? null;
|
|
1937
1603
|
if (data.repo === null)
|
|
@@ -1948,9 +1614,6 @@ export function taskBodyParts(data) {
|
|
|
1948
1614
|
].filter((part) => part !== null).join(" · ");
|
|
1949
1615
|
})();
|
|
1950
1616
|
const publishesRow = prop("publishes as", publishesAs);
|
|
1951
|
-
// The property list (task page pass): worker and attempt, queue place,
|
|
1952
|
-
// the scope's standing with its seal, publication, spend — the key
|
|
1953
|
-
// facts a reader scans before anything else, in one row grammar.
|
|
1954
1617
|
const workerRow = liveRun !== undefined
|
|
1955
1618
|
? prop("builder", html `${liveRun.runner} · <a href="/r/${liveRun.id}">build #${liveRun.id}</a> running`)
|
|
1956
1619
|
: data.runs[0] !== undefined
|
|
@@ -1970,7 +1633,6 @@ export function taskBodyParts(data) {
|
|
|
1970
1633
|
: prop("plan", approval.reason === "changed" ? "Edited after approval: it needs a new approval" : "not approved");
|
|
1971
1634
|
const strikesRow = data.strikes > 0 ? prop("failed attempts", `${data.strikes} in a row`) : "";
|
|
1972
1635
|
const propsCard = html `<div class="card props">${workerRow}${queueRow}${scopeRow}${publishesRow}${economics}${strikesRow}</div>`;
|
|
1973
|
-
// The same facts for the rebuilt page, row for row.
|
|
1974
1636
|
const facts = [];
|
|
1975
1637
|
const lastRun = data.runs[0];
|
|
1976
1638
|
if (liveRun !== undefined)
|
|
@@ -1989,7 +1651,6 @@ export function taskBodyParts(data) {
|
|
|
1989
1651
|
if (data.release?.kind === "anchor")
|
|
1990
1652
|
facts.push({ label: "Release", parts: [`Approved for release ${data.release.version}`, ...(data.release.landed.length === 0 ? [] : [` · later commits: ${data.release.landed.map(one => one.sha.slice(0, 7)).join(", ")}`]), ...(data.release.carrying ? [] : [` · later commits ask again`])] });
|
|
1991
1653
|
facts.push({ label: "Publishes as", parts: [publishesAs] });
|
|
1992
|
-
// v102: who asked for it, and what the project's approval rules need.
|
|
1993
1654
|
if (data.filer != null)
|
|
1994
1655
|
facts.push({ label: "Filed by", parts: [data.filer.name === null ? "automation" : data.filer.kind === "coordinator" ? `${data.filer.name}, through your lead` : data.filer.name] });
|
|
1995
1656
|
if (data.approvalRules != null) {
|
|
@@ -1998,13 +1659,11 @@ export function taskBodyParts(data) {
|
|
|
1998
1659
|
? (votes.length === 0 ? "needs two approvers" : `approved by ${votes.join(", ")} · needs one more`)
|
|
1999
1660
|
: data.approvalRules.words] });
|
|
2000
1661
|
}
|
|
2001
|
-
// v103: everything an auditor asks about this task, printable or as JSON.
|
|
2002
1662
|
facts.push({ label: "Audit", parts: [{ label: "Audit record", href: `${taskHref(task.id)}/evidence` }] });
|
|
2003
1663
|
if (data.budgetHold != null)
|
|
2004
1664
|
facts.push({ label: "Budget", parts: [`${data.budgetHold} · `, { label: "Spend", href: "/spend" }] });
|
|
2005
1665
|
if (data.policyHold != null)
|
|
2006
1666
|
facts.push({ label: "Policy", parts: [`${data.policyHold} · `, { label: "Policy", href: "/settings/policy" }] });
|
|
2007
|
-
// The pull-request card already says this once, with its action.
|
|
2008
1667
|
if (data.publication !== null && data.publication !== undefined && data.pullRequest?.view == null) {
|
|
2009
1668
|
const prHref = safePrUrl(data.publication.prUrl), pr = `PR #${data.publication.prNumber ?? "?"}`;
|
|
2010
1669
|
facts.push({ label: "Published", parts: [prHref === null ? pr : { label: pr, href: prHref },
|
|
@@ -2014,8 +1673,6 @@ export function taskBodyParts(data) {
|
|
|
2014
1673
|
facts.push({ label: "Task total", parts: [spendWords(data.runs)] });
|
|
2015
1674
|
if (data.strikes > 0)
|
|
2016
1675
|
facts.push({ label: "Strikes", parts: [`${data.strikes} failed attempt(s)`] });
|
|
2017
|
-
// Open decisions as the shared partial — answerable inline when the
|
|
2018
|
-
// page is not sensitive; link-only cards otherwise.
|
|
2019
1676
|
const openDecisions = data.decisions.filter(one => one.state === "open" || one.state === "expired");
|
|
2020
1677
|
const decisionRail = openDecisions.length === 0
|
|
2021
1678
|
? ""
|
|
@@ -2024,8 +1681,6 @@ export function taskBodyParts(data) {
|
|
|
2024
1681
|
? html `<div class="decide-card" data-decision-id="${decision.id}"><p class="q">${decision.question}</p><p class="meta">${oneLineOf(decision.recap, 160)}</p><p class="meta"><a href="/d/${decision.id}">the full question →</a></p></div>`
|
|
2025
1682
|
: decisionAnswerCard({ ...decision, taskId: task.id, repo: data.repo }, data.csrf, data.now, false)), "\n")}`;
|
|
2026
1683
|
const rail = joinHtml([decisionRail, propsCard].filter(part => part !== ""), "\n");
|
|
2027
|
-
// Spend by provider, from the same rows — dollars only where a provider
|
|
2028
|
-
// measured them, and the unmeasured said in words, never summed as $0.
|
|
2029
1684
|
const spendCard = (() => {
|
|
2030
1685
|
if (data.runs.length === 0)
|
|
2031
1686
|
return "";
|
|
@@ -2072,33 +1727,21 @@ export function taskBodyParts(data) {
|
|
|
2072
1727
|
: html `<p class="row meta">${incidentWords(one.kind)} — resolved by ${one.resolvedBy ?? "?"}</p>`), "\n")}`;
|
|
2073
1728
|
const stalled = task.state === "failed" || data.incidents.some(one => one.resolvedAt === null);
|
|
2074
1729
|
const dependencyChoiceNeeded = data.dispatch?.action === "repair-dependency";
|
|
2075
|
-
// The chain: what this task waits for, editable in place. Blockers
|
|
2076
|
-
// outside this console's view are named without state or link — the same
|
|
2077
|
-
// redaction the board applies. Adding and removing are ordinary
|
|
2078
|
-
// re-proved POSTs; the loop refusal comes back as the problem banner.
|
|
2079
1730
|
const waitsFor = data.waitsFor ?? [];
|
|
2080
1731
|
const candidates = (data.waitCandidates ?? []).filter(one => !waitsFor.some(existing => existing.id === one.id));
|
|
2081
1732
|
const waitRows = waitsFor.length === 0 ? "" : joinHtml(waitsFor.map(one => html `<p class="row">${one.admitted ? html `<a href="${taskHref(one.id)}" class="mono">${one.id}</a>` : html `<span class="mono">${one.id}</span>`}${one.state === null ? "" : html ` <span class="badge badge-${one.state}">${sentenceCase(one.state)}</span>`}${postForm(`${taskHref(task.id)}/unblock`, html `<button type="submit">Don't wait for this</button>`, { attrs: { class: "inline" }, hidden: { on: one.id } })}</p>`), "\n");
|
|
2082
1733
|
const waitAdd = data.csrf === "" || candidates.length === 0
|
|
2083
1734
|
? ""
|
|
2084
1735
|
: postForm(`${taskHref(task.id)}/block`, html `<select name="on" aria-label="task to wait for">${candidates.map(one => html `<option value="${one.id}">${one.id} — ${one.title}</option>`)}</select><button type="submit">Wait for this task</button><span class="meta"> — this task starts only after it finishes</span>`, { attrs: { class: "row" } });
|
|
2085
|
-
const waitsForCard = waitRows === "" && waitAdd === ""
|
|
1736
|
+
const waitsForCard = task.state === "done" || task.state === "cancelled" || (waitRows === "" && waitAdd === "")
|
|
2086
1737
|
? ""
|
|
2087
1738
|
: html `<h2>Waits for</h2>${waitRows === "" ? html `<p class="meta">Nothing. It starts when a builder is free.</p>` : waitRows}${waitAdd}`;
|
|
2088
|
-
// The acts bar (task page pass): every verb in one row under the title,
|
|
2089
|
-
// the one that resolves this task's state first and primary — retry on a
|
|
2090
|
-
// stalled task, build-next in the queue, plan-first with no scope. The
|
|
2091
|
-
// hold's reason sits beside its button; cancel stays armed at the foot,
|
|
2092
|
-
// far from the primary. A live claim is never disturbed by an operator
|
|
2093
|
-
// hold (the hold governs the NEXT start), and requeue refuses while a
|
|
2094
|
-
// claim is live — so the words say exactly when each becomes real.
|
|
2095
1739
|
const canPlan = data.plan === null && !approval.approved && !data.claimed && task.state === "queued" && (data.coordinator === null || data.coordinator === undefined);
|
|
2096
|
-
// A failed task's status card carries Retry itself (the same requeue); here it would be a second ink act.
|
|
2097
1740
|
const cardRetries = task.state === "failed" && data.assignment != null && data.csrf !== "";
|
|
2098
1741
|
const primaryAct = stopControlsActive || cardRetries ? null : stalled && !data.claimed
|
|
2099
|
-
? { html: act("requeue", "Retry, keeping the branch and workspace"), why: "Clears the repeated failures and queues the task again. The branch and workspace are kept.", whyClass: "retry" }
|
|
1742
|
+
? { html: act("requeue", "Retry, keeping the branch and workspace", data.retryPins == null ? {} : { run: String(data.retryPins.run), digest: data.retryPins.digest }), why: "Clears the repeated failures and queues the task again. The branch and workspace are kept.", whyClass: "retry" }
|
|
2100
1743
|
: canPlan
|
|
2101
|
-
? { html: act("plan", "plan first"), why: "plan first sends an agent to read the project, ask you questions and propose a plan. Nothing builds until you approve it.", whyClass: "plan" }
|
|
1744
|
+
? { html: act("plan", "plan first", data.planSource == null ? {} : { source: data.planSource }), why: "plan first sends an agent to read the project, ask you questions and propose a plan. Nothing builds until you approve it.", whyClass: "plan" }
|
|
2102
1745
|
: data.plan === "requested"
|
|
2103
1746
|
? null
|
|
2104
1747
|
: task.state === "queued" && !data.claimed && (data.position?.position ?? 1) > 1
|
|
@@ -2108,17 +1751,12 @@ export function taskBodyParts(data) {
|
|
|
2108
1751
|
const canHold = task.state === "queued" || task.state === "running" || task.state === "failed";
|
|
2109
1752
|
const actsBar = joinHtml([
|
|
2110
1753
|
html `<span id="task-actions"></span><div class="acts-bar">`,
|
|
2111
|
-
// While a ceremony leads the page, no other act competes as primary.
|
|
2112
1754
|
primaryAct === null ? "" : approveForm === "" ? html `<span class="primary">${primaryAct.html}</span>` : primaryAct.html,
|
|
2113
1755
|
task.state === "queued" && (data.position?.position ?? 2) === 1 && task.priority > 0
|
|
2114
1756
|
? act("next", "back to filing order", { undo: "1" })
|
|
2115
1757
|
: "",
|
|
2116
|
-
// A task with no scope is already unable to start. Showing a hold next
|
|
2117
|
-
// to "plan first" adds a second, unnecessary decision at the exact
|
|
2118
|
-
// moment the page should have one obvious action.
|
|
2119
1758
|
stopControlsActive || canPlan || !canHold ? "" : holdAct,
|
|
2120
1759
|
data.holds.some(hold => hold.ownerKind === "operator") ? act("unhold", "Remove hold")
|
|
2121
|
-
// The storage check couldn't finish (dispose.ts holdForStorage): one tap tries again now.
|
|
2122
1760
|
: data.holds.some(hold => hold.ownerKind === "backoff" && hold.ownerId === `storage:${hold.taskRef}`) ? act("unhold", "Try again") : "",
|
|
2123
1761
|
html `</div>`,
|
|
2124
1762
|
primaryAct === null ? "" : html `<p class="meta acts-why acts-why-${primaryAct.whyClass}">${primaryAct.why}</p>`,
|
|
@@ -2126,8 +1764,6 @@ export function taskBodyParts(data) {
|
|
|
2126
1764
|
? html `<p class="meta acts-why">a worker is building this right now — <em>Hold the next attempt</em> stops the one after it; cancel waits for the current build to finish${stalled ? "; retry becomes available after this attempt finishes" : ""}</p>`
|
|
2127
1765
|
: "",
|
|
2128
1766
|
], "\n");
|
|
2129
|
-
// Cancel gets the same ceremony as an irreversible answer: armed behind
|
|
2130
|
-
// one deliberate tap, styled as the destructive act it is.
|
|
2131
1767
|
const cancelForm = task.state === "queued" || task.state === "running" || task.state === "failed"
|
|
2132
1768
|
? postForm(`${taskHref(task.id)}/cancel`, joinHtml([
|
|
2133
1769
|
data.coordinator == null ? "" : html `<label>Reason for cancellation<textarea name="reason" rows="3" maxlength="500" required>${data.cancelDraft ?? ""}</textarea></label>`,
|
|
@@ -2135,23 +1771,17 @@ export function taskBodyParts(data) {
|
|
|
2135
1771
|
]))
|
|
2136
1772
|
: "";
|
|
2137
1773
|
const cancelAct = cancelForm === "" ? "" : html `<details class="arm-danger"${data.cancelDraft === undefined ? "" : html ` open`}><summary>Cancel task</summary>${cancelForm}</details>`;
|
|
2138
|
-
// Long sections fold, each with its count in the header: what needs
|
|
2139
|
-
// reading stays open; a ledger or a form folds until asked. The rebuilt
|
|
2140
|
-
// page receives the same bodies, so its folds carry the same forms.
|
|
2141
1774
|
const sectionParts = [];
|
|
2142
1775
|
const section = (title, body, open, count, id = title.replace(/\s+/g, "-")) => {
|
|
2143
1776
|
if (body === "" || isEmptyHtml(body))
|
|
2144
1777
|
return "";
|
|
2145
1778
|
const heading = sentenceCase(title);
|
|
2146
|
-
// The section's own heading moves into its summary.
|
|
2147
1779
|
const once = (fragment, words) => replaceMarkup(fragment, new RegExp(htmlString(html `<h2>${words}</h2>`).replace(/[.*+?^${}()|[\]\\]/g, "\\$&")), () => html ``);
|
|
2148
1780
|
const inner = once(once(body, title), heading);
|
|
2149
1781
|
sectionParts.push({ id, title: heading, html: htmlString(inner), open, count: count ?? null });
|
|
2150
1782
|
return html `<details class="section" id="${id}"${open ? html ` open` : ""}><summary><h2>${heading}${count === undefined ? "" : html ` <span class="lane-count">${count}</span>`}</h2></summary>${inner}</details>`;
|
|
2151
1783
|
};
|
|
2152
1784
|
const receiptLeads = data.assignment == null && task.state === "done" && data.completion?.receipt != null;
|
|
2153
|
-
// Exact identity stays available in Task options; failures stay in the
|
|
2154
|
-
// status and property rail, and approval provenance stays in the ceremony.
|
|
2155
1785
|
const identity = html `<p class="meta task-identity">Task ID <span class="mono">${task.id}</span>${data.rootTitle !== undefined && data.rootTitle !== task.title ? ` · Execution: ${task.title}` : ""}${data.repo === null ? "" : ` · ${projectName(data.repo)}`}${data.coordinator !== null && data.coordinator !== undefined
|
|
2156
1786
|
? html ` · filed by <span class="mono">${data.coordinator.label}</span>${data.coordinator.filedAgo === null ? "" : ` ${data.coordinator.filedAgo}`}`
|
|
2157
1787
|
: data.origin != null
|
|
@@ -2159,28 +1789,18 @@ export function taskBodyParts(data) {
|
|
|
2159
1789
|
: data.filedVia === null || data.filedVia === undefined
|
|
2160
1790
|
? ""
|
|
2161
1791
|
: ` · filed via ${data.filedVia}`}${data.deliverable === "report" ? html ` · <span class="badge">Research</span>` : ""}</p>`;
|
|
2162
|
-
// A pull request that can be merged (or opened) owns the one primary action; the result stays in its section.
|
|
2163
1792
|
const pullRequestActs = data.csrf !== "" && (data.pullRequest?.view?.canMerge === true || (data.pullRequest?.view == null && data.pullRequest?.offer != null));
|
|
2164
1793
|
const pullRequestFact = data.pullRequest?.fact != null && data.pullRequest.view?.runId === data.assignment?.receipt?.runId ? data.pullRequest.fact : undefined;
|
|
2165
1794
|
const assignmentOptions = data.assignment == null ? null : { workStatus: status, hideAction: (approveForm !== "" && approvalLeads) || pullRequestActs, problem: status.tone === "problem",
|
|
2166
1795
|
planning: data.dispatch?.code === "running" && data.dispatch.role === "planner", ...(pullRequestFact === undefined ? {} : { pullRequest: pullRequestFact }),
|
|
2167
1796
|
diagnostics: [...(status.diagnostics ?? []), ...(status.tone === "problem" && status.detail !== data.assignment.detail ? [status] : [])] };
|
|
2168
|
-
// Say it once: a pull request that couldn't open, or merged, is the status
|
|
2169
|
-
// card's own row (its reason or merge commit under Details), not a second card.
|
|
2170
1797
|
const pullRequestCard = data.pullRequest == null || (pullRequestFact !== undefined && (data.pullRequest.view?.state === "failed" || data.pullRequest.view?.state === "merged")) ? "" : pullRequestCardHtml(data.pullRequest, data.csrf);
|
|
2171
|
-
// The result takes over from the task status as soon as it is ready.
|
|
2172
1798
|
const statusHtml = html `${data.assignment != null && assignmentOptions !== null ? assignmentSummaryHtml(data.assignment, assignmentOptions) : receiptLeads ? completionReceiptCard(data.completion.receipt, task.id, "task", status) : taskStatusCard(status, task.id, data.dispatch ?? null, liveRunId, approveForm !== "" && approvalLeads)}${checkProgressHtml(data.checkProgress ?? null)}`;
|
|
2173
|
-
// The exact-run control (v52), directly under the scheduler's answer:
|
|
2174
|
-
// the one place a person stops or resumes THIS attempt.
|
|
2175
1799
|
const controlHtml = taskControlDetailsHtml(data.control ?? { kind: "none" }, task.id, data.csrf, "task", false, false, data.livePause ?? null);
|
|
2176
1800
|
const previousResult = data.completion?.receipt == null || receiptLeads ? null : {
|
|
2177
1801
|
title: data.assignment != null && task.state === "done" ? "Result" : "Previous result",
|
|
2178
1802
|
html: (completionReceiptCard(data.completion.receipt, task.id, "task", data.assignment == null ? receiptStatusOf(data.completion.receipt) : assignmentStatusOf(data.assignment), data.assignment ?? null, data.assignment == null)),
|
|
2179
1803
|
};
|
|
2180
|
-
// External work wears its tracker on the page: the link, the last
|
|
2181
|
-
// observed state, and — when the tracker closed it and has been seen
|
|
2182
|
-
// open again — the authenticated reopen act. Done + closed is display
|
|
2183
|
-
// only: completed here stays completed.
|
|
2184
1804
|
const mirrorCard = (() => {
|
|
2185
1805
|
const mirror = data.mirror ?? null;
|
|
2186
1806
|
if (mirror === null)
|
|
@@ -2208,14 +1828,8 @@ export function taskBodyParts(data) {
|
|
|
2208
1828
|
]);
|
|
2209
1829
|
})();
|
|
2210
1830
|
const problemHtml = data.problem === null || data.scopeDraft !== undefined ? "" : html `<div class="problem">${data.problem}</div>`;
|
|
2211
|
-
// The board sent them here saying "needs you" — the page must open by
|
|
2212
|
-
// saying WHY and pointing at the act, not read as a fact sheet
|
|
2213
|
-
// (operator finding: clicking a needs-you card landed with no context).
|
|
2214
1831
|
const needsScopeCard = scope === null && data.plan === null && task.state === "queued" && data.dispatch?.code !== "needs-scope" && data.dispatch?.code !== "waiting-dependency" && !dependencyChoiceNeeded
|
|
2215
1832
|
? data.coordinator !== null && data.coordinator !== undefined
|
|
2216
|
-
// The quarantine speaks here too (round-2 finding 5): the planner
|
|
2217
|
-
// is as fenced as the builder on a coordinator filing, so "plan
|
|
2218
|
-
// first" would recommend a road that refuses.
|
|
2219
1833
|
? html `<div class="card"><p><strong>This task is waiting on you: an agent filed it, and it has no plan.</strong></p><p class="meta">Filed by <span class="mono">${data.coordinator.label}</span> — nothing plans or runs until you write a plan below and approve it. Your approval runs their request.</p></div>`
|
|
2220
1834
|
: html `<div class="card task-scope-needed"><p><strong>No approved plan yet</strong></p><p class="meta"><strong>Plan first</strong> drafts it from the repository, or <a href="#scope">write it yourself</a>.</p></div>`
|
|
2221
1835
|
: "";
|
|
@@ -2224,17 +1838,13 @@ export function taskBodyParts(data) {
|
|
|
2224
1838
|
: html `<details class="task-secondary-approval"><summary>Updated approval terms</summary>${approveForm}</details>`;
|
|
2225
1839
|
const optionsHtml = html `${identity}${dispatchStatus}${dependencyChoiceNeeded ? "" : actsBar}`;
|
|
2226
1840
|
const optionsOpen = data.assignment?.primaryAction?.code === "unhold" || data.assignment?.primaryAction?.code === "retry-task";
|
|
2227
|
-
|
|
2228
|
-
const scopeRest = [releaseCardHtml(task.id, data.release ?? null, data.canStopRelease === true), html `<p class="meta">${data.repo !== null && data.scope !== null ? html `<a href="/recipes/from-task?task=${encodeURIComponent(task.id)}">Reuse this plan as a recipe →</a> · ` : ""}<a href="${taskHref(data.rootId ?? task.id)}/evidence">Audit record →</a></p>`, agentsCardHtml(task.id, data.route, data.canEditRoute === true), revisionInApproval ? "" : revisionCard, data.completion != null ? "" : repairChainHtml(data.repairChain ?? null), scopeForm];
|
|
2229
|
-
// The page's sections, built once and in order (each `section` also records its part for the rebuilt page).
|
|
1841
|
+
const scopeRest = [releaseCardHtml(task.id, data.release ?? null, data.canStopRelease === true), html `<p class="meta">${data.repo !== null && data.scope !== null ? html `<a href="/recipes/from-task?task=${encodeURIComponent(task.id)}">Reuse this plan as a recipe →</a> · ` : ""}<a href="${taskHref(data.rootId ?? task.id)}/evidence">Audit record →</a></p>`, agentsCardHtml(task.id, agentlessRoute(data.dispatch ?? null, data.route) ? null : data.route, data.canEditRoute === true), revisionInApproval ? "" : revisionCard, data.completion != null ? "" : repairChainHtml(data.repairChain ?? null), scopeForm];
|
|
2230
1842
|
const layoutTail = joinHtml([
|
|
2231
1843
|
html `<div class="task-layout"><div class="task-main">`,
|
|
2232
1844
|
attemptPanel,
|
|
2233
1845
|
data.coordinatorProposals == null || data.coordinatorProposals.rows.length === 0
|
|
2234
1846
|
? ""
|
|
2235
|
-
: section("proposals",
|
|
2236
|
-
// Confirm and dismiss come back to this task.
|
|
2237
|
-
html `<h2>Proposed by your lead</h2>${coordinatorProposalsSection(data.coordinatorProposals.rows, data.coordinatorProposals.decisions, data.coordinatorProposals.now, false, taskHref(data.task.id))}`, true, data.coordinatorProposals.rows.length),
|
|
1847
|
+
: section("proposals", html `<h2>Proposed by your lead</h2>${coordinatorProposalsSection(data.coordinatorProposals.rows, data.coordinatorProposals.decisions, data.coordinatorProposals.now, false, taskHref(data.task.id))}`, true, data.coordinatorProposals.rows.length),
|
|
2238
1848
|
section("decisions", decisions, true, data.decisions.length),
|
|
2239
1849
|
section("repeated failures", incidents, true, data.incidents.length, "incidents"),
|
|
2240
1850
|
data.publication === null || data.publication === undefined
|
|
@@ -2250,26 +1860,19 @@ export function taskBodyParts(data) {
|
|
|
2250
1860
|
data.followThrough == null ? "" : section("failed checks", data.followThrough.repairs, true),
|
|
2251
1861
|
data.followThrough == null ? "" : section("before and after", data.followThrough.evidence, false),
|
|
2252
1862
|
data.followThrough == null ? "" : section("handover note", data.followThrough.handover, false),
|
|
2253
|
-
section("plan",
|
|
2254
|
-
// The recipe road rides with the scope it reuses (UI polish
|
|
2255
|
-
// 2026-09-13), off the title-to-action path.
|
|
2256
|
-
joinHtml([html `<h2>Plan</h2>`, scopeCard, ...scopeRest], "\n"), scopeDraft !== undefined || (data.plan !== "requested" && approveForm === "" && !(scope === null && canPlan)), undefined, "scope"),
|
|
1863
|
+
section("plan", joinHtml([html `<h2>Plan</h2>`, scopeCard, ...scopeRest], "\n"), scopeDraft !== undefined || (data.plan !== "requested" && approveForm === "" && !(scope === null && canPlan)), undefined, "scope"),
|
|
2257
1864
|
dependencyChoiceNeeded ? "" : section("waits for", waitsForCard, (data.waitsFor ?? []).length > 0, (data.waitsFor ?? []).length),
|
|
2258
1865
|
section("holds", holds, true, data.holds.length),
|
|
2259
1866
|
cancelAct,
|
|
2260
1867
|
html `</div><aside class="task-rail">${rail}</aside></div>`,
|
|
2261
1868
|
], "\n");
|
|
2262
|
-
// `rows`: the task's step rows, every one open (the page without script, docs/plans/task-page-steps.md): the status,
|
|
2263
|
-
// the approval, the plan, the build's progress and the previous result move into their rows; everything else stays.
|
|
2264
1869
|
const nativeBody = (rows) => joinHtml([
|
|
2265
|
-
// The title is bare; the receipt or shared task status leads once.
|
|
2266
1870
|
html `<div class="task-title-row"><h1 class="task-main-title">${data.rootTitle ?? task.title}</h1>${data.csrf === "" ? "" : taskViewSwitch(data.rootId ?? task.id, "overview")}</div>`,
|
|
2267
1871
|
data.versionLabel == null ? "" : html `<p class="meta">${data.versionLabel} · <a href="${taskHref(data.rootId ?? task.id)}">Current work</a></p>`,
|
|
2268
1872
|
data.archived == null ? "" : html `<div class="task-archived" data-archived><p>${archivedWords(data.archived)} · ${whenUtc(data.archived.at)}</p>${data.canPutAway === true && data.csrf !== ""
|
|
2269
1873
|
? postForm(`${taskHref(task.id)}/restore`, html `<button type="submit" class="secondary">Restore</button>`, { hidden: { return: taskHref(task.id) }, attrs: { class: "inline" } }) : ""}</div>`,
|
|
2270
1874
|
(data.history ?? ""),
|
|
2271
1875
|
rows ?? "",
|
|
2272
|
-
// A put-away task's banner is its status: no Needs you card, no act, no approval form (each would be refused).
|
|
2273
1876
|
rows === null && data.archived == null ? statusHtml : "",
|
|
2274
1877
|
rows === null ? controlHtml : "",
|
|
2275
1878
|
rows !== null || previousResult === null ? "" : html `<details class="task-previous-result"><summary>${previousResult.title}</summary>${previousResult.html}</details>`,
|
|
@@ -2281,16 +1884,8 @@ export function taskBodyParts(data) {
|
|
|
2281
1884
|
needsScopeCard,
|
|
2282
1885
|
rows === null && data.archived == null ? approvalHtml : "",
|
|
2283
1886
|
html `<details class="task-status-details" id="task-diagnostics"${optionsOpen ? html ` open` : ""}><summary>Task options</summary>${optionsHtml}</details>`,
|
|
2284
|
-
// Evidence-first (M5.5): what needs you, then what happened — decisions
|
|
2285
|
-
// and incidents above the attempt ledger and spend, the mechanics
|
|
2286
|
-
// (scope, holds, acts) after. Only trustworthy facts moved up. The rail
|
|
2287
|
-
// (slice 1c) rides beside the main column on wide screens and above it
|
|
2288
|
-
// on narrow ones.
|
|
2289
1887
|
layoutTail,
|
|
2290
1888
|
], "\n");
|
|
2291
|
-
// Console v2: one thread in time order (the plan, the agent's notes and
|
|
2292
|
-
// results, its questions, the person's replies) and the metadata grouped
|
|
2293
|
-
// for a Details panel. Every form below keeps its own route and fields.
|
|
2294
1889
|
const familyRuns = data.family?.runs ?? data.runs.map(run => ({ ...run, taskId: task.id }));
|
|
2295
1890
|
const versionLabelOf = (taskId) => {
|
|
2296
1891
|
const index = data.family?.versions.findIndex(one => one.id === taskId) ?? -1;
|
|
@@ -2302,13 +1897,8 @@ export function taskBodyParts(data) {
|
|
|
2302
1897
|
thread.push({ key: "filed", at: rootFiled, kind: "filed", who: "person", author: filedBy ?? "", title: "Filed the task",
|
|
2303
1898
|
text: (() => { const goal = data.family?.root.goal ?? scope?.goal ?? null; return goal === null ? null : oneLineOf(goal, 280); })(), link: null, html: "", more: null });
|
|
2304
1899
|
const newestBuilt = familyRuns.filter(run => run.outcome === "built" && run.role !== "planner" && run.role !== "reviewer").sort((a, b) => b.id - a.id)[0];
|
|
2305
|
-
// Failed: the card says what went wrong in one line, and its one act is Retry itself (the same requeue), never a link to
|
|
2306
|
-
// this page; someone who can't retry here (a viewer, a live claim) gets no act at all.
|
|
2307
1900
|
const statusCard = data.assignment != null && assignmentOptions !== null ? assignmentCardOf(data.assignment, assignmentOptions) : null;
|
|
2308
|
-
// A live build says which step it is on, or which step it is stuck on and why.
|
|
2309
1901
|
const building = statusCard?.status.headline === "Building" && liveRun !== undefined && liveRun.role !== "planner" && liveRun.role !== "reviewer";
|
|
2310
|
-
// While a build runs, the attempts that stopped before it fold into one quiet line under its Building card. Only
|
|
2311
|
-
// there: with any other card (or none) they stay in the thread, never vanish.
|
|
2312
1902
|
const earlierStopped = !building ? []
|
|
2313
1903
|
: familyRuns.filter(run => run.id < liveRun.id && (run.role === "builder" || run.role === "scout") && run.outcome !== "built" && run.outcome !== "no-change" && run.id !== liveHistoryRunId);
|
|
2314
1904
|
const foldedAttempts = new Set(earlierStopped.map(run => run.id));
|
|
@@ -2342,22 +1932,17 @@ export function taskBodyParts(data) {
|
|
|
2342
1932
|
link: href, html: "",
|
|
2343
1933
|
more: previousResult !== null && run.id === newestBuilt?.id && run.taskId === task.id ? { summary: STATUS_MORE, html: htmlString(previousResult.html) } : null });
|
|
2344
1934
|
}
|
|
2345
|
-
// What the agent is working through now, and how its plan changed.
|
|
2346
1935
|
const liveAt = liveRun?.startedAt ?? task.updatedAt;
|
|
2347
|
-
// The plan itself is the page's Plan row: the thread keeps one line saying it was written.
|
|
2348
1936
|
if (planCard !== "")
|
|
2349
1937
|
thread.push({ key: "plan", at: familyRuns.filter(run => run.role === "planner").map(run => run.finishedAt ?? run.startedAt).sort().at(-1) ?? task.updatedAt,
|
|
2350
1938
|
kind: "plan", who: "agent", author: "", title: data.planDocument !== null ? "Plan written" : data.revision != null && !("problem" in data.revision) ? "Updating the plan" : "Planning", text: null, link: null, html: "", more: null });
|
|
2351
1939
|
if (!isEmptyHtml(progressCard))
|
|
2352
1940
|
thread.push({ key: "progress", at: liveAt, kind: "progress", who: "agent", author: "", title: "Progress", text: null, link: null, html: htmlString(progressCard), more: null });
|
|
2353
|
-
// A plan change is decided on the page (the Build row holds its card): the thread, which the work panel shows, keeps
|
|
2354
|
-
// one line and a link there. Nothing in the thread takes a decision.
|
|
2355
1941
|
if (!isEmptyHtml(revisionLedgerCard)) {
|
|
2356
1942
|
const waiting = data.planRevisions?.pending ?? null;
|
|
2357
1943
|
thread.push({ key: "plan-revisions", at: liveAt, kind: "progress", who: "agent", author: "", title: waiting === null ? "Plan changes" : "Recommends a plan change",
|
|
2358
1944
|
text: waiting === null ? null : oneLineOf(waiting.reason, 280), link: { label: waiting === null ? "See the plan changes" : "Decide on the task page", href: "#plan-revisions" }, html: "", more: null });
|
|
2359
1945
|
}
|
|
2360
|
-
// The change a person asked for: the revision's own brief.
|
|
2361
1946
|
if (data.revision != null && !("problem" in data.revision)) {
|
|
2362
1947
|
const feedback = data.revision;
|
|
2363
1948
|
thread.push({ key: "revision", at: task.createdAt, kind: "reply", who: "person", author: feedback.comments[0]?.author ?? "You",
|
|
@@ -2380,8 +1965,6 @@ export function taskBodyParts(data) {
|
|
|
2380
1965
|
text: [chosen, decision.note].filter((one) => one !== null && one !== "").join(" — ") || null, link: null, html: "", more: null });
|
|
2381
1966
|
}
|
|
2382
1967
|
}
|
|
2383
|
-
// Open questions are answered on the page (their cards sit in the step that waits, at #task-questions): the thread
|
|
2384
|
-
// says what was asked and links there.
|
|
2385
1968
|
if (decisionRail !== "")
|
|
2386
1969
|
thread.push({ key: "questions", at: openDecisions.map(one => one.createdAt).sort()[0] ?? task.updatedAt, kind: "question", who: "agent", author: "",
|
|
2387
1970
|
title: openDecisions.length === 1 ? "Asked you a question" : `Asked you ${openDecisions.length} questions`, text: openDecisions.map(one => oneLineOf(one.question, 280)).join("\n"),
|
|
@@ -2390,10 +1973,8 @@ export function taskBodyParts(data) {
|
|
|
2390
1973
|
thread.push({ key: `steer-${note.id}`, at: note.createdAt, kind: "reply", who: "person", author: note.author, title: "Note to the agent", text: note.note, link: null, html: "", more: null });
|
|
2391
1974
|
}
|
|
2392
1975
|
thread.sort((a, b) => a.at === b.at ? 0 : a.at < b.at ? -1 : 1);
|
|
2393
|
-
// The Details panel: the same facts, grouped and said once.
|
|
2394
1976
|
const lastRunForAgent = liveRun ?? familyRuns.filter(run => run.role !== "reviewer").sort((a, b) => b.id - a.id)[0];
|
|
2395
1977
|
const work = [];
|
|
2396
|
-
// A put-away task's one status is Archived (its banner says by whom and why).
|
|
2397
1978
|
work.push({ label: "Status", parts: [data.archived != null ? "Archived" : data.assignment != null && assignmentOptions !== null ? assignmentCardOf(data.assignment, assignmentOptions).status.headline : status.label] });
|
|
2398
1979
|
if (data.repo !== null)
|
|
2399
1980
|
work.push({ label: "Project", parts: [projectName(data.repo)] });
|
|
@@ -2436,7 +2017,6 @@ export function taskBodyParts(data) {
|
|
|
2436
2017
|
const about = [];
|
|
2437
2018
|
const filedFact = facts.find(one => one.label === "Filed by");
|
|
2438
2019
|
about.push(filedFact ?? { label: "Filed by", parts: [filedBy ?? (data.origin != null ? "An automation" : data.filedVia == null ? "Not recorded" : `via ${data.filedVia}`)] });
|
|
2439
|
-
// v126: where it came from — the flow (linked only for those who can see it) and the outside event, with its host.
|
|
2440
2020
|
if (data.origin != null)
|
|
2441
2021
|
about.push({ label: "From", parts: originParts(data.origin) });
|
|
2442
2022
|
about.push({ label: "Filed", parts: [{ at: rootFiled }] });
|
|
@@ -2449,12 +2029,9 @@ export function taskBodyParts(data) {
|
|
|
2449
2029
|
const details = [
|
|
2450
2030
|
{ title: "Work", facts: work }, { title: "Links", facts: links }, { title: "Review", facts: review }, { title: "About", facts: about },
|
|
2451
2031
|
];
|
|
2452
|
-
// The rebuilt page (shadcn/ui): the same parts in a calmer order — what
|
|
2453
|
-
// needs a person, then facts, then folds; the mechanics under Manage.
|
|
2454
2032
|
const MANAGE = new Set(["steering", "waits-for", "holds"]);
|
|
2455
2033
|
const finished = task.state === "done" || task.state === "cancelled";
|
|
2456
2034
|
const failedCard = statusCard?.status.headline === "Failed";
|
|
2457
|
-
// A link to this very page, with no section to open, goes nowhere: a card never offers one.
|
|
2458
2035
|
const bareSelfLink = (href) => {
|
|
2459
2036
|
if (href.includes("#"))
|
|
2460
2037
|
return false;
|
|
@@ -2462,14 +2039,11 @@ export function taskBodyParts(data) {
|
|
|
2462
2039
|
const version = new URLSearchParams(query).get("version");
|
|
2463
2040
|
return [data.assignment?.rootId, data.rootId, task.id].some(id => id != null && path === `/t/${encodeURIComponent(id)}`) && (version === null || version === task.id);
|
|
2464
2041
|
};
|
|
2465
|
-
// Build again, in place, names its form after the card's own act.
|
|
2466
2042
|
const rebuild = data.csrf !== "" && data.assignment?.primaryAction?.code === "retry-task" && data.assignment.need != null && "key" in data.assignment.need && data.assignment.need.key === "rebuild"
|
|
2467
|
-
? { action: `${taskHref(data.assignment.rootId)}/requeue
|
|
2043
|
+
? { action: `${taskHref(data.assignment.rootId)}/requeue`, pins: data.retryPins ?? null } : null;
|
|
2468
2044
|
const retry = failedCard && task.state === "failed" && !data.claimed && !stopControlsActive && data.csrf !== ""
|
|
2469
|
-
? { action: `${taskHref(task.id)}/requeue`, ...(data.failure == null ? {} : { note: retryNoteOf(data.failure.suggestion) }) } : null;
|
|
2470
|
-
// Run checks happens in place: a status row's Run checks posts here and comes back; with nothing to run, the row offers nothing.
|
|
2045
|
+
? { action: `${taskHref(task.id)}/requeue`, pins: data.retryPins ?? null, ...(data.failure == null ? {} : { note: retryNoteOf(data.failure.suggestion) }) } : null;
|
|
2471
2046
|
const runChecks = data.runChecks ?? null;
|
|
2472
|
-
// A row's link to a result in Chat opens that result's own page instead: Chat would only lead back here.
|
|
2473
2047
|
const resultPageOf = (href) => {
|
|
2474
2048
|
const chat = href === null ? null : /^\/chat\?task=([A-Za-z0-9._~%-]{1,200})&result=([0-9]{1,15})(?:&tab=(changes|checks))?(#[A-Za-z0-9_-]{1,80})?$/.exec(href);
|
|
2475
2049
|
return chat === null ? href : `/review?result=${chat[1]}&run=${chat[2]}${chat[3] === undefined ? "" : `&tab=${chat[3]}`}${chat[4] ?? ""}`;
|
|
@@ -2482,23 +2056,17 @@ export function taskBodyParts(data) {
|
|
|
2482
2056
|
const steps = building ? buildProgressOf(data.milestoneProgress ?? null) : null;
|
|
2483
2057
|
const progress = steps === null ? null : { line: steps.line,
|
|
2484
2058
|
stuck: steps.stuck === null ? null : { ...steps.stuck, action: data.csrf === "" ? null : { label: "Send the agent a note", href: "#steering" } } };
|
|
2485
|
-
// The Building card carries Stop for the build it describes (the same form), in place of a second card below it.
|
|
2486
2059
|
const stop = building && data.control?.kind === "stop" && data.control.run === liveRun.id && data.csrf !== ""
|
|
2487
2060
|
? { action: `${taskHref(task.id)}/stop`, run: data.control.run } : null;
|
|
2488
|
-
// Pause and Pause and steer sit beside that Stop, for the same run, when it is a Claude build that takes live input.
|
|
2489
|
-
// Each form carries its own request id, so a repeated submit is the same request and the two never collide.
|
|
2490
2061
|
const pause = stop !== null && data.livePause?.run === stop.run
|
|
2491
2062
|
? { action: `${taskHref(task.id)}/pause`, run: stop.run, state: data.livePause.state, requests: [`web-${randomUUID()}`, `web-${randomUUID()}`, `web-${randomUUID()}`],
|
|
2492
2063
|
until: data.livePause.until ?? null, limitMs: data.livePause.limitMs ?? null } : null;
|
|
2493
|
-
// The Building card keeps its way to the build's own record (/r/<id>), whatever act it shows.
|
|
2494
2064
|
const record = building ? { label: `Build #${liveRun.id} record`, href: `/r/${liveRun.id}` } : null;
|
|
2495
2065
|
const earlier = earlierStopped.length === 0 ? null : {
|
|
2496
2066
|
summary: earlierAttemptsWords(earlierStopped.length),
|
|
2497
2067
|
attempts: [...earlierStopped].sort((a, b) => a.id - b.id).map(run => ({ label: `${runNoun(run)[0].toUpperCase()}${runNoun(run).slice(1)} #${run.id}`, href: `/r/${run.id}`,
|
|
2498
2068
|
text: run.outcome === null ? "Never finished." : run.outcome === "failed" ? failedAttemptSentence(run.reason) : run.reason === null ? null : (words => `${words.charAt(0).toUpperCase()}${words.slice(1)}.`)(reasonWords(run.reason)) })),
|
|
2499
2069
|
};
|
|
2500
|
-
// ⋯ More actions (docs/plans/one-page-task-and-agent.md): each secondary act once, in one place — Work, Share & reuse,
|
|
2501
|
-
// then Danger last. A ceremony is never cloned here: its item goes to the tab that holds its one form.
|
|
2502
2070
|
const sectionIds = new Set(sectionParts.map(one => one.id));
|
|
2503
2071
|
const rootOf = data.rootId ?? task.id;
|
|
2504
2072
|
const more = [
|
|
@@ -2511,9 +2079,6 @@ export function taskBodyParts(data) {
|
|
|
2511
2079
|
{ group: "share", label: "Copy link", kind: "copy" },
|
|
2512
2080
|
...(cancelForm !== "" ? [{ group: "danger", label: "Cancel task", kind: "goto", tab: "plan", target: "cancel-task" }] : []),
|
|
2513
2081
|
];
|
|
2514
|
-
// The Plan row (docs/plans/task-page-steps.md): the plan sheet of the terms on file, built from the same parts as
|
|
2515
|
-
// the approval's (approvalSheetParts), and the plan's own editor. While the approval waits here the sheet is the
|
|
2516
|
-
// approval's own (`approve.planHtml`), so this row carries only the editor: the plan is shown once.
|
|
2517
2082
|
const plannerRun = familyRuns.filter(run => run.role === "planner" && run.outcome !== null).sort((a, b) => b.id - a.id)[0];
|
|
2518
2083
|
const sheetShown = scope === null ? null : sheetInput ?? {
|
|
2519
2084
|
surface: "task", action: "", csrf: "", nonce: "", digest: scope.digest, returnTo: null, scope,
|
|
@@ -2526,7 +2091,6 @@ export function taskBodyParts(data) {
|
|
|
2526
2091
|
};
|
|
2527
2092
|
const sheetParts = sheetShown === null ? null : approvalSheetParts(sheetShown);
|
|
2528
2093
|
const approvalWaitsHere = data.archived == null && sheetInput !== null && !dependencyChoiceNeeded && data.csrf !== "";
|
|
2529
|
-
// A revision's plan being updated with the notes: the planner's card says so above the plan it starts from.
|
|
2530
2094
|
const planUpdating = data.planDocument === null && data.plan === "requested" && data.revision != null && !("problem" in data.revision) && planCard !== "";
|
|
2531
2095
|
const planView = scope === null
|
|
2532
2096
|
? (planCard === "" ? null : { lead: null, by: null, at: null, html: htmlString(planCard), planning: data.plan === "requested", updating: planUpdating, key: "card" })
|
|
@@ -2556,14 +2120,9 @@ export function taskBodyParts(data) {
|
|
|
2556
2120
|
runChecks,
|
|
2557
2121
|
progress: progress === null ? null : { ...progress, steps: (data.milestoneProgress ?? []).map(one => ({ title: one.description, state: one.state })) },
|
|
2558
2122
|
plan: planView,
|
|
2559
|
-
// One quiet line under the step: what the agent did last, and when.
|
|
2560
2123
|
activity: liveRun === undefined ? null : data.activity ?? null,
|
|
2561
|
-
// The work panel's run: the live build, else this version's latest build or report. Its records are read through the
|
|
2562
|
-
// run page's own guarded window; a page asking for a password names no window at all.
|
|
2563
2124
|
work: (() => {
|
|
2564
2125
|
const recorded = (run) => run.role === "builder" || run.role === "scout";
|
|
2565
|
-
// Running: unfinished under the task's current claim (liveRun is the one run proved live; a builder whose repair
|
|
2566
|
-
// child is the live run shares that claim and is still this attempt).
|
|
2567
2126
|
const running = (run) => liveRun !== undefined && run.outcome === null && run.finishedAt === null && run.leaseId === liveRun.leaseId;
|
|
2568
2127
|
const builds = data.runs.filter(recorded).sort((a, b) => b.id - a.id);
|
|
2569
2128
|
const run = builds.find(running) ?? builds[0];
|
|
@@ -2580,7 +2139,6 @@ export function taskBodyParts(data) {
|
|
|
2580
2139
|
earlier,
|
|
2581
2140
|
approval: data.archived != null ? "" : fragmentString(approvalHtml),
|
|
2582
2141
|
approvalPlacement: approvalLeads ? "lead" : "plan",
|
|
2583
|
-
// The kit's approval box (src/design/KIT.md): the act, by the real rules, with the rows in the Plan tab.
|
|
2584
2142
|
approve: data.archived != null || sheetInput === null || dependencyChoiceNeeded || data.csrf === "" ? null : approveKitOf(sheetInput, data.approvalFresh ?? null),
|
|
2585
2143
|
approved: scope !== null && approval.approved ? approvedKitOf(scope, approval, data.approvalProof ?? null) : null,
|
|
2586
2144
|
more,
|
|
@@ -2588,8 +2146,6 @@ export function taskBodyParts(data) {
|
|
|
2588
2146
|
recheckStopped: data.csrf !== "" && data.assignment?.primaryAction?.code === "recheck-stopped" && data.assignment.primaryAction.target.runId !== null
|
|
2589
2147
|
? { action: `${taskHref(data.assignment.rootId)}/recheck-stopped`, run: data.assignment.primaryAction.target.runId } : null,
|
|
2590
2148
|
rebuild,
|
|
2591
|
-
// What needs a person on the page itself. Open questions and a plan change are answered here, in their step's row:
|
|
2592
|
-
// the thread (the work panel) only links to them.
|
|
2593
2149
|
lead: [
|
|
2594
2150
|
{ key: "history", html: data.history === undefined ? "" : htmlString(data.history) }, { key: "control", html: htmlString(stop === null ? controlHtml : taskControlDetailsHtml(data.control, task.id, data.csrf, "task", false, true)) }, { key: "problem", html: fragmentString(problemHtml) },
|
|
2595
2151
|
{ key: "questions", html: decisionRail === "" ? "" : htmlString(decisionRail) }, { key: "plan-revisions", html: isEmptyHtml(revisionLedgerCard) ? "" : htmlString(revisionLedgerCard) },
|
|
@@ -2599,14 +2155,10 @@ export function taskBodyParts(data) {
|
|
|
2599
2155
|
{ key: "needs-scope", html: fragmentString(needsScopeCard) },
|
|
2600
2156
|
{ key: "mirror", html: fragmentString(mirrorCard) }, { key: "attempt", html: fragmentString(attemptPanel), ...(liveRunId === null ? {} : { instance: String(liveRunId) }) },
|
|
2601
2157
|
].filter(one => one.html !== ""),
|
|
2602
|
-
// Open questions are a lead block (key "questions"), so they sit in the step that waits.
|
|
2603
2158
|
questions: "",
|
|
2604
2159
|
facts,
|
|
2605
2160
|
sections: [
|
|
2606
2161
|
...(previousResult === null || thread.some(one => one.more !== null) ? [] : [{ id: "result", title: previousResult.title, html: htmlString(previousResult.html), open: false, count: null }]),
|
|
2607
|
-
// Questions are in the thread; the scope and the ledgers fold here until asked.
|
|
2608
|
-
// The Plan and Approval rows hold the plan sheet (a release's terms included), so this page's Plan section keeps
|
|
2609
|
-
// only what the sheet leaves out (the links, the agents, the edit form): the plan is never printed a second time.
|
|
2610
2162
|
...sectionParts.filter(one => !MANAGE.has(one.id) && one.id !== "decisions").map(one => one.id !== "scope" ? one : {
|
|
2611
2163
|
...one,
|
|
2612
2164
|
...(scope === null ? {} : { html: htmlString(joinHtml(scopeRest, "\n")) }),
|
|
@@ -2618,17 +2170,13 @@ export function taskBodyParts(data) {
|
|
|
2618
2170
|
{ id: "task-diagnostics", title: "Task options", html: htmlString(optionsHtml), open: optionsOpen, count: null },
|
|
2619
2171
|
],
|
|
2620
2172
|
cancel: cancelForm === "" ? null : { html: htmlString(cancelForm), open: data.cancelDraft !== undefined },
|
|
2621
|
-
// Every task's road (the first task's guide used to be the only one): facts only, so the checks step says when
|
|
2622
|
-
// checks didn't run, and a research report has none.
|
|
2623
2173
|
journey: task.state === "cancelled" || data.status === undefined ? null : (() => {
|
|
2624
2174
|
const planning = data.plan === "requested" && approveForm === "";
|
|
2625
2175
|
const read = data.assignment != null ? assignmentStageOf(data.assignment, { token: data.status.token }, planning) : stageOfCode(data.status.token, { planning });
|
|
2626
|
-
// The one answer the status card's headline and Project checks row read (task-status.ts approvedCheckOf).
|
|
2627
2176
|
const checks = statusCard?.status.check ?? null;
|
|
2628
2177
|
const report = data.deliverable === "report" || data.report != null;
|
|
2629
2178
|
return taskRoad(read, scope !== null && approvalOf(scope).approved, task.state === "done", { checks, report });
|
|
2630
2179
|
})(),
|
|
2631
|
-
// "Do this every time…": the starter flow that does this kind of work on its own, one yes away.
|
|
2632
2180
|
thread,
|
|
2633
2181
|
details,
|
|
2634
2182
|
chatHref: data.csrf === "" ? null : taskChatHref(data.rootId ?? task.id),
|
|
@@ -2637,14 +2185,12 @@ export function taskBodyParts(data) {
|
|
|
2637
2185
|
return { href: `/settings/flows?repo=${encodeURIComponent(data.repo)}&starter=${starter.id}#starter-${starter.id}`, starter: starter.name };
|
|
2638
2186
|
})(),
|
|
2639
2187
|
};
|
|
2640
|
-
// Without script the steps are the page too: every row open, in order, each holding its own part.
|
|
2641
2188
|
const rowFacts = data.archived != null ? null : stepRowsOf(view);
|
|
2642
2189
|
const rowsHtml = rowFacts === null ? null : (() => {
|
|
2643
2190
|
const here = rowFacts.find(row => row.state === "current" || row.state === "stuck") ?? rowFacts.find(row => row.open) ?? rowFacts.at(-1);
|
|
2644
2191
|
const bodyOf = (key) => joinHtml([
|
|
2645
2192
|
key === here.key ? statusHtml : "",
|
|
2646
2193
|
key === "plan" ? planCard : "",
|
|
2647
|
-
// The shared approval sheet, its Plan details open here: nothing the yes agrees to is folded on this page.
|
|
2648
2194
|
key === "approve" ? (approvalHtml !== "" ? approvalHtml : view.approved == null ? "" : html `<p class="meta">${view.approved.automatic ? `Approved automatically by ${view.approved.rule ?? "a rule"}` : `Approved by ${view.approved.by}`} · ${whenTime(view.approved.at)}</p>`) : "",
|
|
2649
2195
|
key === "build" ? joinHtml([controlHtml, progressCard, revisionLedgerCard]) : "",
|
|
2650
2196
|
key === "ready" && previousResult !== null ? html `<section class="task-previous-result" aria-label="${previousResult.title}">${previousResult.html}</section>` : "",
|
|
@@ -2658,12 +2204,6 @@ export function taskBody(data) {
|
|
|
2658
2204
|
return taskBodyParts(data).html;
|
|
2659
2205
|
}
|
|
2660
2206
|
export function taskPage(chrome, data) {
|
|
2661
|
-
// The sensitive-page composition guard (slice 1c): this page may carry a
|
|
2662
|
-
// password ceremony. sendScreen() would keep a functional script on such
|
|
2663
|
-
// a page — so the decision is made HERE, from the rendered body itself:
|
|
2664
|
-
// when the body (or the chrome's list pane) shows a password input, the
|
|
2665
|
-
// page re-renders degraded — no poller, static attempt line, link-only
|
|
2666
|
-
// decisions — and ships no functional script at all.
|
|
2667
2207
|
const first = taskBodyParts(data);
|
|
2668
2208
|
const sensitive = SENSITIVE_INPUT.test(htmlString(first.html)) || (chrome.listPane !== undefined && SENSITIVE_INPUT.test(htmlString(chrome.listPane)));
|
|
2669
2209
|
if (sensitive) {
|
|
@@ -2676,7 +2216,6 @@ export function taskPage(chrome, data) {
|
|
|
2676
2216
|
const script = (liveRun === undefined ? "" : regionScript("check-progress", "check", `/r/${liveRun.id}`)) +
|
|
2677
2217
|
(liveRun !== undefined && data.peekable === true ? regionScript("run-peek", "peek", `/r/${liveRun.id}`) : "") +
|
|
2678
2218
|
(answers ? decisionAnswerScript() : "");
|
|
2679
|
-
// The same three, named for the app (task-page-in-app.md): it runs its own version of each where it can.
|
|
2680
2219
|
const app = [];
|
|
2681
2220
|
if (liveRun !== undefined)
|
|
2682
2221
|
app.push({ kind: "region", region: "check-progress", run: liveRun.id });
|
|
@@ -2690,8 +2229,6 @@ export function taskPage(chrome, data) {
|
|
|
2690
2229
|
...(script === "" ? {} : { functional: { script, fetches: true, app } }),
|
|
2691
2230
|
});
|
|
2692
2231
|
}
|
|
2693
|
-
/** One accessible two-choice control everywhere permissions are selected.
|
|
2694
|
-
* The words describe behavior; the raw flag stays secondary detail. */
|
|
2695
2232
|
export function permissionModeChoices(name, selected) {
|
|
2696
2233
|
const choice = (value, title, detail) => html `<label class="permission-choice"><input type="radio" name="${name}" value="${value}"${value === selected ? html ` checked` : ""}><span><strong>${title}</strong><small>${detail}</small></span></label>`;
|
|
2697
2234
|
return joinHtml([
|
|
@@ -2701,7 +2238,6 @@ export function permissionModeChoices(name, selected) {
|
|
|
2701
2238
|
html `</div>`,
|
|
2702
2239
|
]);
|
|
2703
2240
|
}
|
|
2704
|
-
/** Quality selects the configured agent route; permissions remain separate. */
|
|
2705
2241
|
export function qualityModeChoices(name, selected) {
|
|
2706
2242
|
const choice = (value, title, detail) => html `<label class="permission-choice"><input type="radio" name="${name}" value="${value}"${value === selected ? html ` checked` : ""}><span><strong>${title}</strong><small>${detail}</small></span></label>`;
|
|
2707
2243
|
return joinHtml([
|
|
@@ -2711,14 +2247,6 @@ export function qualityModeChoices(name, selected) {
|
|
|
2711
2247
|
html `</div>`,
|
|
2712
2248
|
]);
|
|
2713
2249
|
}
|
|
2714
|
-
/**
|
|
2715
|
-
* A decision's answer forms — one source of truth for the decision screen
|
|
2716
|
-
* and the triage flow. The consequence reads BEFORE the button that buys
|
|
2717
|
-
* it; irreversible options arm behind one deliberate tap AND the server
|
|
2718
|
-
* independently requires the confirm field. `returnTo` is allow-listed by
|
|
2719
|
-
* the answer handler, never an arbitrary URL. `csrf` is unused (postForm
|
|
2720
|
-
* writes the field); kept for callers.
|
|
2721
|
-
*/
|
|
2722
2250
|
export function decisionOptionForms(decision, returnTo) {
|
|
2723
2251
|
return joinHtml(decision.options
|
|
2724
2252
|
.map(option => {
|
|
@@ -2744,9 +2272,6 @@ export function taskOf(store, decision) {
|
|
|
2744
2272
|
const run = store.getRun(decision.run);
|
|
2745
2273
|
return run === null ? "?" : store.externalIdFor(run.taskRef) ?? "?";
|
|
2746
2274
|
}
|
|
2747
|
-
/** A release task's own card (release-once.md, "What people see"): the release it's approved for, the later commits
|
|
2748
|
-
* carried under it (on demand), what a later check must run again, the last nightly check of main, and one action to
|
|
2749
|
-
* stop carrying. A carried task says whose approval it was carried from. */
|
|
2750
2275
|
export function releaseCardHtml(taskId, release, canStop) {
|
|
2751
2276
|
if (release === null)
|
|
2752
2277
|
return html ``;
|
|
@@ -2767,9 +2292,6 @@ export function releaseCardHtml(taskId, release, canStop) {
|
|
|
2767
2292
|
html `</div>`,
|
|
2768
2293
|
], "\n");
|
|
2769
2294
|
}
|
|
2770
|
-
/** The task page's approval box (src/design/KIT.md): what it asks, the act's own form fields, and the facts the
|
|
2771
|
-
* approve control reads to show a password, one click, or nothing. The rows it signs go to the Plan tab (`planHtml`).
|
|
2772
|
-
* These decide only what the page shows: the approve route proves the person, the freshness and the digest again. */
|
|
2773
2295
|
export function approveKitOf(input, freshSince) {
|
|
2774
2296
|
const parts = approvalSheetParts(input);
|
|
2775
2297
|
const rebuild = input.rebuild ?? null;
|
|
@@ -2785,15 +2307,11 @@ export function approveKitOf(input, freshSince) {
|
|
|
2785
2307
|
kind: "standard",
|
|
2786
2308
|
facts: { passwordless: passwordlessRendering() || input.localOwner?.eligible === true, remembered: until !== null },
|
|
2787
2309
|
rememberedUntil: until,
|
|
2788
|
-
// Easy-start C5: the owner approving on this computer needs no password, and the line says so (not "Passwordless").
|
|
2789
2310
|
...(input.localOwner?.eligible === true ? { termsWords: "No password needed on this computer." } : {}),
|
|
2790
|
-
// What it signs: the plan sheet (the same parts as the chat's sheet, re-ordered), then the in-place editor.
|
|
2791
2311
|
planHtml: htmlString(joinHtml([parts.sheet, parts.editor ?? "", parts.editorForm])),
|
|
2792
|
-
// The plan sheet alone, with no editor and no form: what Home shows beside its one-click Approve (B2.1).
|
|
2793
2312
|
sheetHtml: htmlString(parts.sheet),
|
|
2794
2313
|
};
|
|
2795
2314
|
}
|
|
2796
|
-
/** How an approved plan was approved, for the status box's terms line: by whom and how, or the rule that approved it. */
|
|
2797
2315
|
export function approvedKitOf(scope, approval, proof) {
|
|
2798
2316
|
if (!approval.approved)
|
|
2799
2317
|
return null;
|
|
@@ -2803,7 +2321,9 @@ export function approvedKitOf(scope, approval, proof) {
|
|
|
2803
2321
|
const how = approvalProofWords(proof).replace(/^ \(|\)$/g, "");
|
|
2804
2322
|
return { by: approval.by, at: approval.at, automatic: rule !== null, rule, how: how === "" ? (rule === null ? "password typed" : "") : how, version: scope.digest.slice(0, 12) };
|
|
2805
2323
|
}
|
|
2806
|
-
/** The plan version, in Details: a short handle a person can compare, never on the approval line itself. */
|
|
2807
2324
|
export function planVersionDetailsHtml(digest) {
|
|
2808
2325
|
return html `<details class="scope-version"><summary class="meta">Details</summary><p class="meta"><span class="mono">${planVersionWords(digest)}</span></p></details>`;
|
|
2809
2326
|
}
|
|
2327
|
+
function agentlessRoute(dispatch, route) {
|
|
2328
|
+
return dispatch?.summary === NO_AGENT_TITLE && route?.kind === "unreadable" && (route.problem ?? "").includes("has no exact model");
|
|
2329
|
+
}
|