toolroll 0.9.94 → 0.9.96

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 (191) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/dist/agent-fence.d.ts +6 -0
  3. package/dist/agent-fence.js +2 -2
  4. package/dist/assignment-status.d.ts +1 -1
  5. package/dist/assignment-ui.js +2 -0
  6. package/dist/attest.d.ts +3 -0
  7. package/dist/attest.js +10 -0
  8. package/dist/browser/terminal.js +1 -1
  9. package/dist/browser/workspace.css +1 -1
  10. package/dist/browser/workspace.js +24 -24
  11. package/dist/browser-crew.js +2 -0
  12. package/dist/browser-workspace.d.ts +5 -0
  13. package/dist/build-review.js +2 -0
  14. package/dist/builder.d.ts +7 -2
  15. package/dist/builder.js +183 -79
  16. package/dist/card-catalog.d.ts +209 -0
  17. package/dist/card-catalog.js +133 -0
  18. package/dist/card-cli.d.ts +43 -0
  19. package/dist/card-cli.js +44 -0
  20. package/dist/card-render.d.ts +43 -0
  21. package/dist/card-render.js +260 -0
  22. package/dist/card-sources.d.ts +68 -0
  23. package/dist/card-sources.js +234 -0
  24. package/dist/chat-actions.d.ts +95 -8
  25. package/dist/chat-actions.js +449 -45
  26. package/dist/chat-approval.d.ts +13 -0
  27. package/dist/chat-approval.js +39 -9
  28. package/dist/chat-card-part.d.ts +11 -0
  29. package/dist/chat-card-part.js +18 -0
  30. package/dist/chat-card.d.ts +46 -0
  31. package/dist/chat-card.js +99 -0
  32. package/dist/chat-channel.d.ts +2 -0
  33. package/dist/chat-channel.js +26 -14
  34. package/dist/chat-controls.d.ts +4 -0
  35. package/dist/chat-controls.js +4 -0
  36. package/dist/chat-decide.d.ts +3 -14
  37. package/dist/chat-decide.js +43 -54
  38. package/dist/chat-delivery.js +13 -4
  39. package/dist/chat-flow.d.ts +0 -27
  40. package/dist/chat-flow.js +31 -2
  41. package/dist/chat-quiet.js +1 -1
  42. package/dist/chat-task-actions.d.ts +3 -2
  43. package/dist/chat-task-actions.js +19 -5
  44. package/dist/chat-terms.d.ts +14 -2
  45. package/dist/chat-terms.js +35 -0
  46. package/dist/check-failure.d.ts +2 -0
  47. package/dist/check-failure.js +34 -2
  48. package/dist/check-repair.d.ts +47 -0
  49. package/dist/check-repair.js +240 -0
  50. package/dist/claim.d.ts +6 -0
  51. package/dist/claim.js +13 -2
  52. package/dist/cli-help.d.ts +1 -1
  53. package/dist/cli-help.js +2 -0
  54. package/dist/cli.js +4 -0
  55. package/dist/coding-provider.d.ts +1 -1
  56. package/dist/coding-provider.js +9 -5
  57. package/dist/coding-workspace.d.ts +1 -1
  58. package/dist/coding-workspace.js +4 -4
  59. package/dist/contracts/chat-actions.d.ts +83 -0
  60. package/dist/contracts/chat-actions.js +18 -0
  61. package/dist/contracts/chat-card.d.ts +91 -0
  62. package/dist/contracts/chat-card.js +54 -0
  63. package/dist/contracts/chat-content.d.ts +191 -0
  64. package/dist/contracts/chat-content.js +4 -0
  65. package/dist/contracts/console-api.d.ts +2 -0
  66. package/dist/contracts/console-api.js +2 -0
  67. package/dist/contracts/flow-propose.d.ts +8 -1
  68. package/dist/contracts/flow-propose.js +3 -1
  69. package/dist/contracts/flow-send.d.ts +126 -0
  70. package/dist/contracts/flow-send.js +3 -0
  71. package/dist/contracts/lead-tools.d.ts +173 -0
  72. package/dist/contracts/lead-tools.js +15 -0
  73. package/dist/contracts/store-json.d.ts +16 -0
  74. package/dist/discord-chat.js +14 -0
  75. package/dist/dispatch.d.ts +1 -1
  76. package/dist/dispatch.js +7 -1
  77. package/dist/dispose.d.ts +19 -0
  78. package/dist/dispose.js +47 -7
  79. package/dist/eval-oracle.js +4 -1
  80. package/dist/evidence-pair.d.ts +53 -0
  81. package/dist/evidence-pair.js +128 -0
  82. package/dist/exhaustion.d.ts +17 -4
  83. package/dist/exhaustion.js +44 -4
  84. package/dist/export.js +1 -1
  85. package/dist/failing-first.d.ts +31 -0
  86. package/dist/failing-first.js +44 -0
  87. package/dist/fallback-schema.d.ts +8 -0
  88. package/dist/fallback-schema.js +40 -0
  89. package/dist/fallback.d.ts +138 -0
  90. package/dist/fallback.js +605 -0
  91. package/dist/findings.d.ts +224 -0
  92. package/dist/findings.js +449 -0
  93. package/dist/fleet-schema.d.ts +17 -0
  94. package/dist/fleet-schema.js +135 -0
  95. package/dist/flow-browser.js +2 -2
  96. package/dist/flow-code.d.ts +2 -2
  97. package/dist/flow-code.js +9 -5
  98. package/dist/flow-result-card.d.ts +22 -0
  99. package/dist/flow-result-card.js +55 -0
  100. package/dist/flow-send.js +12 -9
  101. package/dist/flow-steps.js +1 -1
  102. package/dist/flow-triggers.js +1 -1
  103. package/dist/flow-unattended.d.ts +26 -0
  104. package/dist/flow-unattended.js +12 -3
  105. package/dist/flows-ui.js +10 -2
  106. package/dist/follow-through-brief.d.ts +12 -0
  107. package/dist/follow-through-brief.js +31 -0
  108. package/dist/follow-through-cli.d.ts +23 -0
  109. package/dist/follow-through-cli.js +153 -0
  110. package/dist/git-incident.d.ts +16 -0
  111. package/dist/git-incident.js +69 -6
  112. package/dist/handover-note.d.ts +33 -0
  113. package/dist/handover-note.js +106 -0
  114. package/dist/invoke.d.ts +20 -1
  115. package/dist/invoke.js +108 -44
  116. package/dist/lead-cli.js +26 -24
  117. package/dist/lead-contract.js +1 -0
  118. package/dist/lead-doors.d.ts +4 -0
  119. package/dist/lead-doors.js +2 -2
  120. package/dist/lead-progress.js +2 -0
  121. package/dist/lead-tools.js +111 -32
  122. package/dist/lead.js +1 -1
  123. package/dist/local-owner.js +5 -0
  124. package/dist/modes.d.ts +6 -6
  125. package/dist/modes.js +3 -1
  126. package/dist/needs-you.d.ts +5 -2
  127. package/dist/needs-you.js +14 -2
  128. package/dist/operate-remote-arguments.js +1 -0
  129. package/dist/operate-remote.js +1 -1
  130. package/dist/operate.d.ts +1 -1
  131. package/dist/operate.js +165 -14
  132. package/dist/plan-login.d.ts +14 -0
  133. package/dist/plan-login.js +58 -0
  134. package/dist/planner.d.ts +1 -1
  135. package/dist/planner.js +2 -1
  136. package/dist/project-delete-ui.d.ts +12 -0
  137. package/dist/project-delete-ui.js +18 -1
  138. package/dist/project-delete.js +6 -0
  139. package/dist/project-knowledge.d.ts +6 -6
  140. package/dist/project-tools.d.ts +4 -4
  141. package/dist/project-tools.js +23 -7
  142. package/dist/protected-storage-look.d.ts +1 -0
  143. package/dist/protected-storage-look.js +13 -0
  144. package/dist/protected-storage.d.ts +70 -39
  145. package/dist/protected-storage.js +196 -147
  146. package/dist/provider-capture.d.ts +34 -0
  147. package/dist/provider-capture.js +53 -0
  148. package/dist/release-carry.js +10 -1
  149. package/dist/release.js +9 -1
  150. package/dist/scope.d.ts +22 -3
  151. package/dist/scope.js +71 -20
  152. package/dist/scout.d.ts +1 -1
  153. package/dist/scout.js +2 -1
  154. package/dist/serve.js +2 -0
  155. package/dist/server/chat.js +2 -2
  156. package/dist/server/console.css +50 -0
  157. package/dist/server/render-chat.js +14 -1
  158. package/dist/server/render-follow-through.d.ts +11 -0
  159. package/dist/server/render-follow-through.js +68 -0
  160. package/dist/server/render-results.js +1 -1
  161. package/dist/server/render-tasks.d.ts +3 -0
  162. package/dist/server/render-tasks.js +24 -5
  163. package/dist/server/route-table.js +3 -0
  164. package/dist/server/settings.js +37 -12
  165. package/dist/server/task-views.js +5 -0
  166. package/dist/server/tasks.js +76 -0
  167. package/dist/settings-groups-ui.d.ts +1 -0
  168. package/dist/settings-groups-ui.js +3 -1
  169. package/dist/settings-kit.js +3 -2
  170. package/dist/settings-proofs.js +3 -1
  171. package/dist/setup-guide.d.ts +2 -2
  172. package/dist/slack-chat.js +14 -1
  173. package/dist/steer-mailbox.d.ts +8 -1
  174. package/dist/steer-mailbox.js +164 -6
  175. package/dist/store.d.ts +11 -4
  176. package/dist/store.js +93 -30
  177. package/dist/surface.js +24 -4
  178. package/dist/task-control.d.ts +2 -1
  179. package/dist/task-status.js +5 -0
  180. package/dist/teardown-git.d.ts +2 -0
  181. package/dist/teardown-git.js +75 -19
  182. package/dist/telegram-lead.js +23 -6
  183. package/dist/telegram.js +12 -1
  184. package/dist/toolroll-update.js +2 -0
  185. package/dist/work-index.js +22 -7
  186. package/dist/work-summary.d.ts +1 -1
  187. package/dist/work-summary.js +5 -2
  188. package/dist/workspace-ui.d.ts +3 -1
  189. package/dist/workspace-ui.js +10 -1
  190. package/dist/worktree.js +23 -1
  191. package/package.json +2 -1
