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.
Files changed (1518) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +27 -27
  3. package/dist/accent-colors.js +0 -29
  4. package/dist/acp-agents.js +0 -3
  5. package/dist/acp-attest.js +0 -30
  6. package/dist/acp-check.js +3 -70
  7. package/dist/acp-client.js +3 -94
  8. package/dist/acp-inspect.js +1 -20
  9. package/dist/action-ledger.js +0 -8
  10. package/dist/activity-line.js +0 -14
  11. package/dist/actor.js +0 -15
  12. package/dist/advanced-schema.js +12 -0
  13. package/dist/advanced-view.js +26 -0
  14. package/dist/advanced.js +61 -0
  15. package/dist/agent-board.js +0 -117
  16. package/dist/agent-fence.js +11 -367
  17. package/dist/agent-onboard.js +12 -50
  18. package/dist/agent-pulse.js +5 -38
  19. package/dist/agent-state-words.js +0 -8
  20. package/dist/agent-state.js +1 -45
  21. package/dist/agent-turns.js +3 -17
  22. package/dist/agentconfig.js +1 -99
  23. package/dist/agents-board.js +0 -60
  24. package/dist/agents-live.js +1 -8
  25. package/dist/api-tokens.js +0 -27
  26. package/dist/approval-authority.js +0 -59
  27. package/dist/approval-password.js +0 -10
  28. package/dist/approval-policy.js +0 -29
  29. package/dist/approval-rules-ui.js +0 -9
  30. package/dist/assignment-adapters.js +0 -14
  31. package/dist/assignment-brief.js +1 -17
  32. package/dist/assignment-delivery.js +0 -22
  33. package/dist/assignment-presentation.js +0 -14
  34. package/dist/assignment-status.js +1 -30
  35. package/dist/assignment-ui.js +0 -12
  36. package/dist/assignment.js +117 -103
  37. package/dist/attest.js +0 -38
  38. package/dist/audit-cli.js +0 -9
  39. package/dist/backend.js +0 -59
  40. package/dist/backup-ui.js +0 -12
  41. package/dist/backup.js +8 -61
  42. package/dist/batch-checks.js +0 -20
  43. package/dist/batch-policy.js +0 -4
  44. package/dist/beads.js +0 -48
  45. package/dist/bin.js +0 -8
  46. package/dist/board.js +1 -36
  47. package/dist/boot-identity.js +0 -42
  48. package/dist/bounded-spawn.js +4 -28
  49. package/dist/brand-mark.js +0 -21
  50. package/dist/brief-fence.js +0 -16
  51. package/dist/browser/terminal.css +1 -1
  52. package/dist/browser/terminal.js +16 -16
  53. package/dist/browser/workspace.css +2 -2
  54. package/dist/browser/workspace.js +26 -26
  55. package/dist/browser-crew.js +0 -8
  56. package/dist/browser-shell.js +2 -15
  57. package/dist/browser-workspace.js +6 -30
  58. package/dist/budget-alerts.js +1 -4
  59. package/dist/build-review.js +2 -50
  60. package/dist/builder-restart.js +0 -13
  61. package/dist/builder.js +21 -1035
  62. package/dist/canonical-json.js +0 -12
  63. package/dist/capscan.js +1 -32
  64. package/dist/card-catalog.js +0 -12
  65. package/dist/card-cli.js +0 -1
  66. package/dist/card-render.js +0 -25
  67. package/dist/card-sources.js +0 -10
  68. package/dist/chat-acceptance.js +0 -7
  69. package/dist/chat-actions.js +5 -190
  70. package/dist/chat-admission.js +0 -7
  71. package/dist/chat-approval.js +0 -25
  72. package/dist/chat-ask.js +0 -17
  73. package/dist/chat-card-part.js +0 -3
  74. package/dist/chat-card.js +0 -6
  75. package/dist/chat-channel.js +2 -83
  76. package/dist/chat-continuity.js +0 -31
  77. package/dist/chat-controls.js +0 -7
  78. package/dist/chat-core.js +0 -55
  79. package/dist/chat-decide.js +2 -153
  80. package/dist/chat-delivery-state.js +0 -49
  81. package/dist/chat-delivery.js +2 -143
  82. package/dist/chat-display.js +0 -2
  83. package/dist/chat-evidence.js +0 -65
  84. package/dist/chat-flow.js +0 -72
  85. package/dist/chat-follow.js +0 -13
  86. package/dist/chat-inbox.js +0 -34
  87. package/dist/chat-live-schema.js +0 -14
  88. package/dist/chat-live.js +2 -87
  89. package/dist/chat-message-states.js +13 -40
  90. package/dist/chat-messages.js +0 -153
  91. package/dist/chat-migration.js +0 -57
  92. package/dist/chat-polish.js +0 -7
  93. package/dist/chat-quiet.js +0 -37
  94. package/dist/chat-review.js +0 -4
  95. package/dist/chat-rooms.js +0 -22
  96. package/dist/chat-settings-page.js +0 -4
  97. package/dist/chat-task-actions.js +0 -7
  98. package/dist/chat-terms.js +0 -21
  99. package/dist/chat-voice.js +0 -38
  100. package/dist/chat-warmth.js +1 -3
  101. package/dist/check-access.js +0 -30
  102. package/dist/check-facts.js +2 -62
  103. package/dist/check-failure.js +0 -98
  104. package/dist/check-levels-ui.js +4 -10
  105. package/dist/check-levels.js +3 -35
  106. package/dist/check-load.js +1 -49
  107. package/dist/check-only-standing.js +0 -6
  108. package/dist/check-only.js +0 -22
  109. package/dist/check-progress.js +0 -32
  110. package/dist/check-repair.js +2 -35
  111. package/dist/check-report.js +1 -108
  112. package/dist/check-stamp.js +0 -20
  113. package/dist/checkout-cleanup.js +0 -84
  114. package/dist/checkout-proof.js +1 -13
  115. package/dist/child-database.js +0 -3
  116. package/dist/claim.js +4 -508
  117. package/dist/claude-print.js +0 -10
  118. package/dist/cli-fast.js +0 -8
  119. package/dist/cli-help.js +90 -78
  120. package/dist/cli-http.js +0 -10
  121. package/dist/cli.js +26 -241
  122. package/dist/code-extract.js +0 -6
  123. package/dist/code-map-acts.js +0 -7
  124. package/dist/code-map-admission.js +2 -26
  125. package/dist/code-map-build.js +3 -24
  126. package/dist/code-map-cli.js +0 -4
  127. package/dist/code-map-main.js +0 -6
  128. package/dist/code-map-read.js +0 -12
  129. package/dist/code-map-report.js +0 -9
  130. package/dist/code-map-shape.js +0 -19
  131. package/dist/code-map-store.js +0 -26
  132. package/dist/codex-limits.js +1 -17
  133. package/dist/coding-context.js +0 -10
  134. package/dist/coding-handoff.js +0 -14
  135. package/dist/coding-provider.js +0 -39
  136. package/dist/coding-shipping-ui.js +0 -1
  137. package/dist/coding-ui.js +0 -1
  138. package/dist/coding-update.js +1 -18
  139. package/dist/coding-workspace.js +0 -27
  140. package/dist/commit-extract.js +0 -83
  141. package/dist/connect-cli.js +0 -19
  142. package/dist/console-chrome.js +1 -34
  143. package/dist/console-instance.js +2 -91
  144. package/dist/container-state.js +0 -4
  145. package/dist/containment.js +2 -105
  146. package/dist/contract-changes.js +0 -6
  147. package/dist/contracts/acceptance-terms.js +0 -7
  148. package/dist/contracts/chat-actions.js +0 -46
  149. package/dist/contracts/chat-callback-rows.js +0 -8
  150. package/dist/contracts/chat-card.js +0 -14
  151. package/dist/contracts/chat-content.js +0 -55
  152. package/dist/contracts/chat-tables.js +0 -7
  153. package/dist/contracts/cli.js +0 -59
  154. package/dist/contracts/coding-activity.js +0 -15
  155. package/dist/contracts/coding-context.js +0 -15
  156. package/dist/contracts/coding-handoff.js +0 -11
  157. package/dist/contracts/coding-workspace.js +0 -14
  158. package/dist/contracts/console-api.js +3 -54
  159. package/dist/contracts/contract-test.js +0 -14
  160. package/dist/contracts/contract.js +0 -48
  161. package/dist/contracts/decision.js +0 -20
  162. package/dist/contracts/diff-stat.js +0 -16
  163. package/dist/contracts/discord-callback.js +0 -9
  164. package/dist/contracts/flow-card.js +0 -18
  165. package/dist/contracts/flow-propose.js +0 -8
  166. package/dist/contracts/flow-send.js +0 -31
  167. package/dist/contracts/flow.js +0 -112
  168. package/dist/contracts/gateway-tools.js +0 -22
  169. package/dist/contracts/handoff.js +0 -22
  170. package/dist/contracts/integration-metadata.js +0 -39
  171. package/dist/contracts/lead-context.js +0 -14
  172. package/dist/contracts/lead-tools.js +0 -49
  173. package/dist/contracts/mcp-oauth.js +0 -12
  174. package/dist/contracts/memory-pass.js +0 -21
  175. package/dist/contracts/model-catalog.js +0 -9
  176. package/dist/contracts/observation-request.js +0 -11
  177. package/dist/contracts/plan.js +0 -16
  178. package/dist/contracts/project-knowledge.js +0 -26
  179. package/dist/contracts/project-memory.js +0 -16
  180. package/dist/contracts/project-skills.js +0 -31
  181. package/dist/contracts/proof.js +0 -23
  182. package/dist/contracts/provider.js +0 -9
  183. package/dist/contracts/recipes.js +0 -16
  184. package/dist/contracts/release-check.js +0 -61
  185. package/dist/contracts/release-terms.js +0 -27
  186. package/dist/contracts/retention.js +0 -12
  187. package/dist/contracts/review-findings.js +0 -13
  188. package/dist/contracts/route-results.js +0 -15
  189. package/dist/contracts/route.js +0 -33
  190. package/dist/contracts/scope.js +0 -29
  191. package/dist/contracts/scout-report.js +0 -34
  192. package/dist/contracts/slack-callback.js +0 -11
  193. package/dist/contracts/sort-answer.js +0 -24
  194. package/dist/contracts/stage-output.js +0 -46
  195. package/dist/contracts/storage.js +0 -8
  196. package/dist/contracts/store-json.js +0 -41
  197. package/dist/contracts/subagent-turn.js +0 -23
  198. package/dist/contracts/task-sizing.js +0 -10
  199. package/dist/contracts/teams-callback.js +0 -7
  200. package/dist/contracts/telegram-callback.js +0 -27
  201. package/dist/contracts/trigger-payloads.js +0 -41
  202. package/dist/contracts/update-journal.js +0 -47
  203. package/dist/contracts/verification-receipt.js +0 -36
  204. package/dist/contracts/verification-view.js +0 -15
  205. package/dist/contracts/youiyoux-request.js +0 -26
  206. package/dist/control-setup.js +0 -7
  207. package/dist/control-ui.js +0 -3
  208. package/dist/controller-service.js +0 -4
  209. package/dist/controller-supervisor.js +0 -15
  210. package/dist/converse.js +3 -129
  211. package/dist/coordinator-proposals.js +1 -6
  212. package/dist/coordinator.js +0 -65
  213. package/dist/credentials-ui.js +0 -6
  214. package/dist/daemon.js +0 -137
  215. package/dist/database-reclaim.js +0 -3
  216. package/dist/decision.js +0 -78
  217. package/dist/demo-chat.js +4 -15
  218. package/dist/demo-sign-in.js +77 -0
  219. package/dist/demo.js +5 -194
  220. package/dist/deploy-gate.js +0 -20
  221. package/dist/deploy-lock.js +0 -4
  222. package/dist/deploy-phase.js +0 -22
  223. package/dist/deploy-rescue.js +0 -21
  224. package/dist/deprecations.js +0 -12
  225. package/dist/design/kit.css +9 -6
  226. package/dist/design/kit.js +2 -33
  227. package/dist/desktop-access.js +0 -9
  228. package/dist/desktop-bundle.js +1 -3
  229. package/dist/desktop-host.js +0 -34
  230. package/dist/desktop-update-gate.js +0 -8
  231. package/dist/desktop-update-recovery.js +1 -18
  232. package/dist/desktop-update.js +2 -48
  233. package/dist/digest-times.js +0 -2
  234. package/dist/disclosure.js +0 -5
  235. package/dist/discord-api.js +0 -6
  236. package/dist/discord-chat.js +0 -31
  237. package/dist/discord.js +0 -7
  238. package/dist/discover.js +0 -50
  239. package/dist/dispatch.js +61 -60
  240. package/dist/dispose.js +0 -208
  241. package/dist/doctor.js +0 -48
  242. package/dist/easy-start-args.js +7 -7
  243. package/dist/easy-start.js +32 -45
  244. package/dist/egress.js +1 -63
  245. package/dist/email-settings.js +0 -8
  246. package/dist/envelope.js +50 -86
  247. package/dist/eval-gate.js +1 -37
  248. package/dist/eval-hooks.js +0 -120
  249. package/dist/eval-oracle-main.js +0 -7
  250. package/dist/eval-oracle.js +3 -42
  251. package/dist/eval-world.js +1 -23
  252. package/dist/evals.js +6 -134
  253. package/dist/evidence-pack.js +0 -29
  254. package/dist/evidence-pair.js +0 -17
  255. package/dist/evidence.js +4 -280
  256. package/dist/exec.js +19 -404
  257. package/dist/exhaustion.js +0 -30
  258. package/dist/export-ui.js +0 -7
  259. package/dist/export.js +1 -38
  260. package/dist/failing-first.js +0 -6
  261. package/dist/fallback-schema.js +0 -5
  262. package/dist/fallback.js +0 -81
  263. package/dist/fast-start.js +0 -97
  264. package/dist/fast-terms.js +0 -3
  265. package/dist/fenced-check-coverage.js +0 -11
  266. package/dist/findings.js +1 -63
  267. package/dist/first-run.js +4 -57
  268. package/dist/first-tasks-child.js +0 -5
  269. package/dist/flaky-ci.js +1 -24
  270. package/dist/flaky-cli.js +0 -4
  271. package/dist/flaky.js +0 -43
  272. package/dist/fleet-schema.js +0 -11
  273. package/dist/flow-actions.js +0 -31
  274. package/dist/flow-browser.js +0 -42
  275. package/dist/flow-cadence.js +1 -24
  276. package/dist/flow-card-task.js +0 -11
  277. package/dist/flow-changed.js +0 -16
  278. package/dist/flow-code.js +1 -45
  279. package/dist/flow-draft.js +0 -17
  280. package/dist/flow-engine.js +2 -76
  281. package/dist/flow-gallery-ui.js +0 -28
  282. package/dist/flow-gallery.js +0 -54
  283. package/dist/flow-insights.js +0 -12
  284. package/dist/flow-items.js +0 -27
  285. package/dist/flow-live.js +0 -31
  286. package/dist/flow-people.js +0 -14
  287. package/dist/flow-pull-request.js +0 -32
  288. package/dist/flow-replies.js +0 -9
  289. package/dist/flow-result-card.js +0 -8
  290. package/dist/flow-schedule.js +0 -74
  291. package/dist/flow-scripts.js +0 -13
  292. package/dist/flow-secrets.js +0 -10
  293. package/dist/flow-send.js +0 -45
  294. package/dist/flow-share.js +0 -60
  295. package/dist/flow-sort.js +1 -24
  296. package/dist/flow-starters-ui.js +0 -2
  297. package/dist/flow-starters.js +0 -13
  298. package/dist/flow-steps.js +0 -80
  299. package/dist/flow-triggers.js +2 -256
  300. package/dist/flow-unattended-words.js +0 -13
  301. package/dist/flow-unattended.js +2 -115
  302. package/dist/flows-cli.js +2 -36
  303. package/dist/flows-ui.js +0 -51
  304. package/dist/flows.js +0 -158
  305. package/dist/folder-gate.js +0 -21
  306. package/dist/folder-look.js +0 -42
  307. package/dist/follow-through-brief.js +0 -6
  308. package/dist/follow-through-cli.js +0 -5
  309. package/dist/fonts.js +0 -13
  310. package/dist/gaps.js +0 -20
  311. package/dist/gate-failure.js +0 -7
  312. package/dist/git-floor.js +0 -12
  313. package/dist/git-incident.js +2 -38
  314. package/dist/git-views.js +0 -24
  315. package/dist/git.js +0 -31
  316. package/dist/github-import.js +0 -22
  317. package/dist/github-jobs.js +0 -12
  318. package/dist/google-mail.js +2 -27
  319. package/dist/grant.js +0 -110
  320. package/dist/graph.js +0 -108
  321. package/dist/guides.js +4 -15
  322. package/dist/handover-note.js +0 -12
  323. package/dist/health-cli.js +0 -2
  324. package/dist/home-groups.js +0 -15
  325. package/dist/html.js +0 -54
  326. package/dist/install-method.js +0 -12
  327. package/dist/integrations-ui.js +0 -15
  328. package/dist/integrations.js +7 -50
  329. package/dist/invoke.js +1 -381
  330. package/dist/is-record.js +0 -1
  331. package/dist/issues.js +0 -48
  332. package/dist/jsonl-discriminants.js +0 -6
  333. package/dist/keymap.js +2 -16
  334. package/dist/keys.js +0 -56
  335. package/dist/kits-ui.js +0 -3
  336. package/dist/kits.js +1 -24
  337. package/dist/knowledge-cli.js +0 -4
  338. package/dist/knowledge-ui.js +0 -8
  339. package/dist/landed-cleanup.js +0 -119
  340. package/dist/laptop-background.js +0 -85
  341. package/dist/laptop-service.js +0 -67
  342. package/dist/latency-timeline.js +2 -23
  343. package/dist/lead-about.js +0 -7
  344. package/dist/lead-answer-eval.js +0 -39
  345. package/dist/lead-capabilities.js +0 -19
  346. package/dist/lead-cli-live.js +0 -22
  347. package/dist/lead-cli.js +0 -27
  348. package/dist/lead-commitments.js +1 -27
  349. package/dist/lead-context.js +2 -42
  350. package/dist/lead-contract.js +0 -8
  351. package/dist/lead-doors.js +0 -105
  352. package/dist/lead-follow.js +0 -41
  353. package/dist/lead-identity.js +1 -4
  354. package/dist/lead-latency-schema.js +0 -13
  355. package/dist/lead-people.js +3 -18
  356. package/dist/lead-progress.js +0 -12
  357. package/dist/lead-queue-runtime.js +0 -26
  358. package/dist/lead-queue.js +0 -35
  359. package/dist/lead-route.js +0 -33
  360. package/dist/lead-status.js +0 -37
  361. package/dist/lead-sweep.js +0 -18
  362. package/dist/lead-tools.js +0 -160
  363. package/dist/lead-voice.js +0 -54
  364. package/dist/lead.js +2 -105
  365. package/dist/learning-child.js +0 -6
  366. package/dist/learning-look.js +0 -14
  367. package/dist/ledger-chain.js +0 -34
  368. package/dist/ledger-csv.js +0 -2
  369. package/dist/ledger-view.js +0 -3
  370. package/dist/lesson-notes.js +0 -56
  371. package/dist/limits-ui.js +0 -14
  372. package/dist/link.js +0 -79
  373. package/dist/live-backup.js +3 -33
  374. package/dist/live-bus.js +7 -81
  375. package/dist/live-children-read.js +4 -47
  376. package/dist/live-children.js +4 -44
  377. package/dist/live-detail.js +0 -17
  378. package/dist/live-input.js +5 -68
  379. package/dist/live-main-read.js +1 -14
  380. package/dist/live-notes.js +0 -12
  381. package/dist/live-open.js +1 -23
  382. package/dist/live-records.js +4 -151
  383. package/dist/live-reply.js +1 -51
  384. package/dist/live-terminal.js +12 -111
  385. package/dist/live.js +4 -130
  386. package/dist/local-owner-acts.js +168 -0
  387. package/dist/local-owner.js +15 -80
  388. package/dist/log.js +0 -8
  389. package/dist/login-secrets.js +2 -38
  390. package/dist/machine-check.js +0 -2
  391. package/dist/machine-identity.js +1 -46
  392. package/dist/mailbox.js +0 -30
  393. package/dist/maintenance.js +1 -3
  394. package/dist/mcp-connect.js +0 -88
  395. package/dist/mcp-core.js +0 -45
  396. package/dist/mcp-http.js +0 -13
  397. package/dist/mcp-oauth.js +0 -37
  398. package/dist/mcp-person.js +0 -11
  399. package/dist/mcp.js +3 -73
  400. package/dist/memory-cli.js +0 -3
  401. package/dist/memory-pass.js +0 -53
  402. package/dist/memory-tidy.js +0 -55
  403. package/dist/memory-use.js +2 -24
  404. package/dist/merge-checklist.js +21 -29
  405. package/dist/metrics.js +0 -10
  406. package/dist/mobile-viewport.js +0 -6
  407. package/dist/model-catalog.js +1 -33
  408. package/dist/model-choices.js +9 -84
  409. package/dist/model-names.js +0 -9
  410. package/dist/models-cli.js +0 -13
  411. package/dist/models-ui.js +0 -17
  412. package/dist/modes.js +0 -35
  413. package/dist/monitoring-settings.js +2 -27
  414. package/dist/monitoring-ui.js +2 -14
  415. package/dist/monitoring.js +2 -38
  416. package/dist/names.js +0 -39
  417. package/dist/needs-you.js +7 -70
  418. package/dist/never-index.js +0 -9
  419. package/dist/nightly-check.js +0 -74
  420. package/dist/nightly-github.js +0 -168
  421. package/dist/notification-delivery.js +0 -3
  422. package/dist/notification-rows.js +0 -17
  423. package/dist/oauth-run-token.js +1 -37
  424. package/dist/observations.js +0 -16
  425. package/dist/oidc.js +1 -20
  426. package/dist/onboard.js +4 -57
  427. package/dist/one-step-chat-schema.js +0 -15
  428. package/dist/openrouter-models.js +0 -6
  429. package/dist/operate-remote-arguments.js +2 -17
  430. package/dist/operate-remote.js +0 -33
  431. package/dist/operate.js +280 -2304
  432. package/dist/orphan-sweep.js +3 -37
  433. package/dist/page-work-contract.js +0 -3
  434. package/dist/password-bearer.js +1 -11
  435. package/dist/passwordless.js +0 -3
  436. package/dist/peek-cli.js +0 -46
  437. package/dist/peek.js +2 -61
  438. package/dist/people-audit-ui.js +0 -6
  439. package/dist/person-proof.js +0 -6
  440. package/dist/phase-routing.js +8 -183
  441. package/dist/plain-schema.js +0 -14
  442. package/dist/plain-words.js +18 -12
  443. package/dist/plan-auto.js +3 -18
  444. package/dist/plan-login.js +0 -16
  445. package/dist/plan.js +0 -68
  446. package/dist/plane-review.js +0 -56
  447. package/dist/planner-source.js +0 -96
  448. package/dist/planner.js +0 -117
  449. package/dist/policy-ui.js +0 -8
  450. package/dist/policy.js +0 -47
  451. package/dist/prepared-evidence.js +0 -5
  452. package/dist/principal.js +0 -29
  453. package/dist/probe.js +0 -30
  454. package/dist/process-custody.js +0 -15
  455. package/dist/process-liveness.js +0 -32
  456. package/dist/process-tree.js +3 -29
  457. package/dist/project-access.js +0 -10
  458. package/dist/project-admission.js +1 -41
  459. package/dist/project-cli.js +0 -6
  460. package/dist/project-concurrency.js +0 -35
  461. package/dist/project-delete-ui.js +4 -29
  462. package/dist/project-delete.js +1 -73
  463. package/dist/project-demo.js +0 -13
  464. package/dist/project-file.js +0 -2
  465. package/dist/project-identity.js +0 -41
  466. package/dist/project-knowledge.js +0 -39
  467. package/dist/project-learning.js +3 -55
  468. package/dist/project-memory.js +2 -45
  469. package/dist/project-outcomes.js +0 -6
  470. package/dist/project-sandbox.js +0 -23
  471. package/dist/project-skills.js +0 -12
  472. package/dist/project-tools.js +6 -184
  473. package/dist/project.js +0 -48
  474. package/dist/prompt.js +0 -31
  475. package/dist/proof.js +0 -220
  476. package/dist/proposal.js +0 -50
  477. package/dist/protected-storage-look.js +0 -6
  478. package/dist/protected-storage.js +1 -84
  479. package/dist/provider-auth.js +3 -69
  480. package/dist/provider-capture.js +1 -15
  481. package/dist/provider-connection.js +0 -8
  482. package/dist/provider-home.js +0 -25
  483. package/dist/provider-limits.js +0 -14
  484. package/dist/provider.js +0 -324
  485. package/dist/public-access.js +11 -30
  486. package/dist/public-check.js +0 -16
  487. package/dist/publish.js +1 -150
  488. package/dist/pull-request-flow.js +6 -74
  489. package/dist/pull-request-schema.js +0 -4
  490. package/dist/pull-request-ui.js +0 -5
  491. package/dist/pulls.js +0 -80
  492. package/dist/push.js +5 -89
  493. package/dist/quick-start.js +1 -23
  494. package/dist/read-executor-worker.js +0 -1
  495. package/dist/read-executor.js +0 -10
  496. package/dist/read-only-request.js +0 -7
  497. package/dist/recipe-ui.js +0 -6
  498. package/dist/recipes.js +0 -13
  499. package/dist/release-adapters.js +6 -214
  500. package/dist/release-approval.js +0 -74
  501. package/dist/release-authority.js +0 -42
  502. package/dist/release-auto.js +0 -142
  503. package/dist/release-card.js +26 -103
  504. package/dist/release-carry.js +0 -132
  505. package/dist/release-ci-hold.js +0 -20
  506. package/dist/release-cli.js +0 -46
  507. package/dist/release-coverage.js +0 -16
  508. package/dist/release-gate.js +0 -30
  509. package/dist/release-git.js +0 -24
  510. package/dist/release-links.js +0 -17
  511. package/dist/release-net.js +0 -42
  512. package/dist/release-next.js +0 -25
  513. package/dist/release-recheck.js +0 -89
  514. package/dist/release-refusal.js +0 -18
  515. package/dist/release-view.js +0 -5
  516. package/dist/release.js +7 -341
  517. package/dist/releases.js +0 -49
  518. package/dist/remote-audit.js +0 -25
  519. package/dist/remote-command.js +0 -16
  520. package/dist/remote-destination.js +5 -26
  521. package/dist/remote-exec.js +1 -27
  522. package/dist/remote-main.js +1 -53
  523. package/dist/remote-run.js +0 -5
  524. package/dist/remote.js +0 -49
  525. package/dist/render.js +0 -133
  526. package/dist/reply-shape.js +0 -85
  527. package/dist/reply-voice.js +0 -7
  528. package/dist/report-summary.js +0 -5
  529. package/dist/reported-usage.js +0 -30
  530. package/dist/repos.js +9 -62
  531. package/dist/repository-context.js +1 -24
  532. package/dist/request-budget-ui.js +0 -4
  533. package/dist/request-budget.js +0 -23
  534. package/dist/restart-certification.js +0 -37
  535. package/dist/result-actions.js +0 -62
  536. package/dist/result-acts.js +0 -34
  537. package/dist/result-completion.js +9 -28
  538. package/dist/result-evidence-readers.js +0 -3
  539. package/dist/result-follow-ups.js +1 -39
  540. package/dist/result-review.js +0 -86
  541. package/dist/result-shots.js +0 -39
  542. package/dist/retention-ui.js +0 -7
  543. package/dist/retention.js +2 -46
  544. package/dist/review-context.js +0 -129
  545. package/dist/review-evidence.js +0 -4
  546. package/dist/review-switch.js +1 -7
  547. package/dist/reviewer.js +0 -35
  548. package/dist/route-change-check.js +0 -2
  549. package/dist/route-change.js +0 -16
  550. package/dist/route-hooks.js +0 -27
  551. package/dist/route-results.js +2 -58
  552. package/dist/route-rules.js +1 -106
  553. package/dist/route-savings.js +0 -36
  554. package/dist/route-store.js +1 -133
  555. package/dist/run-closeout.js +2 -50
  556. package/dist/run-efficiency.js +2 -44
  557. package/dist/run-ending.js +0 -13
  558. package/dist/runner-process.js +0 -33
  559. package/dist/runner.js +17 -189
  560. package/dist/sample-project.js +2 -27
  561. package/dist/sandbox-launch.js +4 -25
  562. package/dist/sandbox-runtime.js +1 -88
  563. package/dist/scan.js +0 -27
  564. package/dist/scope.js +88 -566
  565. package/dist/scout-browser-lock.js +0 -6
  566. package/dist/scout-browser.js +2 -68
  567. package/dist/scout-net.js +1 -32
  568. package/dist/scout-report.js +0 -22
  569. package/dist/scout.js +1 -116
  570. package/dist/secret-mint.js +0 -6
  571. package/dist/serve.js +29 -564
  572. package/dist/server/agents-computers.js +0 -10
  573. package/dist/server/agents-live-filed.js +0 -13
  574. package/dist/server/agents-live-lead.js +0 -19
  575. package/dist/server/agents-live-room.js +0 -19
  576. package/dist/server/chat.js +2 -194
  577. package/dist/server/chrome.js +17 -263
  578. package/dist/server/console.css +4 -4
  579. package/dist/server/edge-refusal.js +0 -3
  580. package/dist/server/flows.js +5 -74
  581. package/dist/server/guards.js +9 -86
  582. package/dist/server/handler-registry.js +0 -2
  583. package/dist/server/home-asks.js +1 -22
  584. package/dist/server/home.js +1 -30
  585. package/dist/server/http.js +0 -82
  586. package/dist/server/in-place.js +0 -15
  587. package/dist/server/kit-standalone.js +0 -20
  588. package/dist/server/kit.js +2 -114
  589. package/dist/server/last-checks.js +0 -2
  590. package/dist/server/live.js +1 -36
  591. package/dist/server/merge-ready-view.js +0 -6
  592. package/dist/server/mutation-key.js +3 -40
  593. package/dist/server/pages-assets.js +0 -16
  594. package/dist/server/pages.js +7 -195
  595. package/dist/server/people-tokens.js +3 -101
  596. package/dist/server/remote-hooks.js +0 -13
  597. package/dist/server/remote.js +0 -28
  598. package/dist/server/render-chat.js +8 -144
  599. package/dist/server/render-code-map.js +0 -5
  600. package/dist/server/render-flaky.js +0 -8
  601. package/dist/server/render-follow-through.js +2 -5
  602. package/dist/server/render-history.js +2 -34
  603. package/dist/server/render-new-task.js +2 -29
  604. package/dist/server/render-pages.js +1 -111
  605. package/dist/server/render-people.js +2 -46
  606. package/dist/server/render-projects.js +15 -32
  607. package/dist/server/render-release.js +1 -14
  608. package/dist/server/render-results.js +4 -355
  609. package/dist/server/render-settings.js +0 -15
  610. package/dist/server/render-tasks.js +17 -497
  611. package/dist/server/request-context.js +2 -9
  612. package/dist/server/retired-routes.js +0 -11
  613. package/dist/server/route-policy.js +0 -3
  614. package/dist/server/route-table.js +8 -133
  615. package/dist/server/runtime.js +0 -1
  616. package/dist/server/session.js +0 -28
  617. package/dist/server/settings.js +40 -246
  618. package/dist/server/signup-gate.js +0 -11
  619. package/dist/server/sweeps.js +0 -6
  620. package/dist/server/task-views.js +12 -227
  621. package/dist/server/tasks.js +37 -531
  622. package/dist/server/terminals.js +2 -46
  623. package/dist/server/welcome.js +2 -22
  624. package/dist/server-telemetry.js +0 -9
  625. package/dist/settings-groups-ui.js +50 -63
  626. package/dist/settings-kit-script.js +0 -19
  627. package/dist/settings-kit.js +0 -63
  628. package/dist/settings-proofs.js +0 -23
  629. package/dist/setup-guide.js +1 -9
  630. package/dist/shared-deps.js +9 -84
  631. package/dist/sign-in-guard.js +0 -27
  632. package/dist/skills-ui.js +0 -2
  633. package/dist/skills.js +2 -54
  634. package/dist/slack-api.js +0 -3
  635. package/dist/slack-chat.js +0 -25
  636. package/dist/slack-settings.js +0 -1
  637. package/dist/slack-socket.js +0 -5
  638. package/dist/slack.js +0 -4
  639. package/dist/sleep.js +0 -1
  640. package/dist/source-key.js +0 -10
  641. package/dist/spend-report.js +0 -29
  642. package/dist/spend-ui.js +0 -26
  643. package/dist/spend.js +0 -40
  644. package/dist/sqlite-runtime.js +0 -2
  645. package/dist/sqlite-telemetry.js +0 -9
  646. package/dist/sso-settings.js +0 -13
  647. package/dist/sso-ui.js +0 -2
  648. package/dist/staged-runtimes.js +5 -39
  649. package/dist/steer-capabilities.js +1 -7
  650. package/dist/steer-controls.js +0 -10
  651. package/dist/steer-live.js +0 -31
  652. package/dist/steer-mailbox.js +4 -65
  653. package/dist/steer-status.js +0 -7
  654. package/dist/stop-proof.js +5 -62
  655. package/dist/storage-sweep-child.js +1 -5
  656. package/dist/storage-sweep-process.js +2 -20
  657. package/dist/storage-sweep-schedule.js +0 -32
  658. package/dist/storage-sweep.js +2 -51
  659. package/dist/storage-ui.js +0 -18
  660. package/dist/storage.js +0 -31
  661. package/dist/store-baseline.js +0 -14
  662. package/dist/store.js +109 -4763
  663. package/dist/stream-scope.js +0 -16
  664. package/dist/structured-output.js +0 -39
  665. package/dist/style-asset.js +0 -2
  666. package/dist/subagent-admin.js +0 -9
  667. package/dist/subagent-desk.js +0 -29
  668. package/dist/subagent-memory.js +0 -38
  669. package/dist/subagent-question.js +0 -29
  670. package/dist/subagent-tools.js +1 -60
  671. package/dist/subagent-week.js +0 -28
  672. package/dist/subagent-work.js +1 -39
  673. package/dist/subagents-ui.js +1 -13
  674. package/dist/subagents.js +0 -40
  675. package/dist/subscription-chat.js +1 -42
  676. package/dist/summary.js +0 -19
  677. package/dist/surface.js +8 -73
  678. package/dist/sweep-gate.js +0 -2
  679. package/dist/sweep-quarantine.js +2 -13
  680. package/dist/sync.js +0 -47
  681. package/dist/tailnet.js +0 -9
  682. package/dist/tamper-scan.js +0 -15
  683. package/dist/task-activity.js +1 -16
  684. package/dist/task-aliases.js +0 -3
  685. package/dist/task-archive.js +0 -7
  686. package/dist/task-base.js +0 -18
  687. package/dist/task-composer.js +0 -2
  688. package/dist/task-control.js +0 -74
  689. package/dist/task-live.js +0 -23
  690. package/dist/task-moves.js +0 -28
  691. package/dist/task-outcome-cli.js +66 -19
  692. package/dist/task-review-brief.js +0 -7
  693. package/dist/task-sizing.js +0 -47
  694. package/dist/task-source.js +0 -23
  695. package/dist/task-status.js +0 -106
  696. package/dist/task-text.js +0 -12
  697. package/dist/team-chat-authorization.js +0 -3
  698. package/dist/team-contract.js +0 -2
  699. package/dist/team-http.js +0 -4
  700. package/dist/team-leads.js +1 -16
  701. package/dist/team-runtime.js +0 -13
  702. package/dist/team-ui.js +0 -1
  703. package/dist/team-updates.js +0 -4
  704. package/dist/teams-api.js +0 -12
  705. package/dist/teams-chat.js +0 -28
  706. package/dist/teams.js +0 -12
  707. package/dist/teardown-git.js +6 -294
  708. package/dist/telegram-flow.js +0 -51
  709. package/dist/telegram-lead.js +2 -203
  710. package/dist/telegram-live.js +1 -42
  711. package/dist/telegram-progress.js +0 -18
  712. package/dist/telegram-settings.js +0 -7
  713. package/dist/telegram-status.js +0 -46
  714. package/dist/telegram-team.js +1 -33
  715. package/dist/telegram.js +6 -454
  716. package/dist/templates.js +0 -24
  717. package/dist/terminal-catalog.js +2 -20
  718. package/dist/terminal-text.js +0 -12
  719. package/dist/test-infra.js +0 -50
  720. package/dist/test-temp.js +3 -26
  721. package/dist/text-limits.js +0 -92
  722. package/dist/tidy.js +0 -76
  723. package/dist/tier-report.js +0 -2
  724. package/dist/token-notices.js +1 -9
  725. package/dist/tokens-cli.js +0 -13
  726. package/dist/tool-broker.js +2 -53
  727. package/dist/tool-launcher.js +0 -14
  728. package/dist/tool-secret-store.js +3 -125
  729. package/dist/toolroll-update-cli.js +0 -9
  730. package/dist/toolroll-update-ui.js +0 -14
  731. package/dist/toolroll-update.js +13 -252
  732. package/dist/tools-ui.js +0 -17
  733. package/dist/transitions-recipes.js +0 -2
  734. package/dist/tree-proof.js +0 -23
  735. package/dist/tui-contract.js +0 -8
  736. package/dist/tui-source.js +91 -40
  737. package/dist/tui.js +54 -54
  738. package/dist/typed-start.js +0 -27
  739. package/dist/unfenced-test-support.js +0 -5
  740. package/dist/up-processes.js +1 -40
  741. package/dist/up-role-child.js +1 -13
  742. package/dist/update-notice.js +0 -1
  743. package/dist/vanished-retry.js +0 -40
  744. package/dist/verification-evidence.js +0 -39
  745. package/dist/version.js +0 -1
  746. package/dist/wake-hub.js +0 -28
  747. package/dist/webhook-limits.js +0 -7
  748. package/dist/webhook-readers.js +0 -30
  749. package/dist/webhook-signing.js +0 -14
  750. package/dist/webhooks.js +0 -54
  751. package/dist/welcome-facts.js +2 -14
  752. package/dist/when-html.js +0 -27
  753. package/dist/work-index.js +26 -98
  754. package/dist/work-summary.js +2 -17
  755. package/dist/workspace-motion.js +0 -2
  756. package/dist/workspace-revision.js +1 -21
  757. package/dist/workspace-ui.js +15 -135
  758. package/dist/worktree-notices.js +0 -3
  759. package/dist/worktree.js +0 -308
  760. package/dist/writes-mode.js +0 -1
  761. package/dist/youiyoux-intake.js +4 -159
  762. package/package.json +5 -4
  763. package/dist/accent-colors.d.ts +0 -51
  764. package/dist/acp-agents.d.ts +0 -43
  765. package/dist/acp-attest.d.ts +0 -44
  766. package/dist/acp-check.d.ts +0 -37
  767. package/dist/acp-client.d.ts +0 -163
  768. package/dist/acp-inspect.d.ts +0 -23
  769. package/dist/action-ledger.d.ts +0 -27
  770. package/dist/activity-line.d.ts +0 -29
  771. package/dist/actor.d.ts +0 -11
  772. package/dist/agent-board.d.ts +0 -229
  773. package/dist/agent-fence.d.ts +0 -479
  774. package/dist/agent-onboard.d.ts +0 -158
  775. package/dist/agent-pulse.d.ts +0 -43
  776. package/dist/agent-state-words.d.ts +0 -19
  777. package/dist/agent-state.d.ts +0 -65
  778. package/dist/agent-turns.d.ts +0 -52
  779. package/dist/agentconfig.d.ts +0 -191
  780. package/dist/agents-board.d.ts +0 -145
  781. package/dist/agents-live.d.ts +0 -31
  782. package/dist/api-tokens.d.ts +0 -80
  783. package/dist/approval-authority.d.ts +0 -51
  784. package/dist/approval-password.d.ts +0 -31
  785. package/dist/approval-policy.d.ts +0 -69
  786. package/dist/approval-rules-ui.d.ts +0 -40
  787. package/dist/assignment-adapters.d.ts +0 -152
  788. package/dist/assignment-brief.d.ts +0 -83
  789. package/dist/assignment-delivery.d.ts +0 -86
  790. package/dist/assignment-presentation.d.ts +0 -37
  791. package/dist/assignment-status.d.ts +0 -71
  792. package/dist/assignment-ui.d.ts +0 -68
  793. package/dist/assignment.d.ts +0 -318
  794. package/dist/attest.d.ts +0 -59
  795. package/dist/audit-cli.d.ts +0 -17
  796. package/dist/backend.d.ts +0 -97
  797. package/dist/backup-ui.d.ts +0 -32
  798. package/dist/backup.d.ts +0 -92
  799. package/dist/batch-checks.d.ts +0 -15
  800. package/dist/batch-policy.d.ts +0 -23
  801. package/dist/beads.d.ts +0 -34
  802. package/dist/bin.d.ts +0 -2
  803. package/dist/board.d.ts +0 -134
  804. package/dist/boot-identity.d.ts +0 -64
  805. package/dist/bounded-spawn.d.ts +0 -57
  806. package/dist/brand-icons.d.ts +0 -168
  807. package/dist/brand-mark.d.ts +0 -28
  808. package/dist/brief-fence.d.ts +0 -9
  809. package/dist/browser-crew.d.ts +0 -12
  810. package/dist/browser-shell.d.ts +0 -9
  811. package/dist/browser-workspace.d.ts +0 -1972
  812. package/dist/budget-alerts.d.ts +0 -19
  813. package/dist/build-review.d.ts +0 -38
  814. package/dist/builder-restart.d.ts +0 -21
  815. package/dist/builder.d.ts +0 -409
  816. package/dist/canonical-json.d.ts +0 -14
  817. package/dist/capscan.d.ts +0 -35
  818. package/dist/card-catalog.d.ts +0 -209
  819. package/dist/card-cli.d.ts +0 -43
  820. package/dist/card-render.d.ts +0 -43
  821. package/dist/card-sources.d.ts +0 -68
  822. package/dist/chat-acceptance.d.ts +0 -74
  823. package/dist/chat-actions.d.ts +0 -460
  824. package/dist/chat-admission.d.ts +0 -19
  825. package/dist/chat-approval.d.ts +0 -58
  826. package/dist/chat-ask.d.ts +0 -32
  827. package/dist/chat-card-part.d.ts +0 -11
  828. package/dist/chat-card.d.ts +0 -46
  829. package/dist/chat-channel.d.ts +0 -126
  830. package/dist/chat-continuity.d.ts +0 -32
  831. package/dist/chat-controls.d.ts +0 -117
  832. package/dist/chat-core.d.ts +0 -177
  833. package/dist/chat-decide.d.ts +0 -269
  834. package/dist/chat-delivery-state.d.ts +0 -132
  835. package/dist/chat-delivery.d.ts +0 -71
  836. package/dist/chat-display.d.ts +0 -1
  837. package/dist/chat-evidence.d.ts +0 -123
  838. package/dist/chat-flow.d.ts +0 -70
  839. package/dist/chat-follow.d.ts +0 -20
  840. package/dist/chat-inbox.d.ts +0 -57
  841. package/dist/chat-live-schema.d.ts +0 -17
  842. package/dist/chat-live.d.ts +0 -161
  843. package/dist/chat-message-states.d.ts +0 -75
  844. package/dist/chat-messages.d.ts +0 -338
  845. package/dist/chat-migration.d.ts +0 -30
  846. package/dist/chat-polish.d.ts +0 -17
  847. package/dist/chat-quiet.d.ts +0 -40
  848. package/dist/chat-review.d.ts +0 -51
  849. package/dist/chat-rooms.d.ts +0 -123
  850. package/dist/chat-settings-page.d.ts +0 -43
  851. package/dist/chat-task-actions.d.ts +0 -59
  852. package/dist/chat-terms.d.ts +0 -29
  853. package/dist/chat-voice.d.ts +0 -69
  854. package/dist/chat-warmth.d.ts +0 -21
  855. package/dist/check-access.d.ts +0 -54
  856. package/dist/check-facts.d.ts +0 -126
  857. package/dist/check-failure.d.ts +0 -113
  858. package/dist/check-levels-ui.d.ts +0 -36
  859. package/dist/check-levels.d.ts +0 -70
  860. package/dist/check-load.d.ts +0 -85
  861. package/dist/check-only-standing.d.ts +0 -36
  862. package/dist/check-only.d.ts +0 -15
  863. package/dist/check-progress.d.ts +0 -78
  864. package/dist/check-repair.d.ts +0 -47
  865. package/dist/check-report.d.ts +0 -177
  866. package/dist/check-stamp.d.ts +0 -46
  867. package/dist/checkout-cleanup.d.ts +0 -157
  868. package/dist/checkout-proof.d.ts +0 -28
  869. package/dist/child-database.d.ts +0 -12
  870. package/dist/claim.d.ts +0 -627
  871. package/dist/claude-print.d.ts +0 -12
  872. package/dist/cli-fast.d.ts +0 -8
  873. package/dist/cli-help.d.ts +0 -8
  874. package/dist/cli-http.d.ts +0 -58
  875. package/dist/cli.d.ts +0 -149
  876. package/dist/code-extract.d.ts +0 -44
  877. package/dist/code-map-acts.d.ts +0 -24
  878. package/dist/code-map-admission.d.ts +0 -52
  879. package/dist/code-map-build.d.ts +0 -63
  880. package/dist/code-map-cli.d.ts +0 -153
  881. package/dist/code-map-main.d.ts +0 -1
  882. package/dist/code-map-read.d.ts +0 -106
  883. package/dist/code-map-report.d.ts +0 -37
  884. package/dist/code-map-shape.d.ts +0 -172
  885. package/dist/code-map-store.d.ts +0 -136
  886. package/dist/codex-limits.d.ts +0 -15
  887. package/dist/coding-context.d.ts +0 -18
  888. package/dist/coding-handoff.d.ts +0 -39
  889. package/dist/coding-provider.d.ts +0 -88
  890. package/dist/coding-shipping-ui.d.ts +0 -5
  891. package/dist/coding-types.d.ts +0 -16
  892. package/dist/coding-ui.d.ts +0 -19
  893. package/dist/coding-update.d.ts +0 -28
  894. package/dist/coding-workspace.d.ts +0 -141
  895. package/dist/commit-extract.d.ts +0 -135
  896. package/dist/connect-cli.d.ts +0 -34
  897. package/dist/console-chrome.d.ts +0 -41
  898. package/dist/console-instance.d.ts +0 -157
  899. package/dist/container-state.d.ts +0 -5
  900. package/dist/containment.d.ts +0 -205
  901. package/dist/contract-changes.d.ts +0 -52
  902. package/dist/contracts/acceptance-terms.d.ts +0 -14
  903. package/dist/contracts/chat-actions.d.ts +0 -465
  904. package/dist/contracts/chat-callback-rows.d.ts +0 -59
  905. package/dist/contracts/chat-card.d.ts +0 -91
  906. package/dist/contracts/chat-content.d.ts +0 -551
  907. package/dist/contracts/chat-tables.d.ts +0 -12
  908. package/dist/contracts/cli.d.ts +0 -987
  909. package/dist/contracts/coding-activity.d.ts +0 -64
  910. package/dist/contracts/coding-context.d.ts +0 -97
  911. package/dist/contracts/coding-handoff.d.ts +0 -44
  912. package/dist/contracts/coding-workspace.d.ts +0 -165
  913. package/dist/contracts/console-api.d.ts +0 -539
  914. package/dist/contracts/contract-test.d.ts +0 -45
  915. package/dist/contracts/contract.d.ts +0 -92
  916. package/dist/contracts/decision.d.ts +0 -45
  917. package/dist/contracts/diff-stat.d.ts +0 -58
  918. package/dist/contracts/discord-callback.d.ts +0 -45
  919. package/dist/contracts/flow-card.d.ts +0 -53
  920. package/dist/contracts/flow-propose.d.ts +0 -334
  921. package/dist/contracts/flow-send.d.ts +0 -245
  922. package/dist/contracts/flow.d.ts +0 -19565
  923. package/dist/contracts/gateway-tools.d.ts +0 -472
  924. package/dist/contracts/handoff.d.ts +0 -91
  925. package/dist/contracts/health.d.ts +0 -82
  926. package/dist/contracts/integration-metadata.d.ts +0 -100
  927. package/dist/contracts/lead-context.d.ts +0 -165
  928. package/dist/contracts/lead-tools.d.ts +0 -2312
  929. package/dist/contracts/mcp-oauth.d.ts +0 -53
  930. package/dist/contracts/memory-pass.d.ts +0 -157
  931. package/dist/contracts/model-catalog.d.ts +0 -21
  932. package/dist/contracts/observation-request.d.ts +0 -37
  933. package/dist/contracts/plan.d.ts +0 -58
  934. package/dist/contracts/project-knowledge.d.ts +0 -159
  935. package/dist/contracts/project-memory.d.ts +0 -119
  936. package/dist/contracts/project-skills.d.ts +0 -120
  937. package/dist/contracts/proof.d.ts +0 -136
  938. package/dist/contracts/provider.d.ts +0 -40
  939. package/dist/contracts/recipes.d.ts +0 -166
  940. package/dist/contracts/release-check.d.ts +0 -371
  941. package/dist/contracts/release-terms.d.ts +0 -107
  942. package/dist/contracts/retention.d.ts +0 -42
  943. package/dist/contracts/review-findings.d.ts +0 -46
  944. package/dist/contracts/route-results.d.ts +0 -121
  945. package/dist/contracts/route.d.ts +0 -897
  946. package/dist/contracts/scope.d.ts +0 -105
  947. package/dist/contracts/scout-report.d.ts +0 -234
  948. package/dist/contracts/slack-callback.d.ts +0 -43
  949. package/dist/contracts/sort-answer.d.ts +0 -83
  950. package/dist/contracts/stage-output.d.ts +0 -127
  951. package/dist/contracts/storage.d.ts +0 -37
  952. package/dist/contracts/store-json.d.ts +0 -313
  953. package/dist/contracts/subagent-turn.d.ts +0 -43
  954. package/dist/contracts/task-sizing.d.ts +0 -24
  955. package/dist/contracts/teams-callback.d.ts +0 -13
  956. package/dist/contracts/telegram-callback.d.ts +0 -120
  957. package/dist/contracts/trigger-payloads.d.ts +0 -389
  958. package/dist/contracts/update-journal.d.ts +0 -254
  959. package/dist/contracts/verification-receipt.d.ts +0 -200
  960. package/dist/contracts/verification-view.d.ts +0 -102
  961. package/dist/contracts/youiyoux-request.d.ts +0 -248
  962. package/dist/control-setup.d.ts +0 -44
  963. package/dist/control-ui.d.ts +0 -37
  964. package/dist/controller-service.d.ts +0 -1
  965. package/dist/controller-supervisor.d.ts +0 -38
  966. package/dist/converse.d.ts +0 -316
  967. package/dist/coordinator-proposals.d.ts +0 -29
  968. package/dist/coordinator.d.ts +0 -186
  969. package/dist/credentials-ui.d.ts +0 -33
  970. package/dist/daemon.d.ts +0 -226
  971. package/dist/database-reclaim.d.ts +0 -4
  972. package/dist/decision.d.ts +0 -119
  973. package/dist/demo-chat.d.ts +0 -32
  974. package/dist/demo.d.ts +0 -153
  975. package/dist/deploy-gate.d.ts +0 -20
  976. package/dist/deploy-lock.d.ts +0 -8
  977. package/dist/deploy-phase.d.ts +0 -37
  978. package/dist/deploy-rescue.d.ts +0 -42
  979. package/dist/deprecations.d.ts +0 -20
  980. package/dist/design/kit.d.ts +0 -216
  981. package/dist/desktop-access.d.ts +0 -28
  982. package/dist/desktop-bundle.d.ts +0 -16
  983. package/dist/desktop-host.d.ts +0 -54
  984. package/dist/desktop-update-gate.d.ts +0 -12
  985. package/dist/desktop-update-recovery.d.ts +0 -14
  986. package/dist/desktop-update.d.ts +0 -147
  987. package/dist/digest-times.d.ts +0 -3
  988. package/dist/disclosure.d.ts +0 -6
  989. package/dist/discord-api.d.ts +0 -24
  990. package/dist/discord-chat.d.ts +0 -27
  991. package/dist/discord-settings.d.ts +0 -4
  992. package/dist/discord.d.ts +0 -10
  993. package/dist/discover.d.ts +0 -75
  994. package/dist/dispatch.d.ts +0 -123
  995. package/dist/dispose.d.ts +0 -194
  996. package/dist/doctor.d.ts +0 -67
  997. package/dist/easy-start-args.d.ts +0 -13
  998. package/dist/easy-start.d.ts +0 -77
  999. package/dist/egress.d.ts +0 -121
  1000. package/dist/email-settings.d.ts +0 -34
  1001. package/dist/envelope.d.ts +0 -47
  1002. package/dist/eval-gate.d.ts +0 -51
  1003. package/dist/eval-hooks.d.ts +0 -94
  1004. package/dist/eval-oracle-main.d.ts +0 -1
  1005. package/dist/eval-oracle.d.ts +0 -60
  1006. package/dist/eval-world.d.ts +0 -17
  1007. package/dist/evals.d.ts +0 -299
  1008. package/dist/evidence-pack.d.ts +0 -186
  1009. package/dist/evidence-pair.d.ts +0 -53
  1010. package/dist/evidence.d.ts +0 -371
  1011. package/dist/exec.d.ts +0 -355
  1012. package/dist/exhaustion.d.ts +0 -58
  1013. package/dist/export-ui.d.ts +0 -11
  1014. package/dist/export.d.ts +0 -48
  1015. package/dist/failing-first.d.ts +0 -31
  1016. package/dist/fallback-schema.d.ts +0 -8
  1017. package/dist/fallback.d.ts +0 -138
  1018. package/dist/fast-start.d.ts +0 -213
  1019. package/dist/fast-terms.d.ts +0 -9
  1020. package/dist/fenced-check-coverage.d.ts +0 -62
  1021. package/dist/findings.d.ts +0 -224
  1022. package/dist/first-run.d.ts +0 -197
  1023. package/dist/first-tasks-child.d.ts +0 -1
  1024. package/dist/flaky-ci.d.ts +0 -31
  1025. package/dist/flaky-cli.d.ts +0 -60
  1026. package/dist/flaky.d.ts +0 -83
  1027. package/dist/fleet-schema.d.ts +0 -17
  1028. package/dist/flow-actions.d.ts +0 -79
  1029. package/dist/flow-browser.d.ts +0 -103
  1030. package/dist/flow-cadence.d.ts +0 -48
  1031. package/dist/flow-card-task.d.ts +0 -11
  1032. package/dist/flow-changed.d.ts +0 -14
  1033. package/dist/flow-code.d.ts +0 -84
  1034. package/dist/flow-draft.d.ts +0 -42
  1035. package/dist/flow-engine.d.ts +0 -82
  1036. package/dist/flow-gallery-ui.d.ts +0 -73
  1037. package/dist/flow-gallery.d.ts +0 -147
  1038. package/dist/flow-insights.d.ts +0 -104
  1039. package/dist/flow-items.d.ts +0 -37
  1040. package/dist/flow-live.d.ts +0 -16
  1041. package/dist/flow-people.d.ts +0 -23
  1042. package/dist/flow-pull-request.d.ts +0 -14
  1043. package/dist/flow-replies.d.ts +0 -48
  1044. package/dist/flow-result-card.d.ts +0 -22
  1045. package/dist/flow-schedule.d.ts +0 -154
  1046. package/dist/flow-scripts.d.ts +0 -31
  1047. package/dist/flow-secrets.d.ts +0 -13
  1048. package/dist/flow-send.d.ts +0 -54
  1049. package/dist/flow-share.d.ts +0 -78
  1050. package/dist/flow-sort.d.ts +0 -63
  1051. package/dist/flow-starters-ui.d.ts +0 -15
  1052. package/dist/flow-starters.d.ts +0 -63
  1053. package/dist/flow-steps.d.ts +0 -52
  1054. package/dist/flow-triggers.d.ts +0 -303
  1055. package/dist/flow-unattended-words.d.ts +0 -48
  1056. package/dist/flow-unattended.d.ts +0 -259
  1057. package/dist/flows-cli.d.ts +0 -358
  1058. package/dist/flows-ui.d.ts +0 -70
  1059. package/dist/flows.d.ts +0 -136
  1060. package/dist/folder-gate.d.ts +0 -32
  1061. package/dist/folder-look.d.ts +0 -110
  1062. package/dist/follow-through-brief.d.ts +0 -12
  1063. package/dist/follow-through-cli.d.ts +0 -23
  1064. package/dist/fonts.d.ts +0 -19
  1065. package/dist/gaps.d.ts +0 -35
  1066. package/dist/gate-failure.d.ts +0 -40
  1067. package/dist/git-floor.d.ts +0 -16
  1068. package/dist/git-incident.d.ts +0 -65
  1069. package/dist/git-views.d.ts +0 -20
  1070. package/dist/git.d.ts +0 -54
  1071. package/dist/github-import.d.ts +0 -62
  1072. package/dist/github-jobs.d.ts +0 -25
  1073. package/dist/google-mail.d.ts +0 -59
  1074. package/dist/grant.d.ts +0 -136
  1075. package/dist/graph.d.ts +0 -164
  1076. package/dist/guides.d.ts +0 -22
  1077. package/dist/handover-note.d.ts +0 -33
  1078. package/dist/health-cli.d.ts +0 -3
  1079. package/dist/home-groups.d.ts +0 -39
  1080. package/dist/html.d.ts +0 -85
  1081. package/dist/install-method.d.ts +0 -17
  1082. package/dist/integrations-ui.d.ts +0 -17
  1083. package/dist/integrations.d.ts +0 -138
  1084. package/dist/invoke.d.ts +0 -228
  1085. package/dist/is-record.d.ts +0 -2
  1086. package/dist/issues.d.ts +0 -41
  1087. package/dist/jsonl-discriminants.d.ts +0 -11
  1088. package/dist/keymap.d.ts +0 -41
  1089. package/dist/keys.d.ts +0 -108
  1090. package/dist/kits-ui.d.ts +0 -16
  1091. package/dist/kits.d.ts +0 -88
  1092. package/dist/knowledge-cli.d.ts +0 -132
  1093. package/dist/knowledge-ui.d.ts +0 -45
  1094. package/dist/landed-cleanup.d.ts +0 -175
  1095. package/dist/laptop-background.d.ts +0 -187
  1096. package/dist/laptop-service.d.ts +0 -111
  1097. package/dist/latency-timeline.d.ts +0 -46
  1098. package/dist/lead-about.d.ts +0 -35
  1099. package/dist/lead-answer-eval.d.ts +0 -93
  1100. package/dist/lead-capabilities.d.ts +0 -57
  1101. package/dist/lead-cli-live.d.ts +0 -56
  1102. package/dist/lead-cli.d.ts +0 -58
  1103. package/dist/lead-commitments.d.ts +0 -84
  1104. package/dist/lead-context.d.ts +0 -45
  1105. package/dist/lead-contract.d.ts +0 -10
  1106. package/dist/lead-doors.d.ts +0 -122
  1107. package/dist/lead-follow.d.ts +0 -26
  1108. package/dist/lead-identity.d.ts +0 -23
  1109. package/dist/lead-latency-schema.d.ts +0 -24
  1110. package/dist/lead-people.d.ts +0 -55
  1111. package/dist/lead-progress.d.ts +0 -67
  1112. package/dist/lead-queue-runtime.d.ts +0 -46
  1113. package/dist/lead-queue.d.ts +0 -104
  1114. package/dist/lead-route.d.ts +0 -56
  1115. package/dist/lead-status.d.ts +0 -116
  1116. package/dist/lead-sweep.d.ts +0 -67
  1117. package/dist/lead-tools.d.ts +0 -167
  1118. package/dist/lead-voice.d.ts +0 -85
  1119. package/dist/lead.d.ts +0 -142
  1120. package/dist/learning-child.d.ts +0 -1
  1121. package/dist/learning-look.d.ts +0 -25
  1122. package/dist/ledger-chain.d.ts +0 -46
  1123. package/dist/ledger-csv.d.ts +0 -4
  1124. package/dist/ledger-view.d.ts +0 -27
  1125. package/dist/lesson-notes.d.ts +0 -81
  1126. package/dist/limits-ui.d.ts +0 -34
  1127. package/dist/link.d.ts +0 -72
  1128. package/dist/live-backup.d.ts +0 -39
  1129. package/dist/live-bus.d.ts +0 -141
  1130. package/dist/live-children-read.d.ts +0 -52
  1131. package/dist/live-children.d.ts +0 -73
  1132. package/dist/live-detail.d.ts +0 -27
  1133. package/dist/live-input.d.ts +0 -68
  1134. package/dist/live-main-read.d.ts +0 -19
  1135. package/dist/live-notes.d.ts +0 -20
  1136. package/dist/live-open.d.ts +0 -28
  1137. package/dist/live-records.d.ts +0 -149
  1138. package/dist/live-reply.d.ts +0 -83
  1139. package/dist/live-terminal.d.ts +0 -273
  1140. package/dist/live.d.ts +0 -152
  1141. package/dist/local-owner.d.ts +0 -124
  1142. package/dist/log.d.ts +0 -7
  1143. package/dist/login-secrets.d.ts +0 -60
  1144. package/dist/machine-check.d.ts +0 -16
  1145. package/dist/machine-identity.d.ts +0 -75
  1146. package/dist/mailbox.d.ts +0 -57
  1147. package/dist/maintenance.d.ts +0 -13
  1148. package/dist/mcp-connect.d.ts +0 -181
  1149. package/dist/mcp-core.d.ts +0 -110
  1150. package/dist/mcp-http.d.ts +0 -32
  1151. package/dist/mcp-oauth.d.ts +0 -92
  1152. package/dist/mcp-person.d.ts +0 -22
  1153. package/dist/mcp.d.ts +0 -20
  1154. package/dist/memory-cli.d.ts +0 -768
  1155. package/dist/memory-pass.d.ts +0 -151
  1156. package/dist/memory-tidy.d.ts +0 -181
  1157. package/dist/memory-use.d.ts +0 -35
  1158. package/dist/merge-checklist.d.ts +0 -55
  1159. package/dist/metrics.d.ts +0 -6
  1160. package/dist/mobile-viewport.d.ts +0 -7
  1161. package/dist/model-catalog.d.ts +0 -123
  1162. package/dist/model-choices.d.ts +0 -235
  1163. package/dist/model-names.d.ts +0 -6
  1164. package/dist/models-cli.d.ts +0 -307
  1165. package/dist/models-ui.d.ts +0 -161
  1166. package/dist/modes.d.ts +0 -99
  1167. package/dist/monitoring-settings.d.ts +0 -44
  1168. package/dist/monitoring-ui.d.ts +0 -23
  1169. package/dist/monitoring.d.ts +0 -34
  1170. package/dist/names.d.ts +0 -67
  1171. package/dist/needs-you.d.ts +0 -164
  1172. package/dist/never-index.d.ts +0 -3
  1173. package/dist/nightly-check.d.ts +0 -107
  1174. package/dist/nightly-github.d.ts +0 -318
  1175. package/dist/notification-delivery.d.ts +0 -19
  1176. package/dist/notification-rows.d.ts +0 -30
  1177. package/dist/oauth-run-token.d.ts +0 -51
  1178. package/dist/observations.d.ts +0 -36
  1179. package/dist/oidc.d.ts +0 -71
  1180. package/dist/onboard.d.ts +0 -108
  1181. package/dist/one-step-chat-schema.d.ts +0 -22
  1182. package/dist/openrouter-models.d.ts +0 -34
  1183. package/dist/operate-remote-arguments.d.ts +0 -36
  1184. package/dist/operate-remote.d.ts +0 -98
  1185. package/dist/operate.d.ts +0 -401
  1186. package/dist/orphan-sweep.d.ts +0 -65
  1187. package/dist/page-work-contract.d.ts +0 -21
  1188. package/dist/password-bearer.d.ts +0 -25
  1189. package/dist/passwordless.d.ts +0 -23
  1190. package/dist/peek-cli.d.ts +0 -112
  1191. package/dist/peek.d.ts +0 -110
  1192. package/dist/people-audit-ui.d.ts +0 -16
  1193. package/dist/person-proof.d.ts +0 -2
  1194. package/dist/phase-routing.d.ts +0 -401
  1195. package/dist/plain-schema.d.ts +0 -23
  1196. package/dist/plain-words.d.ts +0 -20
  1197. package/dist/plan-auto.d.ts +0 -25
  1198. package/dist/plan-login.d.ts +0 -14
  1199. package/dist/plan.d.ts +0 -188
  1200. package/dist/plane-review.d.ts +0 -54
  1201. package/dist/planner-source.d.ts +0 -225
  1202. package/dist/planner.d.ts +0 -76
  1203. package/dist/policy-ui.d.ts +0 -22
  1204. package/dist/policy.d.ts +0 -92
  1205. package/dist/prepared-evidence.d.ts +0 -17
  1206. package/dist/principal.d.ts +0 -42
  1207. package/dist/probe.d.ts +0 -46
  1208. package/dist/process-custody.d.ts +0 -17
  1209. package/dist/process-liveness.d.ts +0 -13
  1210. package/dist/process-tree.d.ts +0 -39
  1211. package/dist/project-access.d.ts +0 -17
  1212. package/dist/project-activity.d.ts +0 -20
  1213. package/dist/project-admission.d.ts +0 -105
  1214. package/dist/project-cli.d.ts +0 -19
  1215. package/dist/project-concurrency.d.ts +0 -62
  1216. package/dist/project-delete-ui.d.ts +0 -96
  1217. package/dist/project-delete.d.ts +0 -59
  1218. package/dist/project-demo.d.ts +0 -12
  1219. package/dist/project-file.d.ts +0 -3
  1220. package/dist/project-identity.d.ts +0 -52
  1221. package/dist/project-knowledge.d.ts +0 -124
  1222. package/dist/project-learning.d.ts +0 -120
  1223. package/dist/project-memory.d.ts +0 -70
  1224. package/dist/project-outcomes.d.ts +0 -119
  1225. package/dist/project-sandbox.d.ts +0 -59
  1226. package/dist/project-skills.d.ts +0 -139
  1227. package/dist/project-tools.d.ts +0 -318
  1228. package/dist/project.d.ts +0 -65
  1229. package/dist/prompt.d.ts +0 -33
  1230. package/dist/proof.d.ts +0 -457
  1231. package/dist/proposal.d.ts +0 -70
  1232. package/dist/protected-storage-look.d.ts +0 -1
  1233. package/dist/protected-storage.d.ts +0 -98
  1234. package/dist/provider-auth.d.ts +0 -143
  1235. package/dist/provider-capture.d.ts +0 -34
  1236. package/dist/provider-connection.d.ts +0 -23
  1237. package/dist/provider-home.d.ts +0 -22
  1238. package/dist/provider-limits.d.ts +0 -37
  1239. package/dist/provider.d.ts +0 -369
  1240. package/dist/public-access.d.ts +0 -52
  1241. package/dist/public-check.d.ts +0 -37
  1242. package/dist/publish.d.ts +0 -146
  1243. package/dist/pull-request-flow.d.ts +0 -189
  1244. package/dist/pull-request-schema.d.ts +0 -5
  1245. package/dist/pull-request-ui.d.ts +0 -25
  1246. package/dist/pulls.d.ts +0 -121
  1247. package/dist/push.d.ts +0 -120
  1248. package/dist/quality.d.ts +0 -8
  1249. package/dist/quick-start.d.ts +0 -26
  1250. package/dist/read-executor-worker.d.ts +0 -1
  1251. package/dist/read-executor.d.ts +0 -66
  1252. package/dist/read-only-request.d.ts +0 -4
  1253. package/dist/recipe-ui.d.ts +0 -21
  1254. package/dist/recipes.d.ts +0 -56
  1255. package/dist/release-adapters.d.ts +0 -205
  1256. package/dist/release-approval.d.ts +0 -180
  1257. package/dist/release-authority.d.ts +0 -173
  1258. package/dist/release-auto.d.ts +0 -184
  1259. package/dist/release-card.d.ts +0 -156
  1260. package/dist/release-carry.d.ts +0 -261
  1261. package/dist/release-ci-hold.d.ts +0 -41
  1262. package/dist/release-cli.d.ts +0 -34
  1263. package/dist/release-coverage.d.ts +0 -16
  1264. package/dist/release-gate.d.ts +0 -84
  1265. package/dist/release-git.d.ts +0 -43
  1266. package/dist/release-links.d.ts +0 -29
  1267. package/dist/release-net.d.ts +0 -90
  1268. package/dist/release-next.d.ts +0 -48
  1269. package/dist/release-recheck.d.ts +0 -146
  1270. package/dist/release-refusal.d.ts +0 -32
  1271. package/dist/release-view.d.ts +0 -37
  1272. package/dist/release.d.ts +0 -806
  1273. package/dist/releases.d.ts +0 -94
  1274. package/dist/remote-audit.d.ts +0 -79
  1275. package/dist/remote-command.d.ts +0 -45
  1276. package/dist/remote-destination.d.ts +0 -36
  1277. package/dist/remote-exec.d.ts +0 -38
  1278. package/dist/remote-main.d.ts +0 -111
  1279. package/dist/remote-run.d.ts +0 -20
  1280. package/dist/remote.d.ts +0 -67
  1281. package/dist/render.d.ts +0 -64
  1282. package/dist/reply-shape.d.ts +0 -106
  1283. package/dist/reply-voice.d.ts +0 -23
  1284. package/dist/report-summary.d.ts +0 -22
  1285. package/dist/reported-usage.d.ts +0 -69
  1286. package/dist/repos.d.ts +0 -67
  1287. package/dist/repository-context-ui.d.ts +0 -3
  1288. package/dist/repository-context.d.ts +0 -66
  1289. package/dist/request-budget-ui.d.ts +0 -14
  1290. package/dist/request-budget.d.ts +0 -127
  1291. package/dist/restart-certification.d.ts +0 -133
  1292. package/dist/result-actions.d.ts +0 -36
  1293. package/dist/result-acts.d.ts +0 -112
  1294. package/dist/result-completion.d.ts +0 -35
  1295. package/dist/result-evidence-readers.d.ts +0 -42
  1296. package/dist/result-follow-ups.d.ts +0 -118
  1297. package/dist/result-review.d.ts +0 -220
  1298. package/dist/result-shots.d.ts +0 -59
  1299. package/dist/retention-ui.d.ts +0 -21
  1300. package/dist/retention.d.ts +0 -77
  1301. package/dist/review-context.d.ts +0 -245
  1302. package/dist/review-evidence.d.ts +0 -33
  1303. package/dist/review-switch.d.ts +0 -36
  1304. package/dist/reviewer.d.ts +0 -99
  1305. package/dist/route-change-check.d.ts +0 -4
  1306. package/dist/route-change.d.ts +0 -22
  1307. package/dist/route-hooks.d.ts +0 -54
  1308. package/dist/route-results.d.ts +0 -75
  1309. package/dist/route-rules.d.ts +0 -324
  1310. package/dist/route-savings.d.ts +0 -136
  1311. package/dist/route-store.d.ts +0 -300
  1312. package/dist/run-closeout.d.ts +0 -89
  1313. package/dist/run-efficiency.d.ts +0 -74
  1314. package/dist/run-ending.d.ts +0 -21
  1315. package/dist/runner-process.d.ts +0 -76
  1316. package/dist/runner.d.ts +0 -324
  1317. package/dist/sample-project.d.ts +0 -31
  1318. package/dist/sandbox-launch.d.ts +0 -1
  1319. package/dist/sandbox-runtime.d.ts +0 -128
  1320. package/dist/scan.d.ts +0 -32
  1321. package/dist/scope.d.ts +0 -1067
  1322. package/dist/scout-browser-lock.d.ts +0 -69
  1323. package/dist/scout-browser.d.ts +0 -107
  1324. package/dist/scout-net.d.ts +0 -25
  1325. package/dist/scout-report.d.ts +0 -23
  1326. package/dist/scout.d.ts +0 -142
  1327. package/dist/secret-mint.d.ts +0 -1
  1328. package/dist/serve.d.ts +0 -11
  1329. package/dist/server/agents-computers.d.ts +0 -9
  1330. package/dist/server/agents-live-filed.d.ts +0 -17
  1331. package/dist/server/agents-live-lead.d.ts +0 -47
  1332. package/dist/server/agents-live-room.d.ts +0 -23
  1333. package/dist/server/chat.d.ts +0 -39
  1334. package/dist/server/chrome.d.ts +0 -328
  1335. package/dist/server/edge-refusal.d.ts +0 -7
  1336. package/dist/server/flows.d.ts +0 -8
  1337. package/dist/server/guards.d.ts +0 -80
  1338. package/dist/server/handler-context.d.ts +0 -22
  1339. package/dist/server/handler-registry.d.ts +0 -23
  1340. package/dist/server/home-asks.d.ts +0 -45
  1341. package/dist/server/home.d.ts +0 -65
  1342. package/dist/server/http.d.ts +0 -337
  1343. package/dist/server/in-place.d.ts +0 -15
  1344. package/dist/server/kit-standalone.d.ts +0 -22
  1345. package/dist/server/kit.d.ts +0 -452
  1346. package/dist/server/last-checks.d.ts +0 -17
  1347. package/dist/server/live.d.ts +0 -74
  1348. package/dist/server/merge-ready-view.d.ts +0 -10
  1349. package/dist/server/mutation-key.d.ts +0 -70
  1350. package/dist/server/pages-assets.d.ts +0 -11
  1351. package/dist/server/pages.d.ts +0 -8
  1352. package/dist/server/people-tokens.d.ts +0 -18
  1353. package/dist/server/remote-hooks.d.ts +0 -29
  1354. package/dist/server/remote.d.ts +0 -59
  1355. package/dist/server/render-chat.d.ts +0 -439
  1356. package/dist/server/render-code-map.d.ts +0 -30
  1357. package/dist/server/render-flaky.d.ts +0 -20
  1358. package/dist/server/render-follow-through.d.ts +0 -11
  1359. package/dist/server/render-history.d.ts +0 -51
  1360. package/dist/server/render-new-task.d.ts +0 -54
  1361. package/dist/server/render-pages.d.ts +0 -236
  1362. package/dist/server/render-people.d.ts +0 -102
  1363. package/dist/server/render-projects.d.ts +0 -104
  1364. package/dist/server/render-release.d.ts +0 -19
  1365. package/dist/server/render-results.d.ts +0 -754
  1366. package/dist/server/render-settings.d.ts +0 -93
  1367. package/dist/server/render-tasks.d.ts +0 -774
  1368. package/dist/server/request-context.d.ts +0 -78
  1369. package/dist/server/retired-routes.d.ts +0 -17
  1370. package/dist/server/route-policy.d.ts +0 -18
  1371. package/dist/server/route-table.d.ts +0 -114
  1372. package/dist/server/runtime.d.ts +0 -342
  1373. package/dist/server/session.d.ts +0 -192
  1374. package/dist/server/settings.d.ts +0 -76
  1375. package/dist/server/signup-gate.d.ts +0 -9
  1376. package/dist/server/sweeps.d.ts +0 -4
  1377. package/dist/server/task-views.d.ts +0 -98
  1378. package/dist/server/tasks.d.ts +0 -83
  1379. package/dist/server/terminals.d.ts +0 -31
  1380. package/dist/server/welcome.d.ts +0 -28
  1381. package/dist/server-telemetry.d.ts +0 -87
  1382. package/dist/settings-groups-ui.d.ts +0 -286
  1383. package/dist/settings-kit-script.d.ts +0 -21
  1384. package/dist/settings-kit.d.ts +0 -173
  1385. package/dist/settings-proofs.d.ts +0 -64
  1386. package/dist/setup-guide.d.ts +0 -39
  1387. package/dist/shared-deps.d.ts +0 -115
  1388. package/dist/sign-in-guard.d.ts +0 -70
  1389. package/dist/skills-ui.d.ts +0 -12
  1390. package/dist/skills.d.ts +0 -99
  1391. package/dist/slack-api.d.ts +0 -59
  1392. package/dist/slack-chat.d.ts +0 -37
  1393. package/dist/slack-settings.d.ts +0 -4
  1394. package/dist/slack-socket.d.ts +0 -12
  1395. package/dist/slack.d.ts +0 -6
  1396. package/dist/sleep.d.ts +0 -2
  1397. package/dist/source-key.d.ts +0 -2
  1398. package/dist/spend-report.d.ts +0 -87
  1399. package/dist/spend-ui.d.ts +0 -80
  1400. package/dist/spend.d.ts +0 -142
  1401. package/dist/sqlite-runtime.d.ts +0 -3
  1402. package/dist/sqlite-telemetry.d.ts +0 -9
  1403. package/dist/sso-settings.d.ts +0 -33
  1404. package/dist/sso-ui.d.ts +0 -26
  1405. package/dist/staged-runtimes.d.ts +0 -54
  1406. package/dist/steer-capabilities.d.ts +0 -32
  1407. package/dist/steer-controls.d.ts +0 -14
  1408. package/dist/steer-live.d.ts +0 -19
  1409. package/dist/steer-mailbox.d.ts +0 -46
  1410. package/dist/steer-status.d.ts +0 -25
  1411. package/dist/stop-proof.d.ts +0 -67
  1412. package/dist/storage-sweep-child.d.ts +0 -1
  1413. package/dist/storage-sweep-process.d.ts +0 -55
  1414. package/dist/storage-sweep-schedule.d.ts +0 -30
  1415. package/dist/storage-sweep.d.ts +0 -77
  1416. package/dist/storage-ui.d.ts +0 -23
  1417. package/dist/storage.d.ts +0 -68
  1418. package/dist/store-baseline.d.ts +0 -19
  1419. package/dist/store.d.ts +0 -8613
  1420. package/dist/stream-scope.d.ts +0 -18
  1421. package/dist/structured-output.d.ts +0 -57
  1422. package/dist/style-asset.d.ts +0 -7
  1423. package/dist/subagent-admin.d.ts +0 -53
  1424. package/dist/subagent-desk.d.ts +0 -59
  1425. package/dist/subagent-memory.d.ts +0 -65
  1426. package/dist/subagent-question.d.ts +0 -59
  1427. package/dist/subagent-tools.d.ts +0 -125
  1428. package/dist/subagent-week.d.ts +0 -68
  1429. package/dist/subagent-work.d.ts +0 -76
  1430. package/dist/subagents-ui.d.ts +0 -22
  1431. package/dist/subagents.d.ts +0 -146
  1432. package/dist/subscription-chat.d.ts +0 -54
  1433. package/dist/summary.d.ts +0 -33
  1434. package/dist/surface.d.ts +0 -49
  1435. package/dist/sweep-gate.d.ts +0 -10
  1436. package/dist/sweep-quarantine.d.ts +0 -29
  1437. package/dist/sync.d.ts +0 -94
  1438. package/dist/tailnet.d.ts +0 -11
  1439. package/dist/tamper-scan.d.ts +0 -4
  1440. package/dist/task-activity.d.ts +0 -27
  1441. package/dist/task-aliases.d.ts +0 -5
  1442. package/dist/task-archive.d.ts +0 -13
  1443. package/dist/task-base.d.ts +0 -39
  1444. package/dist/task-composer.d.ts +0 -14
  1445. package/dist/task-control.d.ts +0 -159
  1446. package/dist/task-live.d.ts +0 -8
  1447. package/dist/task-moves.d.ts +0 -90
  1448. package/dist/task-outcome-cli.d.ts +0 -30
  1449. package/dist/task-review-brief.d.ts +0 -69
  1450. package/dist/task-sizing.d.ts +0 -58
  1451. package/dist/task-source.d.ts +0 -77
  1452. package/dist/task-status.d.ts +0 -324
  1453. package/dist/task-text.d.ts +0 -31
  1454. package/dist/team-chat-authorization.d.ts +0 -11
  1455. package/dist/team-contract.d.ts +0 -103
  1456. package/dist/team-http.d.ts +0 -25
  1457. package/dist/team-leads.d.ts +0 -85
  1458. package/dist/team-runtime.d.ts +0 -25
  1459. package/dist/team-ui.d.ts +0 -4
  1460. package/dist/team-updates.d.ts +0 -8
  1461. package/dist/teams-api.d.ts +0 -33
  1462. package/dist/teams-chat.d.ts +0 -36
  1463. package/dist/teams-settings.d.ts +0 -14
  1464. package/dist/teams.d.ts +0 -24
  1465. package/dist/teardown-git.d.ts +0 -164
  1466. package/dist/telegram-flow.d.ts +0 -112
  1467. package/dist/telegram-lead.d.ts +0 -151
  1468. package/dist/telegram-live.d.ts +0 -116
  1469. package/dist/telegram-progress.d.ts +0 -20
  1470. package/dist/telegram-settings.d.ts +0 -9
  1471. package/dist/telegram-status.d.ts +0 -83
  1472. package/dist/telegram-team.d.ts +0 -68
  1473. package/dist/telegram.d.ts +0 -271
  1474. package/dist/templates.d.ts +0 -69
  1475. package/dist/terminal-catalog.d.ts +0 -11
  1476. package/dist/terminal-text.d.ts +0 -11
  1477. package/dist/test-infra.d.ts +0 -34
  1478. package/dist/test-temp.d.ts +0 -40
  1479. package/dist/text-limits.d.ts +0 -297
  1480. package/dist/tidy.d.ts +0 -130
  1481. package/dist/tier-report.d.ts +0 -44
  1482. package/dist/token-notices.d.ts +0 -11
  1483. package/dist/tokens-cli.d.ts +0 -21
  1484. package/dist/tool-broker.d.ts +0 -52
  1485. package/dist/tool-launcher.d.ts +0 -1
  1486. package/dist/tool-secret-store.d.ts +0 -167
  1487. package/dist/toolroll-update-cli.d.ts +0 -15
  1488. package/dist/toolroll-update-ui.d.ts +0 -47
  1489. package/dist/toolroll-update.d.ts +0 -265
  1490. package/dist/tools-ui.d.ts +0 -51
  1491. package/dist/transitions-recipes.d.ts +0 -1
  1492. package/dist/tree-proof.d.ts +0 -34
  1493. package/dist/tui-contract.d.ts +0 -144
  1494. package/dist/tui-source.d.ts +0 -14
  1495. package/dist/typed-start.d.ts +0 -51
  1496. package/dist/unfenced-test-support.d.ts +0 -2
  1497. package/dist/up-processes.d.ts +0 -162
  1498. package/dist/up-role-child.d.ts +0 -1
  1499. package/dist/update-notice.d.ts +0 -5
  1500. package/dist/vanished-retry.d.ts +0 -30
  1501. package/dist/verification-evidence.d.ts +0 -68
  1502. package/dist/version.d.ts +0 -2
  1503. package/dist/wake-hub.d.ts +0 -72
  1504. package/dist/webhook-limits.d.ts +0 -23
  1505. package/dist/webhook-readers.d.ts +0 -56
  1506. package/dist/webhook-signing.d.ts +0 -27
  1507. package/dist/webhooks.d.ts +0 -84
  1508. package/dist/welcome-facts.d.ts +0 -18
  1509. package/dist/when-html.d.ts +0 -40
  1510. package/dist/work-index.d.ts +0 -175
  1511. package/dist/work-summary.d.ts +0 -61
  1512. package/dist/workspace-motion.d.ts +0 -4
  1513. package/dist/workspace-revision.d.ts +0 -48
  1514. package/dist/workspace-ui.d.ts +0 -385
  1515. package/dist/worktree-notices.d.ts +0 -13
  1516. package/dist/worktree.d.ts +0 -365
  1517. package/dist/writes-mode.d.ts +0 -9
  1518. 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
- // A request the planner cannot be given waits on a person; the status card above already says what to shorten.
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." : "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."}</span></p></div>`
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
- // The Plan section after its scope card: the release, the recipe and audit links, the agents, the edit form.
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` } : null;
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
+ }