toolroll 0.9.92 → 0.9.93

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 (65) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/assignment-status.d.ts +1 -1
  3. package/dist/assignment-ui.js +2 -2
  4. package/dist/assignment.js +11 -3
  5. package/dist/browser/workspace.css +1 -1
  6. package/dist/browser/workspace.js +30 -30
  7. package/dist/browser-crew.js +2 -2
  8. package/dist/browser-workspace.d.ts +3 -5
  9. package/dist/builder.js +21 -2
  10. package/dist/check-facts.d.ts +124 -0
  11. package/dist/check-facts.js +272 -0
  12. package/dist/check-report.d.ts +5 -0
  13. package/dist/check-report.js +4 -3
  14. package/dist/cli.js +5 -0
  15. package/dist/contracts/console-api.d.ts +2 -2
  16. package/dist/contracts/console-api.js +2 -2
  17. package/dist/contracts/release-check.d.ts +25 -1
  18. package/dist/contracts/release-check.js +19 -0
  19. package/dist/desktop-update.d.ts +2 -2
  20. package/dist/desktop-update.js +13 -9
  21. package/dist/eval-hooks.d.ts +55 -0
  22. package/dist/eval-hooks.js +227 -4
  23. package/dist/flaky.d.ts +17 -0
  24. package/dist/flaky.js +9 -0
  25. package/dist/needs-you.d.ts +7 -7
  26. package/dist/needs-you.js +12 -10
  27. package/dist/operate.js +138 -18
  28. package/dist/project-delete.js +5 -1
  29. package/dist/project-knowledge.d.ts +6 -6
  30. package/dist/push.d.ts +10 -3
  31. package/dist/push.js +22 -6
  32. package/dist/release-adapters.js +11 -1
  33. package/dist/release-approval.d.ts +191 -0
  34. package/dist/release-approval.js +382 -0
  35. package/dist/release-auto.js +13 -4
  36. package/dist/release-card.d.ts +73 -4
  37. package/dist/release-card.js +168 -23
  38. package/dist/release-cli.js +9 -1
  39. package/dist/release.d.ts +30 -0
  40. package/dist/release.js +42 -3
  41. package/dist/result-acts.d.ts +3 -3
  42. package/dist/result-acts.js +1 -1
  43. package/dist/server/guards.js +1 -0
  44. package/dist/server/pages-assets.js +1 -1
  45. package/dist/server/render-release.d.ts +17 -0
  46. package/dist/server/render-release.js +84 -0
  47. package/dist/server/render-results.d.ts +0 -2
  48. package/dist/server/render-results.js +4 -6
  49. package/dist/server/render-tasks.js +3 -3
  50. package/dist/server/route-table.d.ts +1 -1
  51. package/dist/server/route-table.js +7 -1
  52. package/dist/server/tasks.d.ts +15 -0
  53. package/dist/server/tasks.js +102 -20
  54. package/dist/setup-guide.d.ts +2 -2
  55. package/dist/stop-proof.d.ts +67 -0
  56. package/dist/stop-proof.js +293 -0
  57. package/dist/store.d.ts +70 -31
  58. package/dist/store.js +335 -95
  59. package/dist/surface.js +1 -1
  60. package/dist/task-outcome-cli.js +19 -0
  61. package/dist/toolroll-update-ui.js +2 -2
  62. package/dist/toolroll-update.js +1 -0
  63. package/dist/work-index.js +7 -9
  64. package/dist/work-summary.d.ts +2 -2
  65. package/package.json +1 -1