@@ -106,7 +106,7 @@ export type NextAction = {
106
106
  label: string;
107
107
  /** Where the act lives — the page, not a URL, so every surface can
108
108
  * build its own link (a task page anchors, a row links out). */
109
- kind: "open-result" | "open-review" | "open-task" | "open-run" | "open-pr";
109
+ kind: "open-result" | "open-review" | "open-task" | "open-findings" | "open-run" | "open-pr";
110
110
  };
111
111
  export type DisplayStatus = {
112
112
  /** The stable `data-work-status` token pages and tests key off. */
@@ -175,6 +175,8 @@ export type WorkFacts = {
175
175
  question: string;
176
176
  overdue: boolean;
177
177
  } | null;
178
+ /** Findings of this task's family that used their rounds and wait on a person (findings.ts). */
179
+ heldFindings?: number;
178
180
  };
179
181
  export type WorkStatus = DisplayStatus & {
180
182
  /** Which shortcut views list this row; `all` always does. */
@@ -470,7 +470,8 @@ function workStatusWordsOf(facts, resultDisplay) {
470
470
  const result = facts.state === "done" ? resultDisplay ?? resultStatusOf(facts.result, facts.publication) : null;
471
471
  const running = facts.liveRunId !== null || (dispatch?.condition === "running" && !REVIEW_TOKENS.has(dispatch.code));
472
472
  const question = (facts.state === "queued" || facts.state === "running" || facts.state === "done") ? facts.openDecision ?? null : null;
473
- const needs = (dispatch !== null && !REVIEW_TOKENS.has(dispatch.code) && needsPerson(dispatch)) || question !== null;
473
+ const held = (facts.heldFindings ?? 0) > 0 && facts.state !== "cancelled";
474
+ const needs = (dispatch !== null && !REVIEW_TOKENS.has(dispatch.code) && needsPerson(dispatch)) || question !== null || held;
474
475
  const views = ["all"];
475
476
  if (needs)
476
477
  views.push("needs-you");
@@ -480,6 +481,10 @@ function workStatusWordsOf(facts, resultDisplay) {
480
481
  views.push("queued");
481
482
  if (facts.state === "done")
482
483
  views.push("completed");
484
+ const findingWords = (behind) => ({
485
+ token: "finding-held", label: "Needs you", detail: NEEDS.finding.sentence({}), tone: "attention", action: { label: NEEDS.finding.action.label, kind: "open-findings" }, views, rank: 0,
486
+ ...(behind === null ? {} : { diagnostics: [behind] }),
487
+ });
483
488
  const dispatchWords = (tone, rank, action) => ({
484
489
  token: dispatch?.code ?? "unknown",
485
490
  label: dispatch?.summary ?? "Status unknown",
@@ -505,6 +510,8 @@ function workStatusWordsOf(facts, resultDisplay) {
505
510
  tone: "attention", action: { label: "Answer question", kind: "open-task" }, views, rank: 0,
506
511
  diagnostics: [{ token: result.token, label: result.label, detail: result.detail, tone: result.tone }] };
507
512
  }
513
+ if (held && result.tone !== "problem")
514
+ return findingWords({ token: result.token, label: result.label, detail: result.detail, tone: result.tone });
508
515
  return { ...result, views, rank: needs ? 0 : 3 };
509
516
  }
510
517
  if (facts.state === "cancelled") {
@@ -519,6 +526,8 @@ function workStatusWordsOf(facts, resultDisplay) {
519
526
  }),
520
527
  };
521
528
  }
529
+ if (held && facts.state !== "failed")
530
+ return findingWords(dispatch === null ? null : { token: dispatch.code, label: dispatch.summary, detail: dispatch.detail, tone: running ? "live" : "attention" });
522
531
  if (running) {
523
532
  return dispatchWords("live", 1, { label: "Watch the build", kind: facts.liveRunId === null ? "open-task" : "open-run" });
524
533
  }
package/dist/worktree.js CHANGED
@@ -22,6 +22,7 @@
22
22
  * synced folder like OneDrive or Dropbox, where a sync client racing an agent
23
23
  * over `.git` internals corrupts both.
24
24
  */
25
+ import { INCIDENT_QUIET_MS, recentGitIncident } from "./git-incident.js";
25
26
  import { createHash, randomBytes } from "node:crypto";
26
27
  import { existsSync, lstatSync, readFileSync, writeFileSync, rmSync, realpathSync, mkdirSync, readdirSync, renameSync } from "node:fs";
27
28
  import { hostname } from "node:os";
@@ -33,7 +34,7 @@ import { HANDOFF_PREFIX, MAILBOX_SUFFIX, looksLikeProtocolFile, readMailbox } fr
33
34
  import { parseHandoff } from "./decision.js";
34
35
  import { diskBytes } from "./storage.js";
35
36
  import { markNeverIndex } from "./never-index.js";
36
- import { checkoutGit, teardownGit } from "./teardown-git.js";
37
+ import { checkoutGit, gitIncidentRecord, teardownGit } from "./teardown-git.js";
37
38
  /**
38
39
  * The note a lease leaves in the checkout, naming the process holding it.
39
40
  *
@@ -853,6 +854,9 @@ export class WorktreePool {
853
854
  * or remote. Reads only, through `git` when given (teardown's hardened git).
854
855
  */
855
856
  async inspect(path, git = this.teardown) {
857
+ // A checkout that had a git incident lately is left alone (git-incident.ts): nothing re-runs git there each pass.
858
+ if (quietAfterIncident(path))
859
+ return "unreadable";
856
860
  const dirty = await this.isDirty(path, true, git);
857
861
  if (dirty !== false)
858
862
  return dirty === null ? "unreadable" : "has changes";
@@ -870,6 +874,8 @@ export class WorktreePool {
870
874
  * `heads` commit is on a branch, and no ref lives only in this worktree. Reads only; anything unreadable keeps it.
871
875
  */
872
876
  async proveRecreatable(row, heads) {
877
+ if (quietAfterIncident(row.path))
878
+ return "unreadable";
873
879
  if (row.branch === "unknown" || !insidePool(this.options.root, row.path) || heads.some(one => !/^[0-9a-f]{40,64}$/.test(one)))
874
880
  return "unreadable";
875
881
  const git = teardownGit(this.runner, { repo: row.repo });
@@ -1120,3 +1126,19 @@ function firstLine(text) {
1120
1126
  const [line = ""] = text.trim().split("\n");
1121
1127
  return line;
1122
1128
  }
1129
+ /** Whether a checkout had a git incident within INCIDENT_QUIET_MS (by its real path, as incidents record it). */
1130
+ function quietAfterIncident(path) {
1131
+ let real;
1132
+ try {
1133
+ real = realpathSync(path);
1134
+ }
1135
+ catch {
1136
+ return false;
1137
+ }
1138
+ try {
1139
+ return recentGitIncident(gitIncidentRecord(), real, new Date(Date.now() - INCIDENT_QUIET_MS));
1140
+ }
1141
+ catch {
1142
+ return false;
1143
+ }
1144
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toolroll",
3
- "version": "0.9.94",
3
+ "version": "0.9.96",
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"
@@ -133,6 +133,7 @@
133
133
  },
134
134
  "dependencies": {
135
135
  "@anthropic-ai/sandbox-runtime": "0.0.79",
136
+ "@json-render/core": "0.22.0",
136
137
  "@slack/socket-mode": "3.1.1",
137
138
  "@xterm/addon-serialize": "0.14.0",
138
139
  "@xterm/headless": "6.0.0",