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
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Findings sent to the task that owns the code (docs/plans/fleet-follow-through.md, part 1).
|
|
3
|
+
*
|
|
4
|
+
* A finding asks the owner for an answer: accepted, with what changed, or rejected, with a reason against the code.
|
|
5
|
+
* Reading one closes nothing. It stays open, and visible, until an answer counts or a person closes it, and a reviewer
|
|
6
|
+
* and an implementer get FINDING_ROUND_LIMIT rounds before it goes to a person.
|
|
7
|
+
*
|
|
8
|
+
* Trust: summary, action, excerpt and every answer can hold model output or repository text. They are data wherever
|
|
9
|
+
* they are read: quoted with `fence` for an agent, and they decide nothing. An answer ends this finding and touches no
|
|
10
|
+
* proof, check or approval, and only a signed-in person (the caller proves it) closes one.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import type { BuildFinding } from "./contracts/review-findings.js";
|
|
14
|
+
import type { Store } from "./store.js";
|
|
15
|
+
/** A first send and one more: then a person decides. */
|
|
16
|
+
export declare const FINDING_ROUND_LIMIT = 2;
|
|
17
|
+
export declare const FINDING_TEXT_LIMIT = 1000;
|
|
18
|
+
export declare const FINDING_ACTION_LIMIT = 300;
|
|
19
|
+
export declare const FINDING_EXCERPT_LIMIT = 2000;
|
|
20
|
+
export declare const ANSWER_TEXT_LIMIT = 1000;
|
|
21
|
+
export declare const ANSWER_FILE_BYTES: number;
|
|
22
|
+
export declare const REVIEW_ACTION = "Check this against the code. Fix it and say what changed, or reject it with a reason that names the file.";
|
|
23
|
+
export declare const CHECK_ACTION = "Find the cause of this failed check. Fix it and say what changed, or reject it with a reason that names the file.";
|
|
24
|
+
/** `lead`: words the lead (a model) drafted, sent only once a person confirmed them; `sent_by` is that person. They are
|
|
25
|
+
* never recorded as the person's own words. */
|
|
26
|
+
export type FindingSource = "build-review" | "person" | "lead" | "check-failure";
|
|
27
|
+
export type FindingState = "open" | "accepted" | "rejected" | "with-person" | "closed";
|
|
28
|
+
export type FindingAnswer = {
|
|
29
|
+
round: number;
|
|
30
|
+
run: number;
|
|
31
|
+
answer: "accepted" | "rejected";
|
|
32
|
+
detail: string;
|
|
33
|
+
file: string | null;
|
|
34
|
+
line: number | null;
|
|
35
|
+
revision: string | null;
|
|
36
|
+
state: "saved" | "counted" | "refused";
|
|
37
|
+
problem: string | null;
|
|
38
|
+
at: string;
|
|
39
|
+
};
|
|
40
|
+
export type Finding = {
|
|
41
|
+
id: number;
|
|
42
|
+
familyRoot: string;
|
|
43
|
+
taskId: string;
|
|
44
|
+
repo: string | null;
|
|
45
|
+
source: FindingSource;
|
|
46
|
+
sourceRun: number | null;
|
|
47
|
+
severity: "HIGH" | "MEDIUM" | "LOW" | null;
|
|
48
|
+
file: string | null;
|
|
49
|
+
line: number | null;
|
|
50
|
+
summary: string;
|
|
51
|
+
action: string;
|
|
52
|
+
excerpt: string | null;
|
|
53
|
+
revision: string | null;
|
|
54
|
+
state: FindingState;
|
|
55
|
+
rounds: number;
|
|
56
|
+
sentBy: string;
|
|
57
|
+
sentAt: string;
|
|
58
|
+
deliveredRun: number | null;
|
|
59
|
+
deliveredHow: "mailbox" | "brief" | null;
|
|
60
|
+
readAt: string | null;
|
|
61
|
+
closedBy: string | null;
|
|
62
|
+
closedNote: string | null;
|
|
63
|
+
closedAt: string | null;
|
|
64
|
+
/** The newest answer of any standing, or null. */
|
|
65
|
+
answer: FindingAnswer | null;
|
|
66
|
+
};
|
|
67
|
+
export declare const findingSourceWords: (source: FindingSource) => string;
|
|
68
|
+
/** Who a finding's words are from, naming the person who confirmed the lead's draft: never the person as its author. */
|
|
69
|
+
export declare const findingFromWords: (finding: Pick<Finding, "source" | "sentBy">) => string;
|
|
70
|
+
/** The family a task belongs to: a broken history keeps the finding on the task it named. */
|
|
71
|
+
export declare function familyRootOf(store: Store, taskId: string): string;
|
|
72
|
+
/** One line of quotable text: controls gone, secrets gone, inside its limit. */
|
|
73
|
+
export declare function cleanFindingText(text: string, limit: number): string;
|
|
74
|
+
export declare function getFinding(store: Store, id: number): Finding | null;
|
|
75
|
+
/** Every finding of a task's family, newest first. */
|
|
76
|
+
export declare function findingsOfTask(store: Store, taskId: string): Finding[];
|
|
77
|
+
/** How many of this task's family's findings used their rounds and wait on a person; none on a database not yet migrated. */
|
|
78
|
+
export declare const heldFindingCount: (store: Store, taskId: string) => number;
|
|
79
|
+
/** The findings still waiting on someone, across a project or everywhere. */
|
|
80
|
+
export declare function waitingFindings(store: Store, repos: readonly string[] | null): Finding[];
|
|
81
|
+
/** Who is reading or sending: the projects this chat reaches, and the person they must reach them as. */
|
|
82
|
+
export type FindingReader = {
|
|
83
|
+
name: string;
|
|
84
|
+
repos: readonly string[];
|
|
85
|
+
};
|
|
86
|
+
/** Every project a task's family reaches, or null unless this person reaches all of them: one gate for every chat road to
|
|
87
|
+
* a family's findings and handover. A task with no project is out of reach. */
|
|
88
|
+
export declare function familyInReach(store: Store, who: FindingReader, task: string): readonly string[] | null;
|
|
89
|
+
/** The findings this person may see: a task's, only if its whole family is in reach, else those waiting in `repos`. Null
|
|
90
|
+
* for a task out of reach. A finding with no project, or one out of reach, is left out. */
|
|
91
|
+
export declare function findingsInReach(store: Store, who: FindingReader, query: {
|
|
92
|
+
task?: string;
|
|
93
|
+
repos: readonly string[];
|
|
94
|
+
}): Finding[] | null;
|
|
95
|
+
/** The same finding, in another reviewer's words: the same file, and the same opening words or nearly the same line. */
|
|
96
|
+
export declare function sameFinding(a: {
|
|
97
|
+
file: string | null;
|
|
98
|
+
line: number | null;
|
|
99
|
+
summary: string;
|
|
100
|
+
}, b: {
|
|
101
|
+
file: string | null;
|
|
102
|
+
line: number | null;
|
|
103
|
+
summary: string;
|
|
104
|
+
}): boolean;
|
|
105
|
+
export type SendInput = {
|
|
106
|
+
taskId: string;
|
|
107
|
+
source: FindingSource;
|
|
108
|
+
by: string;
|
|
109
|
+
summary: string;
|
|
110
|
+
action?: string;
|
|
111
|
+
file?: string | null;
|
|
112
|
+
line?: number | null;
|
|
113
|
+
severity?: Finding["severity"];
|
|
114
|
+
run?: number | null;
|
|
115
|
+
excerpt?: string | null;
|
|
116
|
+
revision?: string | null;
|
|
117
|
+
/** The source's own identity: a repeat of the same key is the same finding. */
|
|
118
|
+
key?: string | null;
|
|
119
|
+
};
|
|
120
|
+
export type SendAnswer = {
|
|
121
|
+
ok: true;
|
|
122
|
+
id: number;
|
|
123
|
+
standing: "running" | "next-attempt" | "with-person" | "already-sent";
|
|
124
|
+
round: number;
|
|
125
|
+
} | {
|
|
126
|
+
ok: false;
|
|
127
|
+
reason: "unknown-task" | "invalid" | "closed";
|
|
128
|
+
message: string;
|
|
129
|
+
};
|
|
130
|
+
/** Send a finding, or count a repeat of one already sent as another round. The caller proves who is sending. */
|
|
131
|
+
export declare function sendFinding(store: Store, input: SendInput, now: Date): SendAnswer;
|
|
132
|
+
/** Send an answered finding back to its owner: one more round, or to a person once the rounds are used. */
|
|
133
|
+
export declare function resendFinding(store: Store, id: number, now: Date): SendAnswer;
|
|
134
|
+
/** A person's decision on a finding. The caller has proved the person. */
|
|
135
|
+
export declare function closeFinding(store: Store, id: number, by: string, note: string, now: Date): {
|
|
136
|
+
ok: true;
|
|
137
|
+
} | {
|
|
138
|
+
ok: false;
|
|
139
|
+
message: string;
|
|
140
|
+
};
|
|
141
|
+
/** The open findings of a run's family it has not been given yet. */
|
|
142
|
+
export declare function undeliveredFindings(store: Store, taskRef: number, runId: number): Finding[];
|
|
143
|
+
/** Recorded only after the file reached the run, or the brief named it: a pending delivery is never counted as read. */
|
|
144
|
+
export declare function markFindingDelivered(store: Store, id: number, runId: number, how: "mailbox" | "brief", now: Date): boolean;
|
|
145
|
+
/** The findings a fresh attempt's brief quotes, recorded as reaching it. Bounded by the caller's brief. */
|
|
146
|
+
export declare function attachFindings(store: Store, taskRef: number, runId: number, now: Date): Finding[];
|
|
147
|
+
/** The agent moved the file to handled/: it read it. That closes nothing. */
|
|
148
|
+
export declare function markFindingRead(store: Store, id: number, runId: number, now: Date): void;
|
|
149
|
+
/** An answer as an agent writes it. Its `key` proves the attempt's own folder wrote it, nothing more. */
|
|
150
|
+
export declare const findingAnswerSchema: z.ZodObject<{
|
|
151
|
+
key: z.ZodString;
|
|
152
|
+
finding: z.ZodNumber;
|
|
153
|
+
answer: z.ZodEnum<{
|
|
154
|
+
accepted: "accepted";
|
|
155
|
+
rejected: "rejected";
|
|
156
|
+
}>;
|
|
157
|
+
detail: z.ZodString;
|
|
158
|
+
file: z.ZodOptional<z.ZodString>;
|
|
159
|
+
line: z.ZodOptional<z.ZodNumber>;
|
|
160
|
+
}, z.core.$strict>;
|
|
161
|
+
export type FindingAnswerFile = z.infer<typeof findingAnswerSchema>;
|
|
162
|
+
/** Save what an attempt answered. It counts only when that attempt settles (settleFindingAnswers). A finding this run
|
|
163
|
+
* was not given, or one no longer open, takes no answer. */
|
|
164
|
+
export declare function saveFindingAnswer(store: Store, runId: number, answer: FindingAnswerFile, now: Date): boolean;
|
|
165
|
+
/**
|
|
166
|
+
* The attempt has settled: each answer it saved counts or is refused, against what the machine saw, not what it said.
|
|
167
|
+
* Accepted needs a commit past the revision the finding was sent about. Rejected needs a file that exists at the run's
|
|
168
|
+
* commit. A refused answer leaves the finding open, and the next attempt gets it again.
|
|
169
|
+
*/
|
|
170
|
+
export declare function settleFindingAnswers(store: Store, runId: number, worktree: string, now: Date): number;
|
|
171
|
+
/**
|
|
172
|
+
* A finished review's HIGH findings. Sent back: each becomes a finding its revision must answer. Not sent back (a family
|
|
173
|
+
* gets one automatic send-back): a HIGH that repeats an answered finding is that finding's next round, and any other
|
|
174
|
+
* stays where it is, for the person to decide. Never at the review's expense.
|
|
175
|
+
*/
|
|
176
|
+
export declare function recordReviewFindings(store: Store, input: {
|
|
177
|
+
run: number;
|
|
178
|
+
taskId: string;
|
|
179
|
+
sentBackAs: string | null;
|
|
180
|
+
high: readonly BuildFinding[];
|
|
181
|
+
}, now: Date): void;
|
|
182
|
+
export declare const NOT_ON_TASK = "That result isn't on this task.";
|
|
183
|
+
/** Whether a run belongs to this task's family. Admission proves the task named, never a run a form or flag names beside
|
|
184
|
+
* it, so every act that takes a run checks it here: no finding's text crosses a task or a project. */
|
|
185
|
+
export declare function runOnTask(store: Store, runId: number, taskId: string): boolean;
|
|
186
|
+
/** Send one of a result's review findings: `<run>:<number>`, counted from 1 as the result lists them. */
|
|
187
|
+
export declare function sendReviewFinding(store: Store, taskId: string, pointer: string, by: string, now: Date): SendAnswer;
|
|
188
|
+
/** The review finding `<run>:<number>` names, on this task's family: what a send would quote, read once for both. */
|
|
189
|
+
export declare function reviewFindingAt(store: Store, taskId: string, pointer: string): {
|
|
190
|
+
ok: true;
|
|
191
|
+
run: number;
|
|
192
|
+
finding: BuildFinding;
|
|
193
|
+
} | {
|
|
194
|
+
ok: false;
|
|
195
|
+
message: string;
|
|
196
|
+
};
|
|
197
|
+
/** Send a result's failed check, with the end of its sealed log as the evidence. The summary is Toolroll's own words. */
|
|
198
|
+
export declare function sendCheckFinding(store: Store, root: string, taskId: string, runId: number, by: string, now: Date): SendAnswer;
|
|
199
|
+
/** A failed check as a send would quote it. */
|
|
200
|
+
export declare function checkFindingAt(store: Store, root: string, taskId: string, runId: number): {
|
|
201
|
+
ok: true;
|
|
202
|
+
summary: string;
|
|
203
|
+
head: string | null;
|
|
204
|
+
excerpt: string;
|
|
205
|
+
} | {
|
|
206
|
+
ok: false;
|
|
207
|
+
message: string;
|
|
208
|
+
};
|
|
209
|
+
/** The folder an attempt's answers go in, and what the brief says about writing one. Trusted words: nothing here is quoted. */
|
|
210
|
+
export declare function findingAnswerRule(folder: string, key: string): string[];
|
|
211
|
+
/** The findings a fresh attempt starts with, quoted as data. `answer` is the folder and key, when this attempt has one. */
|
|
212
|
+
export declare function findingsBriefLines(findings: readonly Finding[], answer: {
|
|
213
|
+
folder: string;
|
|
214
|
+
key: string;
|
|
215
|
+
} | null): string[];
|
|
216
|
+
/** How a finding stands, for a person, in one sentence. Text after a colon is the agent's. */
|
|
217
|
+
export declare function findingStandingWords(finding: Finding): string;
|
|
218
|
+
/** Plain lines for `task show`, `finding list` and the handover note. */
|
|
219
|
+
export declare function findingLine(finding: Finding): string;
|
|
220
|
+
/** The web's door to the same gate as chat (familyInReach): the projects this person reaches are those the page can
|
|
221
|
+
* see and their account may access, and every project in the task's family must be one of them. Null: out of reach. */
|
|
222
|
+
export declare function familyInWebReach(store: Store, who: {
|
|
223
|
+
name: string;
|
|
224
|
+
}, task: string, visible: (repo: string | null) => boolean): readonly string[] | null;
|