toolroll 0.9.11 → 0.9.12

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 (44) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/assignment.d.ts +3 -0
  3. package/dist/assignment.js +3 -1
  4. package/dist/browser/workspace.css +2 -2
  5. package/dist/browser/workspace.js +20 -18
  6. package/dist/browser-workspace.d.ts +61 -0
  7. package/dist/chat-delivery.js +17 -0
  8. package/dist/chat-quiet.js +1 -0
  9. package/dist/chat-voice.d.ts +3 -1
  10. package/dist/chat-voice.js +13 -5
  11. package/dist/cli.d.ts +1 -1
  12. package/dist/cli.js +1 -0
  13. package/dist/coding-update.d.ts +13 -0
  14. package/dist/coding-update.js +68 -0
  15. package/dist/desktop-update.d.ts +7 -0
  16. package/dist/desktop-update.js +42 -1
  17. package/dist/flow-triggers.js +17 -1
  18. package/dist/guides.js +9 -0
  19. package/dist/lead-status.d.ts +10 -1
  20. package/dist/lead-status.js +13 -3
  21. package/dist/lead-voice.d.ts +81 -0
  22. package/dist/lead-voice.js +275 -0
  23. package/dist/needs-you.d.ts +7 -0
  24. package/dist/needs-you.js +9 -0
  25. package/dist/operate.js +80 -4
  26. package/dist/serve.d.ts +5 -1
  27. package/dist/serve.js +438 -224
  28. package/dist/setup-guide.d.ts +2 -2
  29. package/dist/store.js +8 -0
  30. package/dist/surface.js +8 -1
  31. package/dist/task-status.d.ts +6 -0
  32. package/dist/task-status.js +19 -2
  33. package/dist/team-cli.js +1 -1
  34. package/dist/telegram-progress.js +7 -0
  35. package/dist/telegram.js +34 -3
  36. package/dist/test-temp.js +1 -1
  37. package/dist/toolroll-update.d.ts +3 -0
  38. package/dist/toolroll-update.js +13 -2
  39. package/dist/work-index.d.ts +9 -0
  40. package/dist/work-index.js +57 -20
  41. package/dist/work-summary.d.ts +4 -1
  42. package/dist/workspace-ui.d.ts +25 -0
  43. package/dist/workspace-ui.js +20 -1
  44. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.12 — 2026-10-02
4
+
5
+ - **Approving a plan fits one phone screen.** The plan shows up front in plain
6
+ rows (Goal, Changes, Won't touch, Done when) with one Approve & start, pinned
7
+ to the bottom on phones, and a line saying what happens next. The fine print
8
+ sits under Details.
9
+ - **Tasks puts what needs you first.** Waiting work is grouped as Decide,
10
+ Review and Unblock, each with a solid ink chip, and usage folds to one line.
11
+ - **Reviewing a result shows the change before Accept.** Each thing you check
12
+ comes with its evidence and Looks right / Not right; Accept says "Accept
13
+ without checks" when they didn't run, and what accepting does.
14
+ - **Your lead tells you what it's doing.** A task your lead is handling says
15
+ "Your lead is on it" instead of waiting on you, and short updates from your
16
+ lead arrive in chat.
17
+ - **Updates over 0.9.11 work.** Stopping the service no longer leaves the
18
+ coding server's record behind, and a deploy or update that fails after
19
+ stopping it puts the previous version back on its own.
20
+
3
21
  ## 0.9.11 — 2026-10-02
4
22
 
5
23
  - **The Telegram bot always answers.** Replies and notifications go out from
@@ -4,6 +4,7 @@ import { type VerifiedApprover } from "./principal.js";
4
4
  import { type CheckLevel } from "./check-levels.js";
5
5
  import { type BuildReviewView } from "./review-switch.js";
6
6
  import { type NeedKey, type WaitKey } from "./needs-you.js";
7
+ import { type LeadClaim } from "./lead-voice.js";
7
8
  export type AssignmentAccess = WorkSummaryAccess;
8
9
  export type AssignmentOwner = {
9
10
  kind: "coordinator" | "lead";
@@ -108,6 +109,8 @@ export type AssignmentSnapshot = {
108
109
  wait: WaitKey;
109
110
  build: number | null;
110
111
  } | null;
112
+ /** The person's lead took it on (lead-voice.ts): "Your lead is on it" until done, handed on, or two quiet hours. */
113
+ lead?: LeadClaim | null;
111
114
  };
112
115
  /** Status-first handoff for routine reads. Fetch get_assignment only when
113
116
  * inspecting its exact evidence; do not repeat a full proof in every poll. */
@@ -19,6 +19,7 @@ import { followUpChecksOf, withFollowUps } from "./result-follow-ups.js";
19
19
  import { buildReviewOf, findingWords } from "./review-switch.js";
20
20
  import { NEEDS, WAITS, processNeedOf } from "./needs-you.js";
21
21
  import { assignmentStageOf } from "./task-status.js";
22
+ import { leadClaimOf } from "./lead-voice.js";
22
23
  /** Status-first handoff for routine reads. Fetch get_assignment only when
23
24
  * inspecting its exact evidence; do not repeat a full proof in every poll. */
24
25
  export function assignmentBrief(assignment) {
@@ -323,6 +324,7 @@ export function assignmentOf(store, taskId, now, access, root) {
323
324
  action: primaryAction === null ? null : { code: primaryAction.code, target: primaryAction.target },
324
325
  attention, receipt: receipt?.digest ?? null }), acknowledged: false } : null;
325
326
  const publication = result === null ? null : store.publicationForRun(result.id);
327
+ const lead = state === "complete" || state === "cancelled" || access.principal !== "operator" ? null : leadClaimOf(store, family.root.id, now, access.viewer);
326
328
  // Existing saved inputs and output, read only after family admission. Keep
327
329
  // polling briefs small; full reads disclose exactly which excerpts are shortened.
328
330
  const planId = result?.planRevision == null ? null : store.getPlanRevision(result.planRevision)?.artifact;
@@ -339,7 +341,7 @@ export function assignmentOf(store, taskId, now, access, root) {
339
341
  return { version: 1, rootId: family.root.id, activeTaskId: current.id, repo: current.repo, title: family.root.title,
340
342
  state, detail, primaryAction, attention: [...new Set(attention)], attempts, owner, receipt, savedContext, completion, handoff,
341
343
  publication: publication === null ? null : { state: publication.state, prUrl: publication.prUrl, remoteState: publication.remoteState },
342
- review, deployment: { status: "not-recorded" }, ...(need === null ? {} : { need }) };
344
+ review, deployment: { status: "not-recorded" }, ...(need === null ? {} : { need }), ...(lead === null ? {} : { lead }) };
343
345
  }
344
346
  function admittedOwner(store, taskId, owner, now, root) {
345
347
  if (owner.kind !== "coordinator")