compounding-loop 0.2.0 → 0.5.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/README.md +19 -3
- package/dist/cli/claim.js +84 -0
- package/dist/cli/claim.js.map +1 -0
- package/dist/cli/draft.js +69 -0
- package/dist/cli/draft.js.map +1 -0
- package/dist/cli/index.js +284 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/laneRound.js +96 -0
- package/dist/cli/laneRound.js.map +1 -0
- package/dist/cli/laneStatus.js +3 -1
- package/dist/cli/laneStatus.js.map +1 -1
- package/dist/cli/lanesInit.js +8 -2
- package/dist/cli/lanesInit.js.map +1 -1
- package/dist/cli/lock.js +22 -2
- package/dist/cli/lock.js.map +1 -1
- package/dist/cli/loops.js +7 -0
- package/dist/cli/loops.js.map +1 -1
- package/dist/cli/next.js +18 -0
- package/dist/cli/next.js.map +1 -0
- package/dist/cli/pace.js +41 -0
- package/dist/cli/pace.js.map +1 -0
- package/dist/cli/pause.js +81 -0
- package/dist/cli/pause.js.map +1 -0
- package/dist/cli/run.js +18 -6
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/runs.js +118 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/schedule.js +177 -0
- package/dist/cli/schedule.js.map +1 -0
- package/dist/cli/shipCheck.js +59 -0
- package/dist/cli/shipCheck.js.map +1 -0
- package/dist/core/brief.js +35 -12
- package/dist/core/brief.js.map +1 -1
- package/dist/core/draftBrief.js +68 -0
- package/dist/core/draftBrief.js.map +1 -0
- package/dist/core/laneRound.js +63 -0
- package/dist/core/laneRound.js.map +1 -0
- package/dist/core/lanes.js +15 -2
- package/dist/core/lanes.js.map +1 -1
- package/dist/core/lanesInit.js +19 -0
- package/dist/core/lanesInit.js.map +1 -1
- package/dist/core/next.js +34 -0
- package/dist/core/next.js.map +1 -0
- package/dist/core/parse/changelog.js +41 -0
- package/dist/core/parse/changelog.js.map +1 -0
- package/dist/core/parse/claim.js +24 -0
- package/dist/core/parse/claim.js.map +1 -0
- package/dist/core/parse/controlRoom.js +38 -0
- package/dist/core/parse/controlRoom.js.map +1 -0
- package/dist/core/parse/index.js +17 -0
- package/dist/core/parse/index.js.map +1 -0
- package/dist/core/parse/markers.js +20 -0
- package/dist/core/parse/markers.js.map +1 -0
- package/dist/core/parse/outcomes.js +51 -0
- package/dist/core/parse/outcomes.js.map +1 -0
- package/dist/core/parse/paused.js +26 -0
- package/dist/core/parse/paused.js.map +1 -0
- package/dist/core/parse/policy.js +56 -0
- package/dist/core/parse/policy.js.map +1 -0
- package/dist/core/parse/runs.js +132 -0
- package/dist/core/parse/runs.js.map +1 -0
- package/dist/core/parse/schedule.js +101 -0
- package/dist/core/parse/schedule.js.map +1 -0
- package/dist/core/parse/steer.js +68 -0
- package/dist/core/parse/steer.js.map +1 -0
- package/dist/core/parse/task.js +96 -0
- package/dist/core/parse/task.js.map +1 -0
- package/dist/core/repo.js +18 -8
- package/dist/core/repo.js.map +1 -1
- package/dist/core/runPrompt.js +8 -2
- package/dist/core/runPrompt.js.map +1 -1
- package/dist/core/shipCheck.js +45 -0
- package/dist/core/shipCheck.js.map +1 -0
- package/dist/core/table.js +3 -1
- package/dist/core/table.js.map +1 -1
- package/dist/server/actionBody.js +54 -0
- package/dist/server/actionBody.js.map +1 -0
- package/dist/server/checkLabels.js +32 -0
- package/dist/server/checkLabels.js.map +1 -0
- package/dist/server/claude.js +18 -0
- package/dist/server/claude.js.map +1 -0
- package/dist/server/controls.js +99 -0
- package/dist/server/controls.js.map +1 -0
- package/dist/server/data.js +9 -3
- package/dist/server/data.js.map +1 -1
- package/dist/server/draftInputs.js +33 -0
- package/dist/server/draftInputs.js.map +1 -0
- package/dist/server/health.js +9 -30
- package/dist/server/health.js.map +1 -1
- package/dist/server/index.js +77 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/laneChecks.js +25 -0
- package/dist/server/laneChecks.js.map +1 -0
- package/dist/server/laneSchedule.js +15 -0
- package/dist/server/laneSchedule.js.map +1 -0
- package/dist/server/live/build.js +178 -0
- package/dist/server/live/build.js.map +1 -0
- package/dist/server/live/github.js +54 -0
- package/dist/server/live/github.js.map +1 -0
- package/dist/server/live/index.js +11 -0
- package/dist/server/live/index.js.map +1 -0
- package/dist/server/live/merge.js +16 -0
- package/dist/server/live/merge.js.map +1 -0
- package/dist/server/live/urls.js +61 -0
- package/dist/server/live/urls.js.map +1 -0
- package/dist/server/loops.js +263 -41
- package/dist/server/loops.js.map +1 -1
- package/dist/server/paceNote.js +13 -0
- package/dist/server/paceNote.js.map +1 -0
- package/dist/server/roundState.js +51 -0
- package/dist/server/roundState.js.map +1 -0
- package/dist/server/runs.js +144 -0
- package/dist/server/runs.js.map +1 -0
- package/dist/server/shipped.js +35 -0
- package/dist/server/shipped.js.map +1 -0
- package/dist/server/static-export.js +22 -1
- package/dist/server/static-export.js.map +1 -1
- package/dist/server/taskBullets.js +33 -0
- package/dist/server/taskBullets.js.map +1 -0
- package/dist/server/this-repo.json +2818 -106
- package/dist/web/assets/index-BozIcdeb.js +88 -0
- package/dist/web/assets/index-Te_olhNA.css +2 -0
- package/dist/web/index.html +2 -2
- package/method/COMPOUNDING_LOOP.md +26 -0
- package/method/retro.md +7 -0
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/commands/loop-lanes.md +11 -0
- package/plugin/commands/loop-next.md +11 -0
- package/plugin/commands/loop-pause.md +10 -0
- package/runners/github-actions/lanes.yml +55 -2
- package/runners/local/README.md +3 -1
- package/runners/local/compounding-loop.service +20 -0
- package/runners/local/compounding-loop.timer +11 -0
- package/runners/routine/README.md +5 -1
- package/runners/routine/control-room-prompt.md +4 -14
- package/runners/routine/lane-prompt.md +4 -10
- package/runners/routine/prompt.md +2 -2
- package/templates/lanes/README.md +5 -1
- package/templates/lanes/claude-section.md +5 -1
- package/templates/lanes/control-run.md +37 -0
- package/templates/lanes/lane-run.md +33 -0
- package/templates/lanes/schedule.json +4 -0
- package/templates/lanes/steer.md +3 -0
- package/templates/lanes/task.md +1 -1
- package/templates/static-site/.ai/loop-prompt.md +1 -1
- package/templates/static-site/CLAUDE.md +2 -0
- package/dist/web/assets/index-B16QCSnY.css +0 -2
- package/dist/web/assets/index-CS82DKbF.js +0 -49
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Pure (no Node imports): which GitHub URLs the browser must fetch to build a live loop.
|
|
2
|
+
export const GITHUB_API = 'https://api.github.com';
|
|
3
|
+
export const GITHUB_RAW = 'https://raw.githubusercontent.com';
|
|
4
|
+
/** `.ai/done-vN.md` files probed to count finished rounds (a missing file is a 404, which is fine). */
|
|
5
|
+
export const MAX_ROUND_FILES = 9;
|
|
6
|
+
const SLUG = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
7
|
+
export function isRepoSlug(slug) {
|
|
8
|
+
return SLUG.test(slug) && !slug.split('/').some((part) => part === '.' || part === '..');
|
|
9
|
+
}
|
|
10
|
+
/** Repo-relative paths of the files every loop has, laned or not. */
|
|
11
|
+
export const BASE_FILES = [
|
|
12
|
+
'.ai/task.md',
|
|
13
|
+
'.ai/lanes.json',
|
|
14
|
+
'package.json',
|
|
15
|
+
'.ai/PAUSED',
|
|
16
|
+
'.ai/schedule.json',
|
|
17
|
+
'.ai/policy.json',
|
|
18
|
+
'.ai/control-room.md',
|
|
19
|
+
'CHANGELOG.md',
|
|
20
|
+
'DONE.md',
|
|
21
|
+
'BLOCKED.md',
|
|
22
|
+
...Array.from({ length: MAX_ROUND_FILES }, (_, i) => `.ai/done-v${i + 1}.md`),
|
|
23
|
+
];
|
|
24
|
+
/** Per-lane files, once `.ai/lanes.json` is known. */
|
|
25
|
+
export function laneFilePaths(lanes) {
|
|
26
|
+
return lanes.flatMap((lane) => ['task.md', 'outbox.md', 'DONE.md', 'BLOCKED.md', 'claim', 'runs.jsonl', 'steer.md'].map((f) => `.ai/lanes/${lane}/${f}`));
|
|
27
|
+
}
|
|
28
|
+
export function rawUrl(slug, file, branch = 'main') {
|
|
29
|
+
return `${GITHUB_RAW}/${slug}/${branch}/${file}`;
|
|
30
|
+
}
|
|
31
|
+
/** Everything the browser fetches for `slug`; throws on anything that is not `owner/name`. */
|
|
32
|
+
export function liveUrls(slug, branch = 'main') {
|
|
33
|
+
if (!isRepoSlug(slug))
|
|
34
|
+
throw new Error(`not a GitHub repo slug: ${slug}`);
|
|
35
|
+
return {
|
|
36
|
+
commits: `${GITHUB_API}/repos/${slug}/commits?sha=${encodeURIComponent(branch)}&per_page=100`,
|
|
37
|
+
runs: `${GITHUB_API}/repos/${slug}/actions/runs?branch=${encodeURIComponent(branch)}&per_page=20`,
|
|
38
|
+
files: Object.fromEntries(BASE_FILES.map((file) => [file, rawUrl(slug, file, branch)])),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** GitHub's page size for the commits endpoint; a full page means there may be another. */
|
|
42
|
+
export const COMMITS_PAGE_SIZE = 100;
|
|
43
|
+
/**
|
|
44
|
+
* Commits newer than the snapshot: `since` is the snapshot head's commit date (ISO 8601). GitHub treats it as
|
|
45
|
+
* inclusive, which is fine because `mergeCommits` drops the duplicate. Page 1 is the same call as `liveUrls().commits`
|
|
46
|
+
* plus `since`; keep requesting the next page while `hasMoreCommits` says the last one was full.
|
|
47
|
+
*/
|
|
48
|
+
export function commitsSinceUrl(slug, since, page = 1, branch = 'main') {
|
|
49
|
+
if (!isRepoSlug(slug))
|
|
50
|
+
throw new Error(`not a GitHub repo slug: ${slug}`);
|
|
51
|
+
if (Number.isNaN(Date.parse(since)))
|
|
52
|
+
throw new Error(`not a date: ${since}`);
|
|
53
|
+
const query = `sha=${encodeURIComponent(branch)}&since=${encodeURIComponent(new Date(since).toISOString())}&per_page=${COMMITS_PAGE_SIZE}&page=${page}`;
|
|
54
|
+
return `${GITHUB_API}/repos/${slug}/commits?${query}`;
|
|
55
|
+
}
|
|
56
|
+
export const hasMoreCommits = (pageLength) => pageLength >= COMMITS_PAGE_SIZE;
|
|
57
|
+
/** Number of `.ai/done-vN.md` files present, counted from the fetched files. */
|
|
58
|
+
export function countRoundFiles(files) {
|
|
59
|
+
return Array.from({ length: MAX_ROUND_FILES }, (_, i) => files[`.ai/done-v${i + 1}.md`]).filter((t) => t !== undefined).length;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../src/server/live/urls.ts"],"names":[],"mappings":"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"}
|
package/dist/server/loops.js
CHANGED
|
@@ -1,79 +1,178 @@
|
|
|
1
1
|
import { execFile } from 'node:child_process';
|
|
2
|
-
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { promisify } from 'node:util';
|
|
5
5
|
import { runAnswer } from '../cli/loops.js';
|
|
6
|
-
import {
|
|
6
|
+
import { runDoctor } from '../cli/doctor.js';
|
|
7
|
+
import { gatherDraftPrompt } from '../cli/draft.js';
|
|
8
|
+
import { runLaneRound } from '../cli/laneRound.js';
|
|
9
|
+
import { runPause, runResume } from '../cli/pause.js';
|
|
10
|
+
import { readPolicy, runPaceSet } from '../cli/pace.js';
|
|
11
|
+
import { runScheduleAction, runSteer } from '../cli/schedule.js';
|
|
12
|
+
import { paceFor, POLICY_FILE } from '../core/parse/policy.js';
|
|
13
|
+
import { policyNote } from './paceNote.js';
|
|
14
|
+
import { readLaneStatuses as readRawLaneStatuses } from '../cli/laneStatus.js';
|
|
15
|
+
import { settleNotDue } from './laneSchedule.js';
|
|
16
|
+
import { lintBrief } from '../core/brief.js';
|
|
17
|
+
import { draftClaudeArgs } from '../core/draftBrief.js';
|
|
18
|
+
import { parseLanesConfig } from '../core/lanes.js';
|
|
7
19
|
import { parseBlocked } from '../core/blocked.js';
|
|
8
20
|
import { readLoopFacts, readRunCounter } from '../core/repo.js';
|
|
9
21
|
import { deriveStatus } from '../core/status.js';
|
|
10
|
-
import {
|
|
22
|
+
import { abortableClaude } from './claude.js';
|
|
23
|
+
import { gatherDraftInputs } from './draftInputs.js';
|
|
24
|
+
import { annotateReleases, isShipped } from './shipped.js';
|
|
25
|
+
import { homepageOf, packageVersion, releaseInboxItem, roundState } from './roundState.js';
|
|
26
|
+
import { commitLane, latestControlNotes, parseChangelog, parsePaused, parseSchedule } from '../core/parse/index.js';
|
|
27
|
+
import { shipCheck } from '../core/shipCheck.js';
|
|
28
|
+
import { buildRuns, lastRunOf, sessionKey, silentLanesItem } from './runs.js';
|
|
29
|
+
import { checkLoop, parseTestRecord } from './health.js';
|
|
30
|
+
import { bulletsUnder, contractFromTask, laneNotesFromTask } from './taskBullets.js';
|
|
31
|
+
export { bulletsUnder, contractFromTask };
|
|
11
32
|
import { sortByAttention, toSummary } from './data.js';
|
|
12
33
|
const execFileAsync = promisify(execFile);
|
|
13
34
|
async function readOptional(file) {
|
|
14
35
|
return readFile(file, 'utf8').catch(() => undefined);
|
|
15
36
|
}
|
|
16
|
-
/** Recent commits of a clone, newest first. Empty when the folder is not a repo. */
|
|
17
|
-
export async function readTimeline(dir, limit = 50) {
|
|
37
|
+
/** Recent commits of a clone, newest first. Empty when the folder is not a repo. `laneNames` lets the subject prefix name a lane. */
|
|
38
|
+
export async function readTimeline(dir, limit = 50, laneNames = []) {
|
|
18
39
|
try {
|
|
19
|
-
const { stdout } = await execFileAsync('git', ['log', `-${limit}`, '--format=%h%
|
|
40
|
+
const { stdout } = await execFileAsync('git', ['log', `-${limit}`, '--format=%h%x1f%cI%x1f%an%x1f%s%x1f%b%x1e'], {
|
|
20
41
|
cwd: dir,
|
|
21
42
|
env: { ...process.env, GIT_CEILING_DIRECTORIES: path.dirname(path.resolve(dir)) },
|
|
22
43
|
});
|
|
23
44
|
return stdout
|
|
24
|
-
.split('\
|
|
45
|
+
.split('\x1e')
|
|
46
|
+
.map((record) => record.trim())
|
|
25
47
|
.filter(Boolean)
|
|
26
|
-
.map((
|
|
27
|
-
const [sha = '', at = '',
|
|
28
|
-
|
|
48
|
+
.map((record) => {
|
|
49
|
+
const [sha = '', at = '', name = '', subject = '', body = ''] = record.split('\x1f');
|
|
50
|
+
const author = name.trim();
|
|
51
|
+
const session = /^Claude-Session:\s*(\S+)\s*$/m.exec(body)?.[1];
|
|
52
|
+
return {
|
|
53
|
+
sha,
|
|
54
|
+
at: new Date(at).toISOString(),
|
|
55
|
+
message: subject,
|
|
56
|
+
// A name that is an email address is not a display name.
|
|
57
|
+
...(author && !author.includes('@') && { author }),
|
|
58
|
+
lane: commitLane(`${subject}\n\n${body}`, laneNames),
|
|
59
|
+
...(session && { session: sessionKey(session) }),
|
|
60
|
+
};
|
|
29
61
|
});
|
|
30
62
|
}
|
|
31
63
|
catch {
|
|
32
64
|
return [];
|
|
33
65
|
}
|
|
34
66
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
67
|
+
function pausedInfo(text) {
|
|
68
|
+
const { by, at, reason } = parsePaused(text);
|
|
69
|
+
return { by, ...(at && { at: at.toISOString() }), ...(reason && { reason }) };
|
|
70
|
+
}
|
|
71
|
+
async function paceState(dir) {
|
|
72
|
+
const policy = await readPolicy(dir);
|
|
73
|
+
const note = policyNote(await readOptional(path.join(dir, POLICY_FILE)));
|
|
74
|
+
return { pace: policy.pace, overrides: Object.fromEntries(Object.keys(policy.lanes).map((lane) => [lane, paceFor(policy, lane)])), ...(note && { note }) };
|
|
75
|
+
}
|
|
76
|
+
async function readRuns(dir, lanes, lanesJson, timeline, now, hasDone = false) {
|
|
77
|
+
const cron = new Map((parseLanesConfig(lanesJson ?? '').config?.lanes ?? []).map((l) => [l.name, l.cron]));
|
|
78
|
+
const pausedText = await readOptional(path.join(dir, '.ai', 'PAUSED'));
|
|
79
|
+
const scheduleText = await readOptional(path.join(dir, '.ai', 'schedule.json'));
|
|
80
|
+
const schedule = scheduleText === undefined ? undefined : parseSchedule(scheduleText);
|
|
81
|
+
const pausedAt = pausedText === undefined ? undefined : parsePaused(pausedText).at;
|
|
82
|
+
const laneNames = lanes.map((l) => l.name);
|
|
83
|
+
const logs = Object.fromEntries(await Promise.all(laneNames.map(async (n) => [n, await readOptional(path.join(dir, '.ai', 'lanes', n, 'runs.jsonl'))])));
|
|
84
|
+
const steerTexts = Object.fromEntries(await Promise.all(laneNames.map(async (n) => [n, await readOptional(path.join(dir, '.ai', 'lanes', n, 'steer.md'))])));
|
|
85
|
+
const data = buildRuns({ steerTexts, lanes: laneNames.map((name) => ({ name, ...(cron.get(name) && { cron: cron.get(name) }), stopped: hasDone || ['done', 'blocked'].includes(lanes.find((l) => l.name === name)?.state ?? '') || lanes.find((l) => l.name === name)?.claim !== undefined })), logs, commits: timeline, now, ...(schedule && { schedule }), ...(pausedText !== undefined && { paused: pausedAt ? { at: pausedAt } : {} }) });
|
|
86
|
+
return { ...data, ...(schedule && { schedule }) };
|
|
87
|
+
}
|
|
88
|
+
/** Local git facts for the ship-check; a failing git call reads as the safe answer (tag free, tree dirty). */
|
|
89
|
+
async function readShipGit(dir, tag) {
|
|
90
|
+
const git = (args) => execFileAsync('git', args, { cwd: dir, timeout: 15_000 }).then((r) => r.stdout, () => undefined);
|
|
91
|
+
const [tagList, status] = await Promise.all([git(['tag', '--list', 'v*']), git(['status', '--porcelain'])]);
|
|
92
|
+
const tags = (tagList ?? '').split('\n').map((t) => t.trim()).filter((t) => t !== '');
|
|
93
|
+
const tagExists = tags.includes(tag);
|
|
94
|
+
const [tagOut, doneOut] = tagExists ? await Promise.all([git(['log', '-1', '--format=%cI', tag]), git(['log', '-1', '--format=%cI', '--', 'DONE.md'])]) : [undefined, undefined];
|
|
95
|
+
const date = (out) => (out && !Number.isNaN(Date.parse(out.trim())) ? new Date(out.trim()) : undefined);
|
|
96
|
+
const [tagAt, doneAt] = [date(tagOut), date(doneOut)];
|
|
97
|
+
return { tagExists, treeClean: status !== undefined && status.trim() === '', ...(tagList !== undefined && { tags }), ...(tagAt && { tagAt }), ...(doneAt && { doneAt }) };
|
|
52
98
|
}
|
|
53
|
-
/**
|
|
54
|
-
|
|
55
|
-
|
|
99
|
+
/** `.ai/last-test.json` as a card result, dated by the file's mtime; undefined when absent or malformed. */
|
|
100
|
+
async function readTestFile(dir) {
|
|
101
|
+
const file = path.join(dir, '.ai', 'last-test.json');
|
|
102
|
+
const [text, info] = await Promise.all([readOptional(file), stat(file).catch(() => undefined)]);
|
|
103
|
+
const record = text === undefined ? undefined : parseTestRecord(text);
|
|
104
|
+
return record && info ? { ...record, at: info.mtime.toISOString() } : undefined;
|
|
105
|
+
}
|
|
106
|
+
/** Lane statuses where a lane the schedule or PAUSED keeps from running is waiting, never stalled. */
|
|
107
|
+
async function readLaneStatuses(dir, now) {
|
|
108
|
+
const lanes = await readRawLaneStatuses(dir, now);
|
|
109
|
+
if (!lanes)
|
|
110
|
+
return undefined;
|
|
111
|
+
const [scheduleText, pausedText] = await Promise.all([readOptional(path.join(dir, '.ai', 'schedule.json')), readOptional(path.join(dir, '.ai', 'PAUSED'))]);
|
|
112
|
+
return settleNotDue(lanes, scheduleText === undefined ? undefined : parseSchedule(scheduleText), pausedText !== undefined, now);
|
|
56
113
|
}
|
|
57
114
|
/** Reads one clone into the API's LoopDetail. `now` is a parameter so tests are deterministic. */
|
|
58
115
|
export async function readLoop(dir, now = new Date()) {
|
|
59
|
-
const
|
|
116
|
+
const lanes = await readLaneStatuses(dir, now);
|
|
117
|
+
const laneNames = lanes?.map((l) => l.name) ?? [];
|
|
118
|
+
const [baseFacts, counter, timeline, taskText, packageText, lanesJson] = await Promise.all([
|
|
60
119
|
readLoopFacts(dir),
|
|
61
120
|
readRunCounter(dir),
|
|
62
|
-
readTimeline(dir),
|
|
121
|
+
readTimeline(dir, 300, laneNames),
|
|
63
122
|
readOptional(path.join(dir, '.ai', 'task.md')),
|
|
64
|
-
|
|
123
|
+
readOptional(path.join(dir, 'package.json')),
|
|
124
|
+
readOptional(path.join(dir, '.ai', 'lanes.json')),
|
|
65
125
|
]);
|
|
126
|
+
const [changelogText, controlText, pausedText] = await Promise.all(['CHANGELOG.md', path.join('.ai', 'control-room.md'), path.join('.ai', 'PAUSED')].map((f) => readOptional(path.join(dir, f))));
|
|
127
|
+
const notes = controlText === undefined || !lanes ? [] : Object.entries(latestControlNotes(controlText, laneNames)).map(([lane, n]) => ({ lane, at: n.at, text: n.text }));
|
|
128
|
+
const runsData = lanes && (await readRuns(dir, lanes, lanesJson, timeline, now, baseFacts.hasDone));
|
|
66
129
|
// Any failing health check turns the loop "failing" with that check's reason (IDEA.md status rule 5).
|
|
67
130
|
const checks = await checkLoop(dir, baseFacts, now, undefined, lanes);
|
|
68
131
|
const facts = { ...baseFacts, healthFailures: checks.filter((c) => !c.ok).map((c) => c.reason) };
|
|
69
132
|
const status = deriveStatus(facts, now);
|
|
70
133
|
const round = facts.roundsDone + 1;
|
|
71
134
|
const task = taskText ?? '';
|
|
135
|
+
const version = packageVersion(packageText);
|
|
136
|
+
const shipGit = version ? await readShipGit(dir, `v${version}`) : undefined;
|
|
137
|
+
// npm is not asked locally (no network in a dashboard that works offline): the tag alone decides.
|
|
138
|
+
const shippedNow = facts.hasDone && version !== undefined && shipGit !== undefined && isShipped({ version, tagExists: shipGit.tagExists, tagAt: shipGit.tagAt, doneAt: shipGit.doneAt });
|
|
139
|
+
const { roundLabel, releaseWaiting } = roundState({ round, hasDone: facts.hasDone, laned: lanes !== undefined, shipped: shippedNow, ...(version && { version }) });
|
|
140
|
+
const releaseDate = version ? parseChangelog(changelogText ?? '').find((r) => r.version === version)?.date : undefined;
|
|
141
|
+
const doneText = lanes && version ? await readOptional(path.join(dir, 'DONE.md')) : undefined;
|
|
142
|
+
const newestTests = runsData?.runs.find((r) => r.tests && r.endedAt);
|
|
143
|
+
const ship = doneText !== undefined && version && shipGit && !shippedNow
|
|
144
|
+
? shipCheck({
|
|
145
|
+
version,
|
|
146
|
+
doneText,
|
|
147
|
+
...(changelogText !== undefined && { changelogText }),
|
|
148
|
+
tagExists: shipGit.tagExists,
|
|
149
|
+
treeClean: shipGit.treeClean,
|
|
150
|
+
...(newestTests?.tests && { tests: { ...newestTests.tests, ...(newestTests.endedAt && { at: newestTests.endedAt }) } }),
|
|
151
|
+
})
|
|
152
|
+
: undefined;
|
|
153
|
+
// The same card fields the live and demo loops carry (Round 5 A7): CI from the tests check, newest test result, site.
|
|
154
|
+
const ciCheck = checks.find((c) => c.kind === 'failing-tests');
|
|
155
|
+
const site = homepageOf(packageText);
|
|
156
|
+
const cardTests = newestTests?.tests && newestTests.endedAt ? { ...newestTests.tests, at: newestTests.endedAt } : await readTestFile(dir);
|
|
72
157
|
return {
|
|
73
158
|
id: path.basename(dir),
|
|
74
159
|
name: path.basename(dir),
|
|
160
|
+
...(site && { url: site, demoUrl: site }),
|
|
161
|
+
...(ciCheck && ciCheck.state !== 'unchecked' && { ci: { ok: ciCheck.ok, reason: ciCheck.reason } }),
|
|
162
|
+
...(cardTests && { tests: cardTests }),
|
|
75
163
|
state: status.state,
|
|
76
|
-
reason: status.reason,
|
|
164
|
+
reason: releaseWaiting && status.state === 'done' ? `${roundLabel} · release waiting on you` : status.reason,
|
|
165
|
+
roundLabel,
|
|
166
|
+
...(pausedText !== undefined && { paused: pausedInfo(pausedText) }),
|
|
167
|
+
...(notes.length > 0 && { controlNotes: notes }),
|
|
168
|
+
...(changelogText !== undefined && { releases: annotateReleases(parseChangelog(changelogText), shipGit?.tags, undefined) }),
|
|
169
|
+
...(runsData && lastRunOf(runsData.runs) && { lastRun: lastRunOf(runsData.runs) }),
|
|
170
|
+
...(runsData && { runs: runsData.runs, nextRuns: runsData.nextRuns, runOutcomes: runsData.outcomes, idleRuns: runsData.idleRuns, ...(runsData.schedule && { schedule: runsData.schedule }), ...(runsData.steer.length > 0 && { steer: runsData.steer }) }),
|
|
171
|
+
...(runsData && { pace: await paceState(dir) }),
|
|
172
|
+
draftInputs: await gatherDraftInputs(dir),
|
|
173
|
+
...(ship && { ship }),
|
|
174
|
+
...(releaseWaiting && { releaseWaiting }),
|
|
175
|
+
...(shippedNow && version && { shipped: { version, ...(releaseDate && { date: releaseDate }), npm: 'unknown' } }),
|
|
77
176
|
round,
|
|
78
177
|
// The total is unknown for a real loop (the owner can always add a round), so it never reads "5 of 3".
|
|
79
178
|
roundsTotal: round,
|
|
@@ -82,6 +181,7 @@ export async function readLoop(dir, now = new Date()) {
|
|
|
82
181
|
...(timeline[0] && { lastCommit: timeline[0] }),
|
|
83
182
|
...(lanes && { lanes }),
|
|
84
183
|
timeline,
|
|
184
|
+
...(lanes && { laneNotes: await Promise.all(lanes.map(async ({ name }) => laneNotesFromTask(name, (await readOptional(path.join(dir, '.ai', 'lanes', name, 'task.md'))) ?? '', facts.hasDone || (await readOptional(path.join(dir, '.ai', 'lanes', name, 'DONE.md'))) !== undefined))) }),
|
|
85
185
|
contract: contractFromTask(task, facts.hasDone),
|
|
86
186
|
knowledge: bulletsUnder(task, /^confirmed/i),
|
|
87
187
|
decisions: bulletsUnder(task, /^decisions/i),
|
|
@@ -101,6 +201,26 @@ export async function findLoopDirs(projectsDir) {
|
|
|
101
201
|
}
|
|
102
202
|
return dirs.sort();
|
|
103
203
|
}
|
|
204
|
+
async function readReleaseItem(dir) {
|
|
205
|
+
const file = path.join(dir, 'DONE.md');
|
|
206
|
+
const [info, laned] = await Promise.all([stat(file).catch(() => undefined), stat(path.join(dir, '.ai', 'lanes.json')).catch(() => undefined)]);
|
|
207
|
+
if (!info || !laned)
|
|
208
|
+
return undefined;
|
|
209
|
+
const version = packageVersion(await readOptional(path.join(dir, 'package.json')));
|
|
210
|
+
const git = version ? await readShipGit(dir, `v${version}`) : undefined;
|
|
211
|
+
if (version && git && isShipped({ version, tagExists: git.tagExists, tagAt: git.tagAt, doneAt: git.doneAt }))
|
|
212
|
+
return undefined;
|
|
213
|
+
return releaseInboxItem(path.basename(dir), version, info.mtime.toISOString());
|
|
214
|
+
}
|
|
215
|
+
async function readSilentItem(dir, now) {
|
|
216
|
+
const lanes = await readLaneStatuses(dir, now);
|
|
217
|
+
if (!lanes)
|
|
218
|
+
return undefined;
|
|
219
|
+
const names = lanes.map((l) => l.name);
|
|
220
|
+
const hasDone = (await readOptional(path.join(dir, 'DONE.md'))) !== undefined;
|
|
221
|
+
const runs = await readRuns(dir, lanes, await readOptional(path.join(dir, '.ai', 'lanes.json')), await readTimeline(dir, 300, names), now, hasDone);
|
|
222
|
+
return silentLanesItem(path.basename(dir), runs.silentLanes, now.toISOString(), runs.routinesLookOff);
|
|
223
|
+
}
|
|
104
224
|
async function readInboxItem(dir) {
|
|
105
225
|
const file = path.join(dir, 'BLOCKED.md');
|
|
106
226
|
const [text, info] = await Promise.all([readOptional(file), stat(file).catch(() => undefined)]);
|
|
@@ -109,22 +229,52 @@ async function readInboxItem(dir) {
|
|
|
109
229
|
const note = parseBlocked(text);
|
|
110
230
|
return { loopId: path.basename(dir), file: 'BLOCKED.md', question: note.question, bestGuess: note.bestGuess, since: info.mtime.toISOString() };
|
|
111
231
|
}
|
|
232
|
+
/** Best effort: a clone without a remote (or offline) keeps the commit and the loop pulls it later. */
|
|
233
|
+
const pushQuietly = (dir) => execFileAsync('git', ['push'], { cwd: dir, timeout: 30_000, env: { ...process.env, GIT_TERMINAL_PROMPT: '0' } }).then(() => true, () => false);
|
|
234
|
+
/** Like `pushQuietly`, but says why a push failed (git's last line), so the UI can show the reason next to "not pushed". */
|
|
235
|
+
export async function pushWithReason(dir) {
|
|
236
|
+
try {
|
|
237
|
+
await execFileAsync('git', ['push'], { cwd: dir, timeout: 30_000, env: { ...process.env, GIT_TERMINAL_PROMPT: '0' } });
|
|
238
|
+
return { pushed: true };
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
const text = String(error.stderr ?? error.message ?? '');
|
|
242
|
+
const last = text.split('\n').map((l) => l.trim()).filter(Boolean).pop();
|
|
243
|
+
return { pushed: false, pushError: last ?? 'git push failed' };
|
|
244
|
+
}
|
|
245
|
+
}
|
|
112
246
|
/** A DataSource over a folder of loop clones, re-read on every call so the dashboard is never stale. */
|
|
113
|
-
export function projectsSource(projectsDir, now = () => new Date()) {
|
|
247
|
+
export function projectsSource(projectsDir, now = () => new Date(), claude = abortableClaude) {
|
|
114
248
|
const all = async () => Promise.all((await findLoopDirs(projectsDir)).map((dir) => readLoop(dir, now())));
|
|
249
|
+
// Match the id against folder names; never build a path from it.
|
|
250
|
+
// One git-changing action per clone at a time: a double click must not race on index.lock.
|
|
251
|
+
const busy = new Set();
|
|
252
|
+
const drafting = new Set();
|
|
253
|
+
const exclusive = async (dir, run) => {
|
|
254
|
+
if (busy.has(dir))
|
|
255
|
+
throw new Error('Another action on this loop is still running; try again in a moment.');
|
|
256
|
+
busy.add(dir);
|
|
257
|
+
try {
|
|
258
|
+
return await run();
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
busy.delete(dir);
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
const loopDir = async (id) => (await findLoopDirs(projectsDir)).find((d) => path.basename(d) === id);
|
|
115
265
|
return {
|
|
116
266
|
loops: async () => sortByAttention((await all()).map(toSummary)),
|
|
117
|
-
// Match the id against folder names; never build a path from it.
|
|
118
267
|
loop: async (id) => {
|
|
119
|
-
const dir =
|
|
268
|
+
const dir = await loopDir(id);
|
|
120
269
|
return dir === undefined ? undefined : readLoop(dir, now());
|
|
121
270
|
},
|
|
122
271
|
inbox: async () => {
|
|
123
|
-
const
|
|
272
|
+
const dirs = await findLoopDirs(projectsDir);
|
|
273
|
+
const items = [...(await Promise.all(dirs.map(readInboxItem))), ...(await Promise.all(dirs.map(readReleaseItem))), ...(await Promise.all(dirs.map((d) => readSilentItem(d, now()))))];
|
|
124
274
|
return items.filter((i) => i !== undefined).sort((a, b) => a.since.localeCompare(b.since));
|
|
125
275
|
},
|
|
126
276
|
answer: async (id, answer) => {
|
|
127
|
-
const dir =
|
|
277
|
+
const dir = await loopDir(id);
|
|
128
278
|
if (dir === undefined)
|
|
129
279
|
return undefined;
|
|
130
280
|
// runAnswer reads the exact word "accept" as "use the best guess"; the web form sends literal text only.
|
|
@@ -132,9 +282,81 @@ export function projectsSource(projectsDir, now = () => new Date()) {
|
|
|
132
282
|
await runAnswer(dir, text === 'accept' ? 'Accept.' : text, { dryRun: false, now: now() });
|
|
133
283
|
const commit = (await execFileAsync('git', ['rev-parse', '--short', 'HEAD'], { cwd: dir })).stdout.trim();
|
|
134
284
|
// Best effort: a clone without a remote (or offline) keeps the commit and the loop pulls it later.
|
|
135
|
-
|
|
136
|
-
|
|
285
|
+
return { commit, pushed: await pushQuietly(dir) };
|
|
286
|
+
},
|
|
287
|
+
control: {
|
|
288
|
+
pause: async (id, reason) => {
|
|
289
|
+
const dir = await loopDir(id);
|
|
290
|
+
if (dir === undefined)
|
|
291
|
+
return undefined;
|
|
292
|
+
const { changed, by, pushed, pushError } = await exclusive(dir, () => runPause(dir, reason === undefined ? {} : { reason }));
|
|
293
|
+
return { changed, ...(by !== undefined && { by }), ...(pushed !== undefined && { pushed }), ...(pushError !== undefined && { pushError }) };
|
|
294
|
+
},
|
|
295
|
+
resume: async (id) => {
|
|
296
|
+
const dir = await loopDir(id);
|
|
297
|
+
if (dir === undefined)
|
|
298
|
+
return undefined;
|
|
299
|
+
const { changed, pushed, pushError } = await exclusive(dir, () => runResume(dir));
|
|
300
|
+
return { changed, ...(pushed !== undefined && { pushed }), ...(pushError !== undefined && { pushError }) };
|
|
301
|
+
},
|
|
302
|
+
nextRound: async (id, brief) => {
|
|
303
|
+
const dir = await loopDir(id);
|
|
304
|
+
if (dir === undefined)
|
|
305
|
+
return undefined;
|
|
306
|
+
// The brief lands where the web buttons put it; runLaneRound archives and deletes it.
|
|
307
|
+
const briefFile = path.join(dir, '.ai', 'next-round.md');
|
|
308
|
+
await writeFile(briefFile, brief.endsWith('\n') ? brief : `${brief}\n`);
|
|
309
|
+
// A failed round must not leave the brief behind for a lane's `git add -A`.
|
|
310
|
+
const { committed } = await exclusive(dir, () => runLaneRound(dir, { briefFile, dryRun: false, commit: true, now: now() })).finally(() => rm(briefFile, { force: true }));
|
|
311
|
+
const push = committed ? await pushWithReason(dir) : undefined;
|
|
312
|
+
return { changed: true, committed, ...(push && { pushed: push.pushed, ...(push.pushError !== undefined && { pushError: push.pushError }) }) };
|
|
313
|
+
},
|
|
314
|
+
steer: async (id, lane, text, options = {}) => {
|
|
315
|
+
const dir = await loopDir(id);
|
|
316
|
+
if (dir === undefined)
|
|
317
|
+
return undefined;
|
|
318
|
+
const { changed, pushed, pushError } = await exclusive(dir, () => runSteer(dir, lane, text, { ...options, now: now() }));
|
|
319
|
+
return { changed: changed.length > 0, lanes: changed, ...(pushed !== undefined && { pushed }), ...(pushError !== undefined && { pushError }) };
|
|
320
|
+
},
|
|
321
|
+
draftBrief: async (id, options, onProgress, signal) => {
|
|
322
|
+
const dir = await loopDir(id);
|
|
323
|
+
if (dir === undefined)
|
|
324
|
+
return undefined;
|
|
325
|
+
// Read-only, so it does not take `exclusive`; one draft per clone at a time still, because each costs a Claude run.
|
|
326
|
+
if (drafting.has(dir))
|
|
327
|
+
throw new Error('A draft for this loop is already being written.');
|
|
328
|
+
drafting.add(dir);
|
|
329
|
+
try {
|
|
330
|
+
onProgress('Reading DONE files, audit findings and steering');
|
|
331
|
+
const prompt = await gatherDraftPrompt(dir);
|
|
332
|
+
onProgress('Asking Claude Code to draft the brief (this takes a few minutes)');
|
|
333
|
+
const draft = (await claude(draftClaudeArgs(prompt, options.model), dir, signal)).trim();
|
|
334
|
+
if (!draft)
|
|
335
|
+
throw new Error('Claude returned an empty draft. Try again.');
|
|
336
|
+
onProgress('Scoring the draft');
|
|
337
|
+
const { score, gaps } = lintBrief(draft);
|
|
338
|
+
return { draft, score, gaps };
|
|
339
|
+
}
|
|
340
|
+
finally {
|
|
341
|
+
drafting.delete(dir);
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
pace: async (id, preset, lane) => {
|
|
345
|
+
const dir = await loopDir(id);
|
|
346
|
+
if (dir === undefined)
|
|
347
|
+
return undefined;
|
|
348
|
+
const { changed, pushed, pushError } = await exclusive(dir, () => runPaceSet(dir, preset, { now: now(), ...(lane !== undefined && { lane }) }));
|
|
349
|
+
return { changed: changed.length > 0, lanes: changed, ...(pushed !== undefined && { pushed }), ...(pushError !== undefined && { pushError }) };
|
|
350
|
+
},
|
|
351
|
+
schedule: async (id, action) => {
|
|
352
|
+
const dir = await loopDir(id);
|
|
353
|
+
if (dir === undefined)
|
|
354
|
+
return undefined;
|
|
355
|
+
const { changed, pushed, pushError } = await exclusive(dir, () => runScheduleAction(dir, action, { now: now() }));
|
|
356
|
+
return { changed: changed.length > 0, lanes: changed, ...(pushed !== undefined && { pushed }), ...(pushError !== undefined && { pushError }) };
|
|
357
|
+
},
|
|
137
358
|
},
|
|
359
|
+
doctor: () => runDoctor(),
|
|
138
360
|
checks: async () => {
|
|
139
361
|
const dirs = await findLoopDirs(projectsDir);
|
|
140
362
|
const perLoop = await Promise.all(dirs.map(async (dir) => checkLoop(dir, await readLoopFacts(dir), now(), undefined, await readLaneStatuses(dir, now()))));
|
package/dist/server/loops.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loops.js","sourceRoot":"","sources":["../../src/server/loops.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"loops.js","sourceRoot":"","sources":["../../src/server/loops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The optional `reason` string in `.ai/policy.json` (the control room writes it when it changes the pace); core's parser drops unknown keys. */
|
|
2
|
+
export function policyNote(text) {
|
|
3
|
+
if (text === undefined)
|
|
4
|
+
return undefined;
|
|
5
|
+
try {
|
|
6
|
+
const reason = JSON.parse(text)?.reason;
|
|
7
|
+
return typeof reason === 'string' && reason.trim() ? reason.trim().slice(0, 300) : undefined;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=paceNote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paceNote.js","sourceRoot":"","sources":["../../src/server/paceNote.ts"],"names":[],"mappings":"AAAA,iJAAiJ;AACjJ,MAAM,UAAU,UAAU,CAAC,IAAwB;IACjD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiC,EAAE,MAAM,CAAC;QAClF,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** `version` of a package.json text; undefined when the text is not JSON or has no string version. */
|
|
2
|
+
export function packageVersion(packageJson) {
|
|
3
|
+
if (packageJson === undefined)
|
|
4
|
+
return undefined;
|
|
5
|
+
try {
|
|
6
|
+
const version = JSON.parse(packageJson).version;
|
|
7
|
+
return typeof version === 'string' && version !== '' ? version : undefined;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** `name` of a package.json text, for the npm lookup. */
|
|
14
|
+
export function packageName(packageJson) {
|
|
15
|
+
if (packageJson === undefined)
|
|
16
|
+
return undefined;
|
|
17
|
+
try {
|
|
18
|
+
const name = JSON.parse(packageJson).name;
|
|
19
|
+
return typeof name === 'string' && name !== '' ? name : undefined;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** `homepage` of a package.json text when it is an https URL that is not just the repo or npm page: the loop's public site. */
|
|
26
|
+
export function homepageOf(packageJson) {
|
|
27
|
+
if (packageJson === undefined)
|
|
28
|
+
return undefined;
|
|
29
|
+
try {
|
|
30
|
+
const homepage = JSON.parse(packageJson).homepage;
|
|
31
|
+
return typeof homepage === 'string' && /^https:\/\/[^\s]+$/.test(homepage) && !/^https:\/\/(?:www\.)?(?:github\.com|npmjs\.com)\//.test(homepage) ? homepage : undefined;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function roundState({ round, hasDone, laned, version, shipped = false }) {
|
|
38
|
+
return { roundLabel: hasDone ? `Round ${round} done${version ? ` · ${version}` : ''}` : `Round ${round}`, releaseWaiting: hasDone && laned && !shipped };
|
|
39
|
+
}
|
|
40
|
+
/** The attention-list entry for a waiting release; `kind: 'release'` tells the UI not to offer an answer form. */
|
|
41
|
+
export function releaseInboxItem(loopId, version, since) {
|
|
42
|
+
return {
|
|
43
|
+
loopId,
|
|
44
|
+
file: 'DONE.md',
|
|
45
|
+
kind: 'release',
|
|
46
|
+
question: version ? `Release ${version} is waiting on you` : 'A release is waiting on you',
|
|
47
|
+
bestGuess: 'Check "Ready to ship", then run the Release workflow',
|
|
48
|
+
since,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=roundState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roundState.js","sourceRoot":"","sources":["../../src/server/roundState.ts"],"names":[],"mappings":"AAuBA,sGAAsG;AACtG,MAAM,UAAU,cAAc,CAAC,WAA+B;IAC5D,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAA2B,CAAC,OAAO,CAAC;QAC3E,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,WAAW,CAAC,WAA+B;IACzD,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,IAAI,GAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAwB,CAAC,IAAI,CAAC;QAClE,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,+HAA+H;AAC/H,MAAM,UAAU,UAAU,CAAC,WAA+B;IACxD,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAA4B,CAAC,QAAQ,CAAC;QAC9E,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mDAAmD,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3K,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,EAAc;IACxF,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,EAAE,cAAc,EAAE,OAAO,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;AAC3J,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAA2B,EAAE,KAAa;IACzF,OAAO;QACL,MAAM;QACN,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,OAAO,oBAAoB,CAAC,CAAC,CAAC,6BAA6B;QAC1F,SAAS,EAAE,sDAAsD;QACjE,KAAK;KACN,CAAC;AACJ,CAAC"}
|