@@ -41,7 +41,7 @@ const AGENT_ASK = `(SELECT q.id FROM agent_question q JOIN run qr ON qr.id=q.run
41
41
  const GATE_PAUSE_ON_TASK = pauseOnTaskProviders('p', 'c.ref_id');
42
42
  /** Index codes that wait on a person, as their need (needs-you.ts); dispatch codes come from task-status's own table. */
43
43
  const INDEX_NEED = {
44
- 'earlier-active': 'earlier-version', 'process-needs-attention': 'confirm-stopped', 'invalid-scope': 'define-task', 'decision-queue': 'questions',
44
+ 'earlier-active': 'earlier-version', 'process-needs-attention': 'stop-unproven', 'invalid-scope': 'define-task', 'decision-queue': 'questions',
45
45
  };
46
46
  /** Every index code that can wait on a person. */
47
47
  const PERSON_CODES = ['history-problem', 'earlier-active', 'ready-to-check', 'waiting-decision', 'decision-queue', 'result-needs-attention',
@@ -572,7 +572,7 @@ function itemOf(row, principal, probe, leadName, readiness, readable = false) {
572
572
  const code = String(row['code']), id = String(row['id']);
573
573
  const custody = code === 'process-needs-attention' || (code === 'result-needs-attention' && n(row, 'custody_unresolved') === 1);
574
574
  const process = custody && probe !== undefined ? processNeedOf(probe(id)) : null;
575
- const waiting = process !== null && 'wait' in process;
575
+ const waiting = (process !== null && 'wait' in process) || (custody && probe === undefined);
576
576
  const need = n(row, 'needs') === 1 && !waiting, running = n(row, 'family_running') === 1;
577
577
  // The lead's claim (lead-voice.ts): the row still reads its own stage, worded "<name> is on it".
578
578
  const lead = n(row, 'lead_claim') === 1 ? 'on-it' : n(row, 'lead_claim') === 2 ? 'lapsed' : null;
@@ -647,14 +647,11 @@ function itemOf(row, principal, probe, leadName, readiness, readable = false) {
647
647
  actionCode = 'open-result';
648
648
  actionLabel = 'Open result';
649
649
  }
650
+ // Toolroll proves a build stopped itself; only a stop it can't prove from here offers "Check again", never a vouch.
650
651
  if (process !== null && 'need' in process) {
651
- actionCode = 'confirm-stopped';
652
+ actionCode = 'recheck-stopped';
652
653
  actionLabel = NEEDS[process.need].action.label;
653
654
  }
654
- else if (custody && probe === undefined) {
655
- actionCode = 'confirm-stopped';
656
- actionLabel = NEEDS['confirm-stopped'].action.label;
657
- }
658
655
  if (code === 'signed-out') {
659
656
  actionCode = 'sign-in';
660
657
  actionLabel = NEEDS['sign-in'].action.label;
@@ -668,7 +665,7 @@ function itemOf(row, principal, probe, leadName, readiness, readable = false) {
668
665
  target: { taskId: successor ?? (code === 'earlier-active' ? s(row, 'earlier_id') ?? id : actionCode === 'answer-decision' ? s(row, 'question_task') ?? id : id),
669
666
  runId: actionCode === 'answer-decision' ? n(row, 'question_run') || null : actionCode === 'answer-agent' ? n(row, 'agent_ask_run') || null : actionCode === 'inspect-run' && code === 'running' ? n(row, 'live_run') || null : actionCode === 'open-result' || actionCode === 'inspect-run' ? n(row, 'result_id') || null
670
667
  : actionCode === 'reconcile-run' ? n(row, 'unfinished') || null : ['resume-run', 'inspect-stop'].includes(actionCode) ? n(row, 'stop_run') || null
671
- : actionCode === 'confirm-stopped' ? process?.build ?? (n(row, 'result_id') || null) : null,
668
+ : actionCode === 'recheck-stopped' ? process?.build ?? (n(row, 'result_id') || null) : null,
672
669
  decisionId: actionCode === 'answer-decision' ? n(row, 'question_id') || null : null },
673
670
  access: read ? 'read' : principal === 'operator' ? 'operator-control' : ['answer-decision', 'answer-agent', 'write-scope', 'unhold'].includes(actionCode) ? 'proposal-only' : 'operator-handoff',
674
671
  retry: actionCode === 'reconcile-run' ? 'reconcile-before-retry' : read ? 'read-again' : 'refresh-before-acting' };
@@ -676,7 +673,8 @@ function itemOf(row, principal, probe, leadName, readiness, readable = false) {
676
673
  const coded = stageOfCode(code, { needsPerson: personNeed, planning: s(row, 'live_role') === 'planner', operatorHold: s(row, 'hold_kind') === 'operator' });
677
674
  const reading = process !== null
678
675
  ? 'wait' in process ? { stage: 'waiting', wait: process.wait } : { stage: 'needs-you', need: process.need }
679
- : custody ? { stage: 'needs-you', need: 'confirm-stopped' }
676
+ // Not read here (no process probe): Toolroll's own stop check settles it, so it waits on no one.
677
+ : custody ? { stage: 'waiting', wait: 'build-checking' }
680
678
  : coded.stage === 'needs-you' && (coded.need === undefined || coded.need === 'other') && INDEX_NEED[code] !== undefined ? { stage: 'needs-you', need: INDEX_NEED[code] } : coded;
681
679
  const checkStatus = s(row, 'check_status'), verdict = s(row, 'proof_verdict');
682
680
  const finished = reading.stage === 'finished' || reading.stage === 'complete';
@@ -8,9 +8,9 @@ export type WorkTarget = {
8
8
  decisionId: number | null;
9
9
  };
10
10
  export type WorkAction = {
11
- /** `confirm-stopped`: an approver confirms a finished build stopped (behind the password);
11
+ /** `recheck-stopped`: Toolroll looks again whether a finished build stopped (nobody vouches for it);
12
12
  * `sign-in`: the agent's sign-in, in Settings; `answer-agent`: Reply to a running agent's question on the Agents board. */
13
- code: DispatchAction | "inspect-task" | "inspect-run" | "inspect-stop" | "inspect-decisions" | "reconcile-run" | "open-pr" | "confirm-stopped" | "sign-in" | "answer-agent";
13
+ code: DispatchAction | "inspect-task" | "inspect-run" | "inspect-stop" | "inspect-decisions" | "reconcile-run" | "open-pr" | "recheck-stopped" | "sign-in" | "answer-agent";
14
14
  label: string;
15
15
  target: WorkTarget;
16
16
  access: "read" | "operator-control" | "proposal-only" | "operator-handoff";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toolroll",
3
- "version": "0.9.92",
3
+ "version": "0.9.93",
4
4
  "description": "A control plane for unattended coding agents — queue tasks, walk away, come back to pull requests. Agents build in leased worktrees, never touch your default branch, and interrupt you only for decisions that need a human.",
5
5
  "directories": {
6
6
  "doc": "docs"