@openagt/dashboard 0.25.0 → 0.26.0
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/dist/bridge-browser.d.ts +6 -4
- package/dist/bridge-browser.d.ts.map +1 -1
- package/dist/bridge-browser.js +68 -21
- package/dist/bridge-browser.js.map +1 -1
- package/dist/browser-stream.d.ts.map +1 -1
- package/dist/browser-stream.js +11 -0
- package/dist/browser-stream.js.map +1 -1
- package/dist/daemon-runtime.d.ts +8 -1
- package/dist/daemon-runtime.d.ts.map +1 -1
- package/dist/daemon-runtime.js +19 -2
- package/dist/daemon-runtime.js.map +1 -1
- package/dist/daemon.d.ts +5 -6
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +68 -33
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/agent-handoff.d.ts +2 -1
- package/dist/dashboard/agent-handoff.d.ts.map +1 -1
- package/dist/dashboard/agent-handoff.js +30 -4
- package/dist/dashboard/agent-handoff.js.map +1 -1
- package/dist/dashboard/cache.js +4 -1
- package/dist/dashboard/cache.js.map +1 -1
- package/dist/dashboard/index.d.ts +1 -1
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/interventions.d.ts +8 -11
- package/dist/dashboard/interventions.d.ts.map +1 -1
- package/dist/dashboard/interventions.js +106 -133
- package/dist/dashboard/interventions.js.map +1 -1
- package/dist/dashboard/keys.d.ts +2 -2
- package/dist/dashboard/keys.js +4 -4
- package/dist/dashboard/keys.js.map +1 -1
- package/dist/dashboard/overview.d.ts.map +1 -1
- package/dist/dashboard/overview.js +5 -6
- package/dist/dashboard/overview.js.map +1 -1
- package/dist/dashboard/pull-requests.d.ts +27 -1
- package/dist/dashboard/pull-requests.d.ts.map +1 -1
- package/dist/dashboard/pull-requests.js +55 -1
- package/dist/dashboard/pull-requests.js.map +1 -1
- package/dist/dashboard/rpc-serve.d.ts +4 -1
- package/dist/dashboard/rpc-serve.d.ts.map +1 -1
- package/dist/dashboard/rpc-serve.js.map +1 -1
- package/dist/dashboard/server.d.ts +3 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +1 -0
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/types.d.ts +18 -0
- package/dist/dashboard/types.d.ts.map +1 -1
- package/dist/dashboard/unpublished.d.ts +43 -0
- package/dist/dashboard/unpublished.d.ts.map +1 -0
- package/dist/dashboard/unpublished.js +74 -0
- package/dist/dashboard/unpublished.js.map +1 -0
- package/dist/dashboard-bundle/assets/main-CTqah6if.js +145 -0
- package/dist/dashboard-bundle/assets/main-iqtcpdTX.css +2 -0
- package/dist/dashboard-bundle/assets/module-Dy8zK3Qd.js +14 -0
- package/dist/dashboard-bundle/host/module.js +1 -1
- package/dist/dashboard-bundle/index.html +3 -3
- package/dist/dashboard-rpc/context.d.ts +2 -0
- package/dist/dashboard-rpc/context.d.ts.map +1 -1
- package/dist/dashboard-rpc/context.js +4 -0
- package/dist/dashboard-rpc/context.js.map +1 -1
- package/dist/dashboard-rpc/index.d.ts +1 -1
- package/dist/dashboard-rpc/index.d.ts.map +1 -1
- package/dist/dashboard-rpc/index.js +1 -1
- package/dist/dashboard-rpc/index.js.map +1 -1
- package/dist/dashboard-rpc/projects.d.ts +11 -1
- package/dist/dashboard-rpc/projects.d.ts.map +1 -1
- package/dist/dashboard-rpc/projects.js +15 -1
- package/dist/dashboard-rpc/projects.js.map +1 -1
- package/dist/dashboard-rpc/reads.d.ts +18 -1
- package/dist/dashboard-rpc/reads.d.ts.map +1 -1
- package/dist/dashboard-rpc/reads.js +40 -2
- package/dist/dashboard-rpc/reads.js.map +1 -1
- package/dist/dashboard-rpc/test-context.d.ts.map +1 -1
- package/dist/dashboard-rpc/test-context.js +3 -2
- package/dist/dashboard-rpc/test-context.js.map +1 -1
- package/dist/join-dashboard.d.ts +21 -0
- package/dist/join-dashboard.d.ts.map +1 -0
- package/dist/join-dashboard.js +22 -0
- package/dist/join-dashboard.js.map +1 -0
- package/dist/module-types/dashboard/components/ui/checkbox.d.ts +1 -1
- package/dist/module-types/dashboard/components/ui/context-menu.d.ts +2 -2
- package/dist/module-types/dashboard/components/ui/dropdown-menu.d.ts +2 -2
- package/dist/module-types/dashboard/components/ui/popover.d.ts +1 -1
- package/dist/module-types/dashboard/components/ui/radio-group.d.ts +2 -2
- package/dist/module-types/dashboard/components/ui/scroll-area.d.ts +1 -1
- package/dist/module-types/dashboard/components/ui/select.d.ts +1 -1
- package/dist/module-types/dashboard/components/ui/separator.d.ts +1 -1
- package/dist/module-types/dashboard/components/ui/switch.d.ts +1 -1
- package/dist/module-types/dashboard/components/ui/tooltip.d.ts +3 -3
- package/dist/module-types/dashboard/lib/data-link.d.ts +1 -1
- package/dist/module-types/dashboard/lib/route.d.ts +1 -24
- package/dist/module-types/src/bridge-browser.d.ts +6 -4
- package/dist/module-types/src/dashboard/agent-handoff.d.ts +2 -1
- package/dist/module-types/src/dashboard/interventions.d.ts +8 -11
- package/dist/module-types/src/dashboard/keys.d.ts +2 -2
- package/dist/module-types/src/dashboard/pull-requests.d.ts +27 -1
- package/dist/module-types/src/dashboard/rpc-serve.d.ts +4 -1
- package/dist/module-types/src/dashboard/types.d.ts +18 -0
- package/dist/module-types/src/dashboard/unpublished.d.ts +42 -0
- package/dist/module-types/src/dashboard-rpc/context.d.ts +2 -0
- package/dist/module-types/src/dashboard-rpc/index.d.ts +1 -1
- package/dist/module-types/src/dashboard-rpc/projects.d.ts +11 -1
- package/dist/module-types/src/dashboard-rpc/reads.d.ts +18 -1
- package/dist/module-types/src/project-address.d.ts +32 -0
- package/dist/module-types/src/store/agent-store.d.ts +13 -0
- package/dist/module-types/src/store/branches.d.ts +28 -2
- package/dist/module-types/src/store/index.d.ts +1 -1
- package/dist/module.css +1 -0
- package/dist/project-address.d.ts +33 -0
- package/dist/project-address.d.ts.map +1 -0
- package/dist/project-address.js +57 -0
- package/dist/project-address.js.map +1 -0
- package/dist/serve.d.ts +2 -0
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +1 -0
- package/dist/serve.js.map +1 -1
- package/dist/store/agent-store.d.ts +13 -0
- package/dist/store/agent-store.d.ts.map +1 -1
- package/dist/store/agent-store.js.map +1 -1
- package/dist/store/branches.d.ts +28 -2
- package/dist/store/branches.d.ts.map +1 -1
- package/dist/store/branches.js +38 -22
- package/dist/store/branches.js.map +1 -1
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/test-branches.d.ts.map +1 -1
- package/dist/store/test-branches.js +6 -0
- package/dist/store/test-branches.js.map +1 -1
- package/package.json +13 -13
- package/dist/dashboard-bundle/assets/main-CTyvdSpb.js +0 -145
- package/dist/dashboard-bundle/assets/main-CvaxZfR1.css +0 -2
- package/dist/dashboard-bundle/assets/module-Ba-5IEOx.js +0 -25
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { listAgents, loadAgentEvents, readLiveMetas } from '../store/index.js';
|
|
2
2
|
import { pendingChoices } from '../open-choices.js';
|
|
3
|
-
import { agentBranchFor } from './agent-handoff.js';
|
|
4
3
|
import { projectBranches } from '../store/branches.js';
|
|
5
|
-
import {
|
|
4
|
+
import { unpublishedRuns } from './unpublished.js';
|
|
5
|
+
import { cachedOpenPrs } from './pull-requests.js';
|
|
6
6
|
import { interventionKey } from './keys.js';
|
|
7
7
|
// Pure identity + diff, in the leaf `keys.ts` so the dashboard shares them rather than copying.
|
|
8
8
|
export { interventionKey } from './keys.js';
|
|
9
|
-
/** How many recent finished agents are inspected per project by default. */
|
|
10
|
-
const HANDOFF_LIMIT = 5;
|
|
11
9
|
/**
|
|
12
10
|
* Build the cross-project interventions queue: every registered project's open PRs, plus any run
|
|
13
11
|
* currently paused on a choice gate (#636), newest first. Forgiving — a project with no remote
|
|
@@ -21,79 +19,11 @@ const HANDOFF_LIMIT = 5;
|
|
|
21
19
|
* the notification watcher is the caller that cannot.
|
|
22
20
|
*/
|
|
23
21
|
export async function buildInterventions(projects, deps = {}) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
const items =
|
|
28
|
-
const whole = [];
|
|
29
|
-
for (const project of projects) {
|
|
30
|
-
// A project is read whole only when every one of its sources answered. Each `unread()` below is
|
|
31
|
-
// a source that did not, and contributed nothing for a reason other than nothing being there.
|
|
32
|
-
let sawEverything = true;
|
|
33
|
-
const unread = () => {
|
|
34
|
-
sawEverything = false;
|
|
35
|
-
return [];
|
|
36
|
-
};
|
|
37
|
-
const open = await prs(project.path).catch(unread);
|
|
38
|
-
// The branches the project's runs are on, recorded or in a checkout (#1774): what tells a
|
|
39
|
-
// run's draft from one opened by hand. Read only when a draft asks.
|
|
40
|
-
let runBranches;
|
|
41
|
-
const isRunBranch = async (branch) => {
|
|
42
|
-
runBranches ??= new Set([...(await (deps.agents ?? listAgents)(project.path).catch(() => [])), ...(await liveAgents(project.path).catch(() => []))].flatMap(agent => (agent.branch ? [agent.branch] : [])));
|
|
43
|
-
return runBranches.has(branch);
|
|
44
|
-
};
|
|
45
|
-
for (const pr of open) {
|
|
46
|
-
// A draft opened by hand is not asking for review, so it stays off the queue. A draft on a
|
|
47
|
-
// run's branch is the opposite (#1102): the agent, or cloud work adoption, opened it as a
|
|
48
|
-
// draft so it does not ping reviewers, and if the queue then dropped it too, nothing
|
|
49
|
-
// would tell anyone the work exists — which is the whole of #860 again.
|
|
50
|
-
if (pr.isDraft && !(pr.headRefName !== undefined && (await isRunBranch(pr.headRefName))))
|
|
51
|
-
continue;
|
|
52
|
-
items.push({
|
|
53
|
-
projectId: project.id,
|
|
54
|
-
projectName: project.name,
|
|
55
|
-
kind: 'pr',
|
|
56
|
-
number: pr.number,
|
|
57
|
-
title: pr.title,
|
|
58
|
-
url: pr.url,
|
|
59
|
-
...(pr.createdAt ? { createdAt: pr.createdAt } : {}),
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
// A run that ended on a question waits for the user, a "needs you" too (#636): it ended
|
|
63
|
-
// `waiting`, its checkout kept for the answer (#1774). The question is read off the run's own
|
|
64
|
-
// diary by the rule the run page and the open-questions list use, so the ping names the question
|
|
65
|
-
// they offer; a waiting run whose diary shows none is skipped. A project has several runs
|
|
66
|
-
// (#736), so each waiting run contributes its own item — keyed on the question's id, plus the
|
|
67
|
-
// agent id so two runs are told apart.
|
|
68
|
-
for (const meta of await liveAgents(project.path).catch(unread)) {
|
|
69
|
-
if (meta.status !== 'waiting')
|
|
70
|
-
continue;
|
|
71
|
-
const choice = pendingChoices((await events(project.path, meta.id).catch(() => undefined)) ?? []).at(-1);
|
|
72
|
-
if (!choice)
|
|
73
|
-
continue;
|
|
74
|
-
items.push({
|
|
75
|
-
projectId: project.id,
|
|
76
|
-
projectName: project.name,
|
|
77
|
-
kind: 'awaiting',
|
|
78
|
-
title: choice.title,
|
|
79
|
-
awaitId: choice.id,
|
|
80
|
-
agentId: meta.id,
|
|
81
|
-
...(meta.updatedAt ? { createdAt: meta.updatedAt } : {}),
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
// A finished agent whose work never left the machine is a "needs you" too (#860). Until now the
|
|
85
|
-
// queue only knew about a PR that is *already on the git host* and an agent parked on a gate, so an agent
|
|
86
|
-
// that committed real code and stopped produced neither, and nothing told anyone: the overview
|
|
87
|
-
// drops it (it filters on `running`) and the handoff panel is behind clicking into that agent.
|
|
88
|
-
//
|
|
89
|
-
// Surfacing only: this says there is a decision waiting, it does not take it. A run publishes
|
|
90
|
-
// nothing by itself, so every finished run with work of its own reaches here until a person
|
|
91
|
-
// publishes it, or the agent does on their ask.
|
|
92
|
-
for (const item of await unpushedFor(project, deps, unread).catch(unread))
|
|
93
|
-
items.push(item);
|
|
94
|
-
if (sawEverything)
|
|
95
|
-
whole.push(project.id);
|
|
96
|
-
}
|
|
22
|
+
// Every project at once, and each one's sources at once: a project's open requests are a git host
|
|
23
|
+
// read, and asking them one project after the other kept the queue waiting seconds.
|
|
24
|
+
const read = await Promise.all(projects.map(project => projectInterventions(project, deps)));
|
|
25
|
+
const items = read.flatMap(project => project.items);
|
|
26
|
+
const whole = read.flatMap(project => (project.whole ? [project.id] : []));
|
|
97
27
|
items.sort((a, b) => (b.createdAt ?? '').localeCompare(a.createdAt ?? ''));
|
|
98
28
|
// The same repo can be registered under two projects (e.g. a monorepo root + a subdir), so a
|
|
99
29
|
// PR would otherwise appear once per entry. Collapse by identity, keeping the first (newest-sorted).
|
|
@@ -101,69 +31,112 @@ export async function buildInterventions(projects, deps = {}) {
|
|
|
101
31
|
const unique = items.filter(item => (seen.has(interventionKey(item)) ? false : (seen.add(interventionKey(item)), true)));
|
|
102
32
|
return { items: unique, whole };
|
|
103
33
|
}
|
|
104
|
-
/**
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
*/
|
|
115
|
-
async function unpushedFor(project, deps, unread) {
|
|
116
|
-
const agents = deps.agents ?? listAgents;
|
|
117
|
-
const branches = deps.branches ?? projectBranches;
|
|
118
|
-
const finished = (await agents(project.path))
|
|
119
|
-
// A subagent's branch is its main agent's to land, never a person's to push.
|
|
120
|
-
.filter(agent => agent.status !== 'running' && agent.parent === undefined)
|
|
121
|
-
.sort((a, b) => (b.startedAt ?? '').localeCompare(a.startedAt ?? ''))
|
|
122
|
-
.slice(0, deps.handoffLimit ?? HANDOFF_LIMIT)
|
|
123
|
-
.flatMap(agent => {
|
|
124
|
-
const branch = agentBranchFor(agent);
|
|
125
|
-
return branch === undefined ? [] : [{ agent, branch }];
|
|
126
|
-
});
|
|
127
|
-
if (finished.length === 0)
|
|
128
|
-
return [];
|
|
129
|
-
// No provider: the project has no checkouts and no branch state to read; nothing is waiting.
|
|
130
|
-
const source = await branches(project.path).catch(() => undefined);
|
|
131
|
-
if (!source)
|
|
132
|
-
return [];
|
|
133
|
-
// One read per commit the branches are measured from; the runs that name none share one.
|
|
134
|
-
const asks = new Map();
|
|
135
|
-
for (const { agent, branch } of finished)
|
|
136
|
-
asks.set(agent.baseCommit, [...(asks.get(agent.baseCommit) ?? []), branch]);
|
|
137
|
-
const states = new Map();
|
|
138
|
-
try {
|
|
139
|
-
for (const shown of await Promise.all([...asks].map(([from, asked]) => source.show(asked, from)))) {
|
|
140
|
-
for (const state of shown)
|
|
141
|
-
states.set(state.branch, state);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
catch {
|
|
145
|
-
unread();
|
|
34
|
+
/** One project's items, and whether every one of its sources answered. */
|
|
35
|
+
async function projectInterventions(project, deps) {
|
|
36
|
+
const prs = deps.prs ?? cachedOpenPrs;
|
|
37
|
+
const liveAgents = deps.liveAgents ?? readLiveMetas;
|
|
38
|
+
const events = deps.events ?? loadAgentEvents;
|
|
39
|
+
// A project is read whole only when every one of its sources answered. Each `unread()` below is
|
|
40
|
+
// a source that did not, and contributed nothing for a reason other than nothing being there.
|
|
41
|
+
let sawEverything = true;
|
|
42
|
+
const unread = () => {
|
|
43
|
+
sawEverything = false;
|
|
146
44
|
return [];
|
|
147
|
-
}
|
|
45
|
+
};
|
|
46
|
+
// The project's runs, recorded and live, read once for every source that asks.
|
|
47
|
+
const [open, recorded, live] = await Promise.all([
|
|
48
|
+
prs(project.path).catch(unread),
|
|
49
|
+
(deps.agents ?? listAgents)(project.path).catch(() => undefined),
|
|
50
|
+
liveAgents(project.path).catch(() => undefined),
|
|
51
|
+
]);
|
|
52
|
+
// Newest first: a branch name reused by a later run, or a run continued on it, is that run's now.
|
|
53
|
+
const runs = [...(live ?? []), ...(recorded ?? [])].sort((a, b) => b.startedAt.localeCompare(a.startedAt));
|
|
148
54
|
const items = [];
|
|
149
|
-
for (const
|
|
150
|
-
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
|
|
55
|
+
for (const pr of open) {
|
|
56
|
+
// The run that opened it, by the request its record names, else by the branch a run's record or
|
|
57
|
+
// checkout names (#1774): what tells a run's draft from one opened by hand, and where a click on
|
|
58
|
+
// the row goes, the conversation rather than the git host.
|
|
59
|
+
const run = runs.find(agent => agent.pr?.url === pr.url) ?? (pr.headRefName !== undefined ? runs.find(agent => agent.branch === pr.headRefName) : undefined);
|
|
60
|
+
// A draft opened by hand is not asking for review, so it stays off the queue. A draft on a
|
|
61
|
+
// run's branch is the opposite (#1102): the agent, or cloud work adoption, opened it as a
|
|
62
|
+
// draft so it does not ping reviewers, and if the queue then dropped it too, nothing
|
|
63
|
+
// would tell anyone the work exists — which is the whole of #860 again.
|
|
64
|
+
if (pr.isDraft && !run)
|
|
154
65
|
continue;
|
|
155
66
|
items.push({
|
|
156
67
|
projectId: project.id,
|
|
157
68
|
projectName: project.name,
|
|
158
|
-
kind: '
|
|
159
|
-
|
|
160
|
-
title:
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
...(agent.updatedAt ? { createdAt: agent.updatedAt } : {}),
|
|
69
|
+
kind: 'pr',
|
|
70
|
+
number: pr.number,
|
|
71
|
+
title: pr.title,
|
|
72
|
+
url: pr.url,
|
|
73
|
+
...(run ? { agentId: run.id } : {}),
|
|
74
|
+
...(pr.createdAt ? { createdAt: pr.createdAt } : {}),
|
|
165
75
|
});
|
|
166
76
|
}
|
|
167
|
-
|
|
77
|
+
// A run that ended on a question waits for the user, a "needs you" too (#636): it ended
|
|
78
|
+
// `waiting`, its checkout kept for the answer (#1774). The question is read off the run's own
|
|
79
|
+
// diary by the rule the run page and the open-questions list use, so the ping names the question
|
|
80
|
+
// they offer; a waiting run whose diary shows none is skipped. A project has several runs
|
|
81
|
+
// (#736), so each waiting run contributes its own item — keyed on the question's id, plus the
|
|
82
|
+
// agent id so two runs are told apart.
|
|
83
|
+
if (live === undefined)
|
|
84
|
+
unread();
|
|
85
|
+
const awaiting = await Promise.all((live ?? [])
|
|
86
|
+
.filter(meta => meta.status === 'waiting')
|
|
87
|
+
.map(async (meta) => {
|
|
88
|
+
const choice = pendingChoices((await events(project.path, meta.id).catch(() => undefined)) ?? []).at(-1);
|
|
89
|
+
return choice
|
|
90
|
+
? [{ projectId: project.id, projectName: project.name, kind: 'awaiting', title: choice.title, awaitId: choice.id, agentId: meta.id, ...(meta.updatedAt ? { createdAt: meta.updatedAt } : {}) }]
|
|
91
|
+
: [];
|
|
92
|
+
}));
|
|
93
|
+
items.push(...awaiting.flat());
|
|
94
|
+
// A finished run whose work never left the machine is a "needs you" too (#860). Until then the
|
|
95
|
+
// queue only knew about a PR that is *already on the git host* and an agent parked on a gate, so an agent
|
|
96
|
+
// that committed real code and stopped produced neither, and nothing told anyone: the overview
|
|
97
|
+
// drops it (it filters on `running`) and the handoff panel is behind clicking into that agent.
|
|
98
|
+
//
|
|
99
|
+
// Surfacing only: this says there is a decision waiting, it does not take it. A run publishes
|
|
100
|
+
// nothing by itself, so every finished run with work of its own reaches here until a person
|
|
101
|
+
// publishes it, or the agent does on their ask.
|
|
102
|
+
if (recorded === undefined)
|
|
103
|
+
unread();
|
|
104
|
+
items.push(...(await unpushedFor(project, recorded ?? [], deps.branches ?? projectBranches, unread)));
|
|
105
|
+
return { id: project.id, items, whole: sawEverything };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The finished runs of a project whose work never left this machine (#860), as
|
|
109
|
+
* {@link unpublishedRuns} finds them for the list of runs too: files left uncommitted first, since
|
|
110
|
+
* committing them is the run's next step, else commits never pushed. The provider answers git
|
|
111
|
+
* facts only, so the git host PR lookup the handoff summary makes per branch is never paid here: an
|
|
112
|
+
* open PR means the branch was pushed, and the `pr` kind above is what surfaces it.
|
|
113
|
+
*/
|
|
114
|
+
async function unpushedFor(project, agents, branches, unread) {
|
|
115
|
+
let found;
|
|
116
|
+
try {
|
|
117
|
+
found = await unpublishedRuns(project.path, agents, branches);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
unread();
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
return agents.flatMap(agent => {
|
|
124
|
+
const work = found.get(agent.id);
|
|
125
|
+
if (!work)
|
|
126
|
+
return [];
|
|
127
|
+
const left = work.uncommitted > 0 ? { kind: 'uncommitted', files: work.uncommitted } : { kind: 'unpushed', commits: work.commits };
|
|
128
|
+
return [
|
|
129
|
+
{
|
|
130
|
+
projectId: project.id,
|
|
131
|
+
projectName: project.name,
|
|
132
|
+
...left,
|
|
133
|
+
// What was asked, else the run's own name, else the branch: never a prefix cut off here.
|
|
134
|
+
title: agent.intent?.trim() || agent.title?.trim() || work.branch,
|
|
135
|
+
agentId: agent.id,
|
|
136
|
+
branch: work.branch,
|
|
137
|
+
...(agent.updatedAt ? { createdAt: agent.updatedAt } : {}),
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
});
|
|
168
141
|
}
|
|
169
142
|
//# sourceMappingURL=interventions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interventions.js","sourceRoot":"","sources":["../../src/dashboard/interventions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAkC,MAAM,mBAAmB,CAAA;AAC9G,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"interventions.js","sourceRoot":"","sources":["../../src/dashboard/interventions.ts"],"names":[],"mappings":"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"}
|
package/dist/dashboard/keys.d.ts
CHANGED
|
@@ -14,8 +14,8 @@ import type { Intervention } from './interventions.js';
|
|
|
14
14
|
*/
|
|
15
15
|
/**
|
|
16
16
|
* The stable identity of an intervention. A PR is its url (survives title edits and re-sorts);
|
|
17
|
-
* the
|
|
18
|
-
* the gate it is parked on, or the agent whose
|
|
17
|
+
* the others have no url and are keyed on the project plus the thing waiting — the agent and
|
|
18
|
+
* the gate it is parked on, or the agent whose work is uncommitted or unpushed.
|
|
19
19
|
*
|
|
20
20
|
* The agent is part of the awaiting key because a gate id is only unique within its own agent:
|
|
21
21
|
* every agent's first gate is `await-choices`. Two agents running in one project (#736) and both
|
package/dist/dashboard/keys.js
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
/**
|
|
14
14
|
* The stable identity of an intervention. A PR is its url (survives title edits and re-sorts);
|
|
15
|
-
* the
|
|
16
|
-
* the gate it is parked on, or the agent whose
|
|
15
|
+
* the others have no url and are keyed on the project plus the thing waiting — the agent and
|
|
16
|
+
* the gate it is parked on, or the agent whose work is uncommitted or unpushed.
|
|
17
17
|
*
|
|
18
18
|
* The agent is part of the awaiting key because a gate id is only unique within its own agent:
|
|
19
19
|
* every agent's first gate is `await-choices`. Two agents running in one project (#736) and both
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
export function interventionKey(item) {
|
|
23
23
|
if (item.kind === 'awaiting')
|
|
24
24
|
return `awaiting:${item.projectId}:${item.agentId ?? ''}:${item.awaitId ?? ''}`;
|
|
25
|
-
if (item.kind === 'unpushed')
|
|
26
|
-
return
|
|
25
|
+
if (item.kind === 'uncommitted' || item.kind === 'unpushed')
|
|
26
|
+
return `${item.kind}:${item.projectId}:${item.agentId ?? ''}`;
|
|
27
27
|
return item.url ?? '';
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/dashboard/keys.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,YAAY,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAA;IAC7G,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/dashboard/keys.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,YAAY,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAA;IAC7G,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAA;IAC1H,OAAO,IAAI,CAAC,GAAG,IAAI,EAAE,CAAA;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA;AACzD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../src/dashboard/overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAClH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAW5D,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,WAAW,CAAA;IACnB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAA;IAC9B,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,QAAQ;IACvB,kEAAkE;IAClE,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,MAAM,EAAE,aAAa,EAAE,CAAA;CACxB;AAED,6FAA6F;AAC7F,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,SAAS,CAAA;CACjB;AAQD,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;CAC/C;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../src/dashboard/overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAClH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAW5D,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,WAAW,CAAA;IACnB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAA;IAC9B,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,QAAQ;IACvB,kEAAkE;IAClE,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,MAAM,EAAE,aAAa,EAAE,CAAA;CACxB;AAED,6FAA6F;AAC7F,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,SAAS,CAAA;CACjB;AAQD,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;CAC/C;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAYvH;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAClD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAC/D,yGAAyG;IACzG,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAC9C,uGAAuG;IACvG,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;IACxC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoD1G"}
|
|
@@ -15,12 +15,11 @@ const RECENT_RUNS_LIMIT = 30;
|
|
|
15
15
|
*/
|
|
16
16
|
export async function buildRecentAgents(projects, deps = {}) {
|
|
17
17
|
const readAgents = deps.agents ?? readAllAgents;
|
|
18
|
-
|
|
19
|
-
for
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
18
|
+
// Every project at once: each one's read is a git read of its branches too (the rows' marks), and
|
|
19
|
+
// one after the other the list waited for all of them in turn. Kept in the projects' order, so
|
|
20
|
+
// the first project to list a run still keeps it below.
|
|
21
|
+
const read = await Promise.all(projects.map(project => readAgents(project.path).catch(() => [])));
|
|
22
|
+
const all = projects.flatMap((project, at) => (read[at] ?? []).map(agent => ({ projectId: project.id, projectName: project.name, agent })));
|
|
24
23
|
all.sort((a, b) => (b.agent.startedAt ?? '').localeCompare(a.agent.startedAt ?? ''));
|
|
25
24
|
// One row per run (#1648): two checkouts of one repository share their archive, so every run
|
|
26
25
|
// was listed once per checkout; the first project to list it keeps it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/dashboard/overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAoD,MAAM,mBAAmB,CAAA;AAElH,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAwDlC,sDAAsD;AACtD,MAAM,YAAY,GAAG,CAAC,CAAA;AAEtB,yEAAyE;AACzE,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAO5B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAA0B,EAAE,IAAI,GAAqB,EAAE;IAC7F,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAA;IAC/C,
|
|
1
|
+
{"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/dashboard/overview.ts"],"names":[],"mappings":"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"}
|
|
@@ -91,8 +91,25 @@ export declare function prView(cwd: string, branch: string, gitHost?: GitHostFor
|
|
|
91
91
|
* deciding whether to offer "Open PR". A read with no branch to ask about answers nothing at once.
|
|
92
92
|
*/
|
|
93
93
|
export declare function cachedPrView(cwd: string, branch?: string): Promise<Cached<LinkedPr | undefined>>;
|
|
94
|
-
/** Forget a branch's PR, after an action that changes whether it has one. */
|
|
94
|
+
/** Forget a branch's PR, after an action that changes whether it has one, and with it how the project's PRs stand and which are open. */
|
|
95
95
|
export declare function forgetPr(cwd: string, branch?: string): void;
|
|
96
|
+
/** How a run's pull request stands, as its row in the list of runs shows it. */
|
|
97
|
+
export type PrState = 'open' | 'draft' | 'merged' | 'closed';
|
|
98
|
+
/**
|
|
99
|
+
* How each of a project's newest pull requests stands, by its address: what the list of runs marks
|
|
100
|
+
* each run's PR with. One listing of the project's requests, whatever their state, rather than one
|
|
101
|
+
* per run; a request older than what the git host lists has no state here. A listing the git host
|
|
102
|
+
* cannot answer throws.
|
|
103
|
+
*/
|
|
104
|
+
export declare function prStates(cwd: string, gitHost?: GitHostFor): Promise<Map<string, PrState>>;
|
|
105
|
+
/**
|
|
106
|
+
* The cached form of {@link prStates} (#1028): the list of runs is polled every few seconds, and a
|
|
107
|
+
* PR's state changes far less often. A listing that fails is kept like an answer, as the states
|
|
108
|
+
* last read, so a git host that cannot answer is asked again a minute later, not at every poll;
|
|
109
|
+
* and while a read is on its way, after a request was opened or merged here, the rows keep the
|
|
110
|
+
* states they had.
|
|
111
|
+
*/
|
|
112
|
+
export declare function cachedPrStates(cwd: string, read?: (cwd: string) => Promise<Map<string, PrState>>): Promise<Map<string, PrState>>;
|
|
96
113
|
/** The cached form of {@link prsForBranch}, shared through the same read-through cache (#1028). */
|
|
97
114
|
export declare function cachedPrsForBranch(cwd: string, branch: string): Promise<Cached<LinkedPr[]>>;
|
|
98
115
|
/** Forget a branch's PR history, after an action that changes it (opening one). */
|
|
@@ -124,4 +141,13 @@ export declare function pickAgentPr(prs: LinkedPr[], since?: string, order?: 'fi
|
|
|
124
141
|
* it cannot decide what it never hears about. A project with no git host package has none open.
|
|
125
142
|
*/
|
|
126
143
|
export declare function openPrs(cwd: string, gitHost?: GitHostFor): Promise<OpenPr[]>;
|
|
144
|
+
/**
|
|
145
|
+
* The cached form of {@link openPrs} (#1028), for the Human Queue: it asked the git host at every
|
|
146
|
+
* poll of every page that shows it, and the page waited. The first ask waits for the answer; after
|
|
147
|
+
* that the list last read answers at once and is read again behind it once it is
|
|
148
|
+
* {@link OPEN_PRS_TTL_MS} old. A request opened or merged here is read again at once
|
|
149
|
+
* ({@link forgetPr}). A first read that fails rejects, as {@link openPrs} does; a later one keeps
|
|
150
|
+
* the list last read.
|
|
151
|
+
*/
|
|
152
|
+
export declare function cachedOpenPrs(cwd: string, read?: (cwd: string) => Promise<OpenPr[]>): Promise<OpenPr[]>;
|
|
127
153
|
//# sourceMappingURL=pull-requests.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull-requests.d.ts","sourceRoot":"","sources":["../../src/dashboard/pull-requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,EAA0B,KAAK,MAAM,EAAE,MAAM,YAAY,CAAA;AAEhE;;;;;;;;;;GAUG;AAEH,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,iHAAiH;IACjH,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,oGAAoG;IACpG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,oDAAoD;AACpD,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX;;;;;OAKG;IACH,OAAO,EAAE,OAAO,CAAA;IAChB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;AAEtF;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;AAE3F,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;AAEzD,2GAA2G;AAC3G,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,QAAQ,CAU5D;AAED,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CASxD;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,UAA2B,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAEzH;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,UAA2B,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAMhI;AAED,0GAA0G;AAC1G,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,UAA2B,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAE7H;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAGtG;AAED,
|
|
1
|
+
{"version":3,"file":"pull-requests.d.ts","sourceRoot":"","sources":["../../src/dashboard/pull-requests.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,9 +69,39 @@ export async function cachedPrView(cwd, branch) {
|
|
|
69
69
|
return { value: undefined, pending: false };
|
|
70
70
|
return cachedRead(prCacheKey(cwd, branch), () => prView(cwd, branch));
|
|
71
71
|
}
|
|
72
|
-
/** Forget a branch's PR, after an action that changes whether it has one. */
|
|
72
|
+
/** Forget a branch's PR, after an action that changes whether it has one, and with it how the project's PRs stand and which are open. */
|
|
73
73
|
export function forgetPr(cwd, branch) {
|
|
74
74
|
invalidate(prCacheKey(cwd, branch));
|
|
75
|
+
invalidate(prStatesCacheKey(cwd));
|
|
76
|
+
invalidate(openPrsCacheKey(cwd));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* How each of a project's newest pull requests stands, by its address: what the list of runs marks
|
|
80
|
+
* each run's PR with. One listing of the project's requests, whatever their state, rather than one
|
|
81
|
+
* per run; a request older than what the git host lists has no state here. A listing the git host
|
|
82
|
+
* cannot answer throws.
|
|
83
|
+
*/
|
|
84
|
+
export async function prStates(cwd, gitHost = projectGitHost) {
|
|
85
|
+
const source = await gitHost(cwd);
|
|
86
|
+
if (!source)
|
|
87
|
+
return new Map();
|
|
88
|
+
const listed = await source.requests({ state: 'all' });
|
|
89
|
+
if (!listed.ok)
|
|
90
|
+
throw new Error(listed.error);
|
|
91
|
+
return new Map(listed.requests.map(request => [request.url, request.state === 'open' && request.draft ? 'draft' : request.state]));
|
|
92
|
+
}
|
|
93
|
+
/** The states each project last read, so a read that fails or is on its way shows those rather than none. */
|
|
94
|
+
const lastStates = new Map();
|
|
95
|
+
/**
|
|
96
|
+
* The cached form of {@link prStates} (#1028): the list of runs is polled every few seconds, and a
|
|
97
|
+
* PR's state changes far less often. A listing that fails is kept like an answer, as the states
|
|
98
|
+
* last read, so a git host that cannot answer is asked again a minute later, not at every poll;
|
|
99
|
+
* and while a read is on its way, after a request was opened or merged here, the rows keep the
|
|
100
|
+
* states they had.
|
|
101
|
+
*/
|
|
102
|
+
export async function cachedPrStates(cwd, read = prStates) {
|
|
103
|
+
const cached = await cachedRead(prStatesCacheKey(cwd), () => read(cwd).then(states => (lastStates.set(cwd, states), states), () => lastStates.get(cwd) ?? new Map()));
|
|
104
|
+
return cached.value ?? lastStates.get(cwd) ?? new Map();
|
|
75
105
|
}
|
|
76
106
|
/** The cached form of {@link prsForBranch}, shared through the same read-through cache (#1028). */
|
|
77
107
|
export async function cachedPrsForBranch(cwd, branch) {
|
|
@@ -86,6 +116,12 @@ const KEY_SEP = String.fromCharCode(0);
|
|
|
86
116
|
function prCacheKey(cwd, branch) {
|
|
87
117
|
return ['pr', cwd, branch ?? ''].join(KEY_SEP);
|
|
88
118
|
}
|
|
119
|
+
function prStatesCacheKey(cwd) {
|
|
120
|
+
return ['pr-states', cwd].join(KEY_SEP);
|
|
121
|
+
}
|
|
122
|
+
function openPrsCacheKey(cwd) {
|
|
123
|
+
return ['open-prs', cwd].join(KEY_SEP);
|
|
124
|
+
}
|
|
89
125
|
function branchPrsCacheKey(cwd, branch) {
|
|
90
126
|
return ['prs', cwd, branch].join(KEY_SEP);
|
|
91
127
|
}
|
|
@@ -134,4 +170,22 @@ export async function openPrs(cwd, gitHost = projectGitHost) {
|
|
|
134
170
|
throw new Error(listed.error);
|
|
135
171
|
return listed.requests.map(openPrOf);
|
|
136
172
|
}
|
|
173
|
+
/** How old a project's list of open requests may be before it is read again, behind whoever asks. */
|
|
174
|
+
const OPEN_PRS_TTL_MS = 20_000;
|
|
175
|
+
/** How long a first ask of a project's open requests waits for them: the git host answers well within it. */
|
|
176
|
+
const OPEN_PRS_FIRST_MS = 15_000;
|
|
177
|
+
/**
|
|
178
|
+
* The cached form of {@link openPrs} (#1028), for the Human Queue: it asked the git host at every
|
|
179
|
+
* poll of every page that shows it, and the page waited. The first ask waits for the answer; after
|
|
180
|
+
* that the list last read answers at once and is read again behind it once it is
|
|
181
|
+
* {@link OPEN_PRS_TTL_MS} old. A request opened or merged here is read again at once
|
|
182
|
+
* ({@link forgetPr}). A first read that fails rejects, as {@link openPrs} does; a later one keeps
|
|
183
|
+
* the list last read.
|
|
184
|
+
*/
|
|
185
|
+
export async function cachedOpenPrs(cwd, read = openPrs) {
|
|
186
|
+
const cached = await cachedRead(openPrsCacheKey(cwd), () => read(cwd), { ttlMs: OPEN_PRS_TTL_MS, budgetMs: OPEN_PRS_FIRST_MS });
|
|
187
|
+
if (cached.value === undefined)
|
|
188
|
+
throw new Error('the open pull requests could not be read');
|
|
189
|
+
return cached.value;
|
|
190
|
+
}
|
|
137
191
|
//# sourceMappingURL=pull-requests.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull-requests.js","sourceRoot":"","sources":["../../src/dashboard/pull-requests.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pull-requests.js","sourceRoot":"","sources":["../../src/dashboard/pull-requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwC,MAAM,sBAAsB,CAAA;AAC3F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAe,MAAM,YAAY,CAAA;AAiEhE,2GAA2G;AAC3G,MAAM,UAAU,UAAU,CAAC,OAAuB;IAChD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAA;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,QAAQ,CAAC,OAAuB;IAC9C,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,OAAO,CAAC,KAAK;QACtB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAA;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,MAAc,EAAE,OAAO,GAAe,cAAc;IAClG,OAAO,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAe,EAAE,CAAC,EAAE,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW,EAAE,MAAc,EAAE,OAAO,GAAe,cAAc;IACzG,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7C,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;AACxC,CAAC;AAED,0GAA0G;AAC1G,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAW,EAAE,MAAc,EAAE,OAAO,GAAe,cAAc;IAC5F,OAAO,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACtD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,MAAe;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACrE,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;AACvE,CAAC;AAED,yIAAyI;AACzI,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAe;IACnD,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;IACnC,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;IACjC,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;AAClC,CAAC;AAKD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,OAAO,GAAe,cAAc;IAC9E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,GAAG,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IACtD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7C,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACpI,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,GAAG,IAAI,GAAG,EAAgC,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,IAAI,GAAmD,QAAQ;IAC/G,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAC1D,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CACZ,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAC/C,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAmB,CACxD,CACF,CAAA;IACD,OAAO,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,CAAA;AACzD,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,MAAc;IAClE,OAAO,UAAU,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;AACpF,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,MAAc;IACzD,UAAU,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,uEAAuE;AACvE,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;AAEtC,SAAS,UAAU,CAAC,GAAW,EAAE,MAAe;IAC9C,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAChD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,MAAc;IACpD,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAC3C,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAAC,GAAe,EAAE,KAAc,EAAE,KAAK,GAAuB,OAAO;IAC9F,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAA;IAChD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IACrB,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,MAAM,MAAM,GAAG,GAAG;SACf,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC;SACnD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AACvD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,OAAO,GAAe,cAAc;IAC7E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IACvD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7C,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACtC,CAAC;AAED,qGAAqG;AACrG,MAAM,eAAe,GAAG,MAAM,CAAA;AAE9B,6GAA6G;AAC7G,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEhC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,IAAI,GAAuC,OAAO;IACjG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAA;IAC/H,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAC3F,OAAO,MAAM,CAAC,KAAK,CAAA;AACrB,CAAC"}
|
|
@@ -5,13 +5,15 @@ import type { QuotaSource } from './quota.js';
|
|
|
5
5
|
import type { ModelsSource } from './models.js';
|
|
6
6
|
import type { BridgeBrowserOwner } from '../bridge-browser.js';
|
|
7
7
|
import type { ProjectErrorsReader } from '../project-errors.js';
|
|
8
|
-
import type { AddProjectResult, RemoveProjectResult, StartAgentOptions, StartAgentResult } from './types.js';
|
|
8
|
+
import type { AddProjectResult, RemoveProjectResult, StartAgentOptions, StartAgentResult, StartedInResult } from './types.js';
|
|
9
9
|
import type { AgentMeta } from '../store/index.js';
|
|
10
10
|
import type { RemoteTarget } from './remote-run.js';
|
|
11
11
|
/** Wired by the daemon so `sendStart` can reach the daemon's own `startAgent` closure. */
|
|
12
12
|
export type StartAgentHandler = (prompt: string, options: StartAgentOptions, projectId?: string) => StartAgentResult | Promise<StartAgentResult>;
|
|
13
13
|
/** Wired by the daemon so `sendAddProject` can install + register a repo (#433). */
|
|
14
14
|
export type AddProjectHandler = (path: string, share: boolean) => AddProjectResult | Promise<AddProjectResult>;
|
|
15
|
+
/** Wired by the daemon so `sendStartedAgain` can find or add the project a second `openagent` was started in. */
|
|
16
|
+
export type StartedInHandler = (folder: string) => StartedInResult | Promise<StartedInResult>;
|
|
15
17
|
/** Wired by the daemon so `sendRemoveProject` can take a project off the list, by its id, and with `files` remove what OpenAgent left in its folder. */
|
|
16
18
|
export type RemoveProjectHandler = (projectId: string, files: boolean) => RemoveProjectResult | Promise<RemoveProjectResult>;
|
|
17
19
|
/** Resolve an agent to its live event stream: the relay feeds `onEvents` from its own in-memory stream
|
|
@@ -63,6 +65,7 @@ export interface RemoteAgents {
|
|
|
63
65
|
export interface DashboardContext {
|
|
64
66
|
startAgent: StartAgentHandler;
|
|
65
67
|
addProject: AddProjectHandler;
|
|
68
|
+
startedIn: StartedInHandler;
|
|
66
69
|
removeProject: RemoveProjectHandler;
|
|
67
70
|
/** The in-memory event stream for an agent relayed from a saved machine (#1067), else undefined. */
|
|
68
71
|
eventsSource: EventsSource;
|