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.
- package/CHANGELOG.md +17 -1
- package/dist/agent-fence.d.ts +6 -0
- package/dist/agent-fence.js +2 -2
- package/dist/assignment-status.d.ts +1 -1
- package/dist/assignment-ui.js +2 -0
- package/dist/attest.d.ts +3 -0
- package/dist/attest.js +10 -0
- package/dist/browser/terminal.js +1 -1
- package/dist/browser/workspace.css +1 -1
- package/dist/browser/workspace.js +24 -24
- package/dist/browser-crew.js +2 -0
- package/dist/browser-workspace.d.ts +5 -0
- package/dist/build-review.js +2 -0
- package/dist/builder.d.ts +7 -2
- package/dist/builder.js +183 -79
- package/dist/card-catalog.d.ts +209 -0
- package/dist/card-catalog.js +133 -0
- package/dist/card-cli.d.ts +43 -0
- package/dist/card-cli.js +44 -0
- package/dist/card-render.d.ts +43 -0
- package/dist/card-render.js +260 -0
- package/dist/card-sources.d.ts +68 -0
- package/dist/card-sources.js +234 -0
- package/dist/chat-actions.d.ts +95 -8
- package/dist/chat-actions.js +449 -45
- package/dist/chat-approval.d.ts +13 -0
- package/dist/chat-approval.js +39 -9
- package/dist/chat-card-part.d.ts +11 -0
- package/dist/chat-card-part.js +18 -0
- package/dist/chat-card.d.ts +46 -0
- package/dist/chat-card.js +99 -0
- package/dist/chat-channel.d.ts +2 -0
- package/dist/chat-channel.js +26 -14
- package/dist/chat-controls.d.ts +4 -0
- package/dist/chat-controls.js +4 -0
- package/dist/chat-decide.d.ts +3 -14
- package/dist/chat-decide.js +43 -54
- package/dist/chat-delivery.js +13 -4
- package/dist/chat-flow.d.ts +0 -27
- package/dist/chat-flow.js +31 -2
- package/dist/chat-quiet.js +1 -1
- package/dist/chat-task-actions.d.ts +3 -2
- package/dist/chat-task-actions.js +19 -5
- package/dist/chat-terms.d.ts +14 -2
- package/dist/chat-terms.js +35 -0
- package/dist/check-failure.d.ts +2 -0
- package/dist/check-failure.js +34 -2
- package/dist/check-repair.d.ts +47 -0
- package/dist/check-repair.js +240 -0
- package/dist/claim.d.ts +6 -0
- package/dist/claim.js +13 -2
- package/dist/cli-help.d.ts +1 -1
- package/dist/cli-help.js +2 -0
- package/dist/cli.js +4 -0
- package/dist/coding-provider.d.ts +1 -1
- package/dist/coding-provider.js +9 -5
- package/dist/coding-workspace.d.ts +1 -1
- package/dist/coding-workspace.js +4 -4
- package/dist/contracts/chat-actions.d.ts +83 -0
- package/dist/contracts/chat-actions.js +18 -0
- package/dist/contracts/chat-card.d.ts +91 -0
- package/dist/contracts/chat-card.js +54 -0
- package/dist/contracts/chat-content.d.ts +191 -0
- package/dist/contracts/chat-content.js +4 -0
- package/dist/contracts/console-api.d.ts +2 -0
- package/dist/contracts/console-api.js +2 -0
- package/dist/contracts/flow-propose.d.ts +8 -1
- package/dist/contracts/flow-propose.js +3 -1
- package/dist/contracts/flow-send.d.ts +126 -0
- package/dist/contracts/flow-send.js +3 -0
- package/dist/contracts/lead-tools.d.ts +173 -0
- package/dist/contracts/lead-tools.js +15 -0
- package/dist/contracts/store-json.d.ts +16 -0
- package/dist/discord-chat.js +14 -0
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.js +7 -1
- package/dist/dispose.d.ts +19 -0
- package/dist/dispose.js +47 -7
- package/dist/eval-oracle.js +4 -1
- package/dist/evidence-pair.d.ts +53 -0
- package/dist/evidence-pair.js +128 -0
- package/dist/exhaustion.d.ts +17 -4
- package/dist/exhaustion.js +44 -4
- package/dist/export.js +1 -1
- package/dist/failing-first.d.ts +31 -0
- package/dist/failing-first.js +44 -0
- package/dist/fallback-schema.d.ts +8 -0
- package/dist/fallback-schema.js +40 -0
- package/dist/fallback.d.ts +138 -0
- package/dist/fallback.js +605 -0
- package/dist/findings.d.ts +224 -0
- package/dist/findings.js +449 -0
- package/dist/fleet-schema.d.ts +17 -0
- package/dist/fleet-schema.js +135 -0
- package/dist/flow-browser.js +2 -2
- package/dist/flow-code.d.ts +2 -2
- package/dist/flow-code.js +9 -5
- package/dist/flow-result-card.d.ts +22 -0
- package/dist/flow-result-card.js +55 -0
- package/dist/flow-send.js +12 -9
- package/dist/flow-steps.js +1 -1
- package/dist/flow-triggers.js +1 -1
- package/dist/flow-unattended.d.ts +26 -0
- package/dist/flow-unattended.js +12 -3
- package/dist/flows-ui.js +10 -2
- package/dist/follow-through-brief.d.ts +12 -0
- package/dist/follow-through-brief.js +31 -0
- package/dist/follow-through-cli.d.ts +23 -0
- package/dist/follow-through-cli.js +153 -0
- package/dist/git-incident.d.ts +16 -0
- package/dist/git-incident.js +69 -6
- package/dist/handover-note.d.ts +33 -0
- package/dist/handover-note.js +106 -0
- package/dist/invoke.d.ts +20 -1
- package/dist/invoke.js +108 -44
- package/dist/lead-cli.js +26 -24
- package/dist/lead-contract.js +1 -0
- package/dist/lead-doors.d.ts +4 -0
- package/dist/lead-doors.js +2 -2
- package/dist/lead-progress.js +2 -0
- package/dist/lead-tools.js +111 -32
- package/dist/lead.js +1 -1
- package/dist/local-owner.js +5 -0
- package/dist/modes.d.ts +6 -6
- package/dist/modes.js +3 -1
- package/dist/needs-you.d.ts +5 -2
- package/dist/needs-you.js +14 -2
- package/dist/operate-remote-arguments.js +1 -0
- package/dist/operate-remote.js +1 -1
- package/dist/operate.d.ts +1 -1
- package/dist/operate.js +165 -14
- package/dist/plan-login.d.ts +14 -0
- package/dist/plan-login.js +58 -0
- package/dist/planner.d.ts +1 -1
- package/dist/planner.js +2 -1
- package/dist/project-delete-ui.d.ts +12 -0
- package/dist/project-delete-ui.js +18 -1
- package/dist/project-delete.js +6 -0
- package/dist/project-knowledge.d.ts +6 -6
- package/dist/project-tools.d.ts +4 -4
- package/dist/project-tools.js +23 -7
- package/dist/protected-storage-look.d.ts +1 -0
- package/dist/protected-storage-look.js +13 -0
- package/dist/protected-storage.d.ts +70 -39
- package/dist/protected-storage.js +196 -147
- package/dist/provider-capture.d.ts +34 -0
- package/dist/provider-capture.js +53 -0
- package/dist/release-carry.js +10 -1
- package/dist/release.js +9 -1
- package/dist/scope.d.ts +22 -3
- package/dist/scope.js +71 -20
- package/dist/scout.d.ts +1 -1
- package/dist/scout.js +2 -1
- package/dist/serve.js +2 -0
- package/dist/server/chat.js +2 -2
- package/dist/server/console.css +50 -0
- package/dist/server/render-chat.js +14 -1
- package/dist/server/render-follow-through.d.ts +11 -0
- package/dist/server/render-follow-through.js +68 -0
- package/dist/server/render-results.js +1 -1
- package/dist/server/render-tasks.d.ts +3 -0
- package/dist/server/render-tasks.js +24 -5
- package/dist/server/route-table.js +3 -0
- package/dist/server/settings.js +37 -12
- package/dist/server/task-views.js +5 -0
- package/dist/server/tasks.js +76 -0
- package/dist/settings-groups-ui.d.ts +1 -0
- package/dist/settings-groups-ui.js +3 -1
- package/dist/settings-kit.js +3 -2
- package/dist/settings-proofs.js +3 -1
- package/dist/setup-guide.d.ts +2 -2
- package/dist/slack-chat.js +14 -1
- package/dist/steer-mailbox.d.ts +8 -1
- package/dist/steer-mailbox.js +164 -6
- package/dist/store.d.ts +11 -4
- package/dist/store.js +93 -30
- package/dist/surface.js +24 -4
- package/dist/task-control.d.ts +2 -1
- package/dist/task-status.js +5 -0
- package/dist/teardown-git.d.ts +2 -0
- package/dist/teardown-git.js +75 -19
- package/dist/telegram-lead.js +23 -6
- package/dist/telegram.js +12 -1
- package/dist/toolroll-update.js +2 -0
- package/dist/work-index.js +22 -7
- package/dist/work-summary.d.ts +1 -1
- package/dist/work-summary.js +5 -2
- package/dist/workspace-ui.d.ts +3 -1
- package/dist/workspace-ui.js +10 -1
- package/dist/worktree.js +23 -1
- package/package.json +2 -1
package/dist/workspace-ui.d.ts
CHANGED
|
@@ -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. */
|
package/dist/workspace-ui.js
CHANGED
|
@@ -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
|
|
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.
|
|
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",
|