@ai-dossier/worktree-pool 0.1.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/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const pool_actions_1 = require("./pool-actions");
5
+ function usage() {
6
+ console.error(`Usage: worktree-pool <command> [options]
7
+
8
+ Commands:
9
+ status Show pool inventory
10
+ replenish [--count N] Pre-warm spares up to target
11
+ claim --issue N --branch B Claim a warm worktree, print path
12
+ return --path P Return worktree to pool
13
+ refresh Fetch + rebuild all warm worktrees
14
+ gc Remove stale/orphaned worktrees
15
+ init Configure pool directory for this project`);
16
+ }
17
+ function parseArgs(args) {
18
+ const command = args[0];
19
+ const flags = {};
20
+ for (let i = 1; i < args.length; i++) {
21
+ const arg = args[i];
22
+ if (arg.startsWith('--')) {
23
+ const key = arg.slice(2);
24
+ const next = args[i + 1];
25
+ if (next && !next.startsWith('--')) {
26
+ flags[key] = next;
27
+ i++;
28
+ }
29
+ else {
30
+ flags[key] = true;
31
+ }
32
+ }
33
+ }
34
+ return { command, flags };
35
+ }
36
+ async function main() {
37
+ const args = process.argv.slice(2);
38
+ if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
39
+ usage();
40
+ process.exit(args.length === 0 ? 1 : 0);
41
+ }
42
+ const { command, flags } = parseArgs(args);
43
+ try {
44
+ switch (command) {
45
+ case 'status': {
46
+ const s = (0, pool_actions_1.status)();
47
+ console.log(`Pool directory: ${s.pool_dir}`);
48
+ console.log(`Warm: ${s.warm} Assigned: ${s.assigned} Creating: ${s.creating} Other: ${s.other} Total: ${s.total}`);
49
+ console.log(`Spares needed: ${s.spares_needed} Target: ${s.config.target_spares} Max: ${s.config.max_pool_size}`);
50
+ if (s.worktrees.length > 0) {
51
+ console.log('\nWorktrees:');
52
+ for (const wt of s.worktrees) {
53
+ const info = wt.assigned_to_issue
54
+ ? ` -> issue #${wt.assigned_to_issue} (${wt.assigned_branch})`
55
+ : '';
56
+ console.log(` ${wt.id} [${wt.status}] ${wt.path}${info}`);
57
+ }
58
+ }
59
+ break;
60
+ }
61
+ case 'replenish': {
62
+ const count = flags.count ? Number.parseInt(String(flags.count), 10) : undefined;
63
+ console.error(`Replenishing pool${count ? ` (count: ${count})` : ''}...`);
64
+ const result = await (0, pool_actions_1.replenish)(count);
65
+ console.error(`Created ${result.created} worktree(s)`);
66
+ if (result.errors.length > 0) {
67
+ for (const err of result.errors) {
68
+ console.error(` Error: ${err}`);
69
+ }
70
+ }
71
+ console.log(JSON.stringify(result));
72
+ break;
73
+ }
74
+ case 'claim': {
75
+ const issue = flags.issue ? Number.parseInt(String(flags.issue), 10) : null;
76
+ const branch = flags.branch ? String(flags.branch) : null;
77
+ if (!issue || !branch) {
78
+ console.error('Error: --issue N and --branch B are required');
79
+ process.exit(1);
80
+ }
81
+ const result = (0, pool_actions_1.claim)(issue, branch);
82
+ if (result) {
83
+ console.log(result.path);
84
+ }
85
+ else {
86
+ console.error("No warm worktrees available. Run 'worktree-pool replenish' first.");
87
+ process.exit(1);
88
+ }
89
+ break;
90
+ }
91
+ case 'return': {
92
+ const wtPath = flags.path ? String(flags.path) : null;
93
+ if (!wtPath) {
94
+ console.error('Error: --path P is required');
95
+ process.exit(1);
96
+ }
97
+ (0, pool_actions_1.returnWorktree)(wtPath);
98
+ console.error('Worktree returned to pool');
99
+ break;
100
+ }
101
+ case 'refresh': {
102
+ console.error('Refreshing warm worktrees...');
103
+ const result = (0, pool_actions_1.refresh)();
104
+ console.error(`Refreshed ${result.refreshed} worktree(s)`);
105
+ if (result.errors.length > 0) {
106
+ for (const err of result.errors) {
107
+ console.error(` Error: ${err}`);
108
+ }
109
+ }
110
+ break;
111
+ }
112
+ case 'gc': {
113
+ console.error('Running garbage collection...');
114
+ const result = (0, pool_actions_1.gc)();
115
+ console.error(`Removed ${result.removed} worktree(s)`);
116
+ if (result.staleIds.length > 0) {
117
+ console.error(` Stale: ${result.staleIds.join(', ')}`);
118
+ }
119
+ if (result.orphanIds.length > 0) {
120
+ console.error(` Orphans: ${result.orphanIds.join(', ')}`);
121
+ }
122
+ if (result.errors.length > 0) {
123
+ for (const err of result.errors) {
124
+ console.error(` Error: ${err}`);
125
+ }
126
+ }
127
+ break;
128
+ }
129
+ case 'init': {
130
+ const result = await (0, pool_actions_1.init)();
131
+ console.log(`Pool directory: ${result.pool_dir}`);
132
+ break;
133
+ }
134
+ default:
135
+ console.error(`Unknown command: ${command}`);
136
+ usage();
137
+ process.exit(1);
138
+ }
139
+ }
140
+ catch (err) {
141
+ console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
142
+ process.exit(1);
143
+ }
144
+ }
145
+ main();
146
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { claim, gc, init, refresh, replenish, resolvePoolDir, returnWorktree, status, } from './pool-actions';
2
+ export * from './pool-state';
3
+ export * from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,EAAE,EACF,IAAI,EACJ,OAAO,EACP,SAAS,EACT,cAAc,EACd,cAAc,EACd,MAAM,GACP,MAAM,gBAAgB,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.status = exports.returnWorktree = exports.resolvePoolDir = exports.replenish = exports.refresh = exports.init = exports.gc = exports.claim = void 0;
18
+ var pool_actions_1 = require("./pool-actions");
19
+ Object.defineProperty(exports, "claim", { enumerable: true, get: function () { return pool_actions_1.claim; } });
20
+ Object.defineProperty(exports, "gc", { enumerable: true, get: function () { return pool_actions_1.gc; } });
21
+ Object.defineProperty(exports, "init", { enumerable: true, get: function () { return pool_actions_1.init; } });
22
+ Object.defineProperty(exports, "refresh", { enumerable: true, get: function () { return pool_actions_1.refresh; } });
23
+ Object.defineProperty(exports, "replenish", { enumerable: true, get: function () { return pool_actions_1.replenish; } });
24
+ Object.defineProperty(exports, "resolvePoolDir", { enumerable: true, get: function () { return pool_actions_1.resolvePoolDir; } });
25
+ Object.defineProperty(exports, "returnWorktree", { enumerable: true, get: function () { return pool_actions_1.returnWorktree; } });
26
+ Object.defineProperty(exports, "status", { enumerable: true, get: function () { return pool_actions_1.status; } });
27
+ __exportStar(require("./pool-state"), exports);
28
+ __exportStar(require("./types"), exports);
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CASwB;AARtB,qGAAA,KAAK,OAAA;AACL,kGAAA,EAAE,OAAA;AACF,oGAAA,IAAI,OAAA;AACJ,uGAAA,OAAO,OAAA;AACP,yGAAA,SAAS,OAAA;AACT,8GAAA,cAAc,OAAA;AACd,8GAAA,cAAc,OAAA;AACd,sGAAA,MAAM,OAAA;AAER,+CAA6B;AAC7B,0CAAwB"}
@@ -0,0 +1,29 @@
1
+ import { getPoolStatus } from './pool-state';
2
+ export declare function resolvePoolDir(gitRoot: string, opts?: {
3
+ interactive?: boolean;
4
+ }): Promise<string>;
5
+ export declare function replenish(count?: number, _parallel?: boolean): Promise<{
6
+ created: number;
7
+ errors: string[];
8
+ }>;
9
+ export declare function claim(issue: number, branch: string): {
10
+ path: string;
11
+ } | null;
12
+ export declare function returnWorktree(worktreePath: string): void;
13
+ export declare function refresh(): {
14
+ refreshed: number;
15
+ errors: string[];
16
+ };
17
+ export declare function gc(): {
18
+ removed: number;
19
+ staleIds: string[];
20
+ orphanIds: string[];
21
+ errors: string[];
22
+ };
23
+ export declare function status(): ReturnType<typeof getPoolStatus> & {
24
+ pool_dir: string;
25
+ };
26
+ export declare function init(): Promise<{
27
+ pool_dir: string;
28
+ }>;
29
+ //# sourceMappingURL=pool-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-actions.d.ts","sourceRoot":"","sources":["../src/pool-actions.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,aAAa,EAKd,MAAM,cAAc,CAAC;AAyHtB,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,OAAO,CAAC,MAAM,CAAC,CAuBjB;AA2JD,wBAAsB,SAAS,CAC7B,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,UAAQ,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkGhD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqF5E;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CA6FzD;AAED,wBAAgB,OAAO,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2CjE;AAED,wBAAgB,EAAE,IAAI;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAmFA;AAED,wBAAgB,MAAM,IAAI,UAAU,CAAC,OAAO,aAAa,CAAC,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAKhF;AAED,wBAAsB,IAAI,IAAI,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAK1D"}
@@ -0,0 +1,692 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.resolvePoolDir = resolvePoolDir;
37
+ exports.replenish = replenish;
38
+ exports.claim = claim;
39
+ exports.returnWorktree = returnWorktree;
40
+ exports.refresh = refresh;
41
+ exports.gc = gc;
42
+ exports.status = status;
43
+ exports.init = init;
44
+ const node_child_process_1 = require("node:child_process");
45
+ const fs = __importStar(require("node:fs"));
46
+ const path = __importStar(require("node:path"));
47
+ const readline = __importStar(require("node:readline"));
48
+ const pool_state_1 = require("./pool-state");
49
+ const types_1 = require("./types");
50
+ const LOCK_TIMEOUT_MS = 10_000;
51
+ const LOCK_RETRY_MS = 200;
52
+ const POOL_CONFIG_FILE = '.worktree-pool.json';
53
+ // --- Git helpers ---
54
+ function findGitRoot() {
55
+ return (0, node_child_process_1.execSync)('git rev-parse --show-toplevel', {
56
+ encoding: 'utf-8',
57
+ }).trim();
58
+ }
59
+ function git(args, opts) {
60
+ return (0, node_child_process_1.execSync)(`git ${args}`, {
61
+ encoding: 'utf-8',
62
+ stdio: ['pipe', 'pipe', 'pipe'],
63
+ ...opts,
64
+ }).trim();
65
+ }
66
+ // --- Pool directory discovery ---
67
+ function getConfigPath(gitRoot) {
68
+ return path.join(gitRoot, POOL_CONFIG_FILE);
69
+ }
70
+ function readPoolDirConfig(gitRoot) {
71
+ const configPath = getConfigPath(gitRoot);
72
+ if (!fs.existsSync(configPath))
73
+ return null;
74
+ try {
75
+ const raw = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
76
+ if (raw.pool_dir && typeof raw.pool_dir === 'string') {
77
+ return { pool_dir: path.resolve(gitRoot, raw.pool_dir) };
78
+ }
79
+ }
80
+ catch {
81
+ // corrupt config — treat as absent
82
+ }
83
+ return null;
84
+ }
85
+ function writePoolDirConfig(gitRoot, poolDir) {
86
+ const configPath = getConfigPath(gitRoot);
87
+ const relPoolDir = path.relative(gitRoot, poolDir);
88
+ fs.writeFileSync(configPath, `${JSON.stringify({ pool_dir: relPoolDir }, null, 2)}\n`);
89
+ }
90
+ function discoverPoolDirFromWorktrees(gitRoot) {
91
+ try {
92
+ const output = git('worktree list --porcelain', { cwd: gitRoot });
93
+ const worktreePaths = [];
94
+ for (const line of output.split('\n')) {
95
+ if (line.startsWith('worktree ')) {
96
+ const wtPath = line.slice('worktree '.length);
97
+ if (path.resolve(wtPath) !== path.resolve(gitRoot)) {
98
+ worktreePaths.push(path.resolve(wtPath));
99
+ }
100
+ }
101
+ }
102
+ if (worktreePaths.length === 0)
103
+ return null;
104
+ const parents = worktreePaths.map((p) => path.dirname(p));
105
+ const commonParent = parents.reduce((a, b) => {
106
+ const partsA = a.split(path.sep);
107
+ const partsB = b.split(path.sep);
108
+ const common = [];
109
+ for (let i = 0; i < Math.min(partsA.length, partsB.length); i++) {
110
+ if (partsA[i] === partsB[i])
111
+ common.push(partsA[i]);
112
+ else
113
+ break;
114
+ }
115
+ return common.join(path.sep) || path.sep;
116
+ });
117
+ if (parents.every((p) => p === commonParent)) {
118
+ return commonParent;
119
+ }
120
+ const freq = new Map();
121
+ for (const p of parents) {
122
+ freq.set(p, (freq.get(p) || 0) + 1);
123
+ }
124
+ let best = '';
125
+ let bestCount = 0;
126
+ for (const [dir, count] of freq) {
127
+ if (count > bestCount) {
128
+ best = dir;
129
+ bestCount = count;
130
+ }
131
+ }
132
+ return best || null;
133
+ }
134
+ catch {
135
+ return null;
136
+ }
137
+ }
138
+ function suggestPoolDir(gitRoot) {
139
+ return path.join(gitRoot, '..', 'worktrees');
140
+ }
141
+ async function promptUser(question) {
142
+ const rl = readline.createInterface({
143
+ input: process.stdin,
144
+ output: process.stderr,
145
+ });
146
+ return new Promise((resolve) => {
147
+ rl.question(question, (answer) => {
148
+ rl.close();
149
+ resolve(answer.trim());
150
+ });
151
+ });
152
+ }
153
+ async function resolvePoolDir(gitRoot, opts) {
154
+ const config = readPoolDirConfig(gitRoot);
155
+ if (config)
156
+ return config.pool_dir;
157
+ const discovered = discoverPoolDirFromWorktrees(gitRoot);
158
+ const suggested = discovered || suggestPoolDir(gitRoot);
159
+ if (opts?.interactive && process.stdin.isTTY) {
160
+ console.error(`\nPool directory not configured for this project.`);
161
+ console.error(` Detected git root: ${gitRoot}`);
162
+ if (discovered) {
163
+ console.error(` Found existing worktrees in: ${discovered}`);
164
+ }
165
+ const answer = await promptUser(` Where should pool worktrees be stored? [${suggested}]: `);
166
+ const poolDir = answer || suggested;
167
+ const absPoolDir = path.resolve(gitRoot, poolDir);
168
+ writePoolDirConfig(gitRoot, absPoolDir);
169
+ console.error(` Saved to ${getConfigPath(gitRoot)}`);
170
+ return absPoolDir;
171
+ }
172
+ writePoolDirConfig(gitRoot, suggested);
173
+ return suggested;
174
+ }
175
+ function resolvePoolDirSync(gitRoot) {
176
+ const config = readPoolDirConfig(gitRoot);
177
+ if (config)
178
+ return config.pool_dir;
179
+ const discovered = discoverPoolDirFromWorktrees(gitRoot);
180
+ const poolDir = discovered || suggestPoolDir(gitRoot);
181
+ writePoolDirConfig(gitRoot, poolDir);
182
+ return poolDir;
183
+ }
184
+ // --- Path helpers ---
185
+ // Paths stored in state are relative to poolDir (just the directory name).
186
+ // Use toAbs() to resolve to absolute for git/fs operations.
187
+ function toAbs(poolDir, relPath) {
188
+ return path.join(poolDir, relPath);
189
+ }
190
+ // --- State file paths ---
191
+ function getStatePath(poolDir) {
192
+ return path.join(poolDir, '.pool-state.json');
193
+ }
194
+ function getLockPath(poolDir) {
195
+ return path.join(poolDir, '.pool-lock');
196
+ }
197
+ // --- Lock ---
198
+ function acquireLock(poolDir) {
199
+ const lockPath = getLockPath(poolDir);
200
+ fs.mkdirSync(poolDir, { recursive: true });
201
+ const start = Date.now();
202
+ while (true) {
203
+ try {
204
+ fs.mkdirSync(lockPath);
205
+ fs.writeFileSync(path.join(lockPath, 'pid'), String(process.pid));
206
+ return;
207
+ }
208
+ catch {
209
+ try {
210
+ const pidFile = path.join(lockPath, 'pid');
211
+ if (fs.existsSync(pidFile)) {
212
+ const lockPid = Number.parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
213
+ try {
214
+ process.kill(lockPid, 0);
215
+ }
216
+ catch {
217
+ fs.rmSync(lockPath, { recursive: true, force: true });
218
+ continue;
219
+ }
220
+ }
221
+ }
222
+ catch {
223
+ // retry
224
+ }
225
+ if (Date.now() - start > LOCK_TIMEOUT_MS) {
226
+ throw new Error(`Timed out waiting for pool lock (${LOCK_TIMEOUT_MS}ms). ` +
227
+ `If no other process is running, remove ${lockPath}`);
228
+ }
229
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, LOCK_RETRY_MS);
230
+ }
231
+ }
232
+ }
233
+ function releaseLock(poolDir) {
234
+ fs.rmSync(getLockPath(poolDir), { recursive: true, force: true });
235
+ }
236
+ // --- State I/O ---
237
+ function readState(poolDir) {
238
+ const statePath = getStatePath(poolDir);
239
+ if (!fs.existsSync(statePath)) {
240
+ return (0, pool_state_1.createEmptyState)();
241
+ }
242
+ const raw = fs.readFileSync(statePath, 'utf-8');
243
+ return (0, pool_state_1.validateState)(JSON.parse(raw));
244
+ }
245
+ function writeState(poolDir, state) {
246
+ const statePath = getStatePath(poolDir);
247
+ fs.mkdirSync(path.dirname(statePath), { recursive: true });
248
+ fs.writeFileSync(statePath, `${JSON.stringify(state, null, 2)}\n`);
249
+ }
250
+ function withLock(poolDir, fn) {
251
+ acquireLock(poolDir);
252
+ try {
253
+ const current = readState(poolDir);
254
+ const { state: newState, result } = fn(current);
255
+ writeState(poolDir, newState);
256
+ return result;
257
+ }
258
+ finally {
259
+ releaseLock(poolDir);
260
+ }
261
+ }
262
+ // --- .env copy ---
263
+ function copyEnvFiles(gitRoot, targetDir) {
264
+ const maxDepth = 3;
265
+ function walk(dir, depth, relBase) {
266
+ if (depth > maxDepth)
267
+ return;
268
+ let entries;
269
+ try {
270
+ entries = fs.readdirSync(dir, { withFileTypes: true });
271
+ }
272
+ catch {
273
+ return;
274
+ }
275
+ for (const entry of entries) {
276
+ const fullPath = path.join(dir, entry.name);
277
+ const relPath = path.join(relBase, entry.name);
278
+ if (entry.isDirectory()) {
279
+ if (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'worktrees')
280
+ continue;
281
+ walk(fullPath, depth + 1, relPath);
282
+ }
283
+ else if (entry.isFile() && entry.name.startsWith('.env') && entry.name !== '.env.example') {
284
+ const dest = path.join(targetDir, relPath);
285
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
286
+ fs.copyFileSync(fullPath, dest);
287
+ }
288
+ }
289
+ }
290
+ walk(gitRoot, 0, '');
291
+ }
292
+ // --- Destroy helper ---
293
+ function destroyWorktree(gitRoot, tempBranch, absPath) {
294
+ try {
295
+ git(`worktree remove "${absPath}" --force`, { cwd: gitRoot });
296
+ }
297
+ catch {
298
+ fs.rmSync(absPath, { recursive: true, force: true });
299
+ }
300
+ try {
301
+ git(`branch -D "${tempBranch}"`, { cwd: gitRoot });
302
+ }
303
+ catch {
304
+ // branch may not exist
305
+ }
306
+ git('worktree prune', { cwd: gitRoot });
307
+ }
308
+ // --- Public operations ---
309
+ async function replenish(count, _parallel = false) {
310
+ const gitRoot = findGitRoot();
311
+ const poolDir = await resolvePoolDir(gitRoot, { interactive: true });
312
+ fs.mkdirSync(poolDir, { recursive: true });
313
+ git('fetch origin', { cwd: gitRoot });
314
+ let toCreate;
315
+ if (count !== undefined) {
316
+ toCreate = count;
317
+ }
318
+ else {
319
+ const state = readState(poolDir);
320
+ toCreate = (0, pool_state_1.getSparesNeeded)(state);
321
+ }
322
+ if (toCreate <= 0) {
323
+ return { created: 0, errors: [] };
324
+ }
325
+ const errors = [];
326
+ let created = 0;
327
+ const createOne = () => {
328
+ const id = (0, types_1.generateId)();
329
+ const absWorktreePath = toAbs(poolDir, id);
330
+ const tempBranch = `pool/spare-${id}`;
331
+ const baseCommit = withLock(poolDir, (state) => {
332
+ const sha = git('rev-parse origin/main', { cwd: gitRoot });
333
+ const wt = {
334
+ id,
335
+ path: id,
336
+ status: 'creating',
337
+ temp_branch: tempBranch,
338
+ base_commit: sha,
339
+ warmed_at: new Date().toISOString(),
340
+ assigned_to_issue: null,
341
+ assigned_branch: null,
342
+ };
343
+ return { state: (0, pool_state_1.addWorktree)(state, wt), result: sha };
344
+ });
345
+ try {
346
+ git(`branch "${tempBranch}" origin/main`, { cwd: gitRoot });
347
+ git(`worktree add "${absWorktreePath}" ${tempBranch}`, {
348
+ cwd: gitRoot,
349
+ });
350
+ withLock(poolDir, (state) => ({
351
+ state: (0, pool_state_1.updateWorktree)(state, id, { status: 'warming' }),
352
+ result: undefined,
353
+ }));
354
+ copyEnvFiles(gitRoot, absWorktreePath);
355
+ (0, node_child_process_1.execSync)('npm install', {
356
+ cwd: absWorktreePath,
357
+ stdio: 'pipe',
358
+ timeout: 300_000,
359
+ });
360
+ (0, node_child_process_1.execSync)('make build-core build-mcp build-cli', {
361
+ cwd: absWorktreePath,
362
+ stdio: 'pipe',
363
+ timeout: 300_000,
364
+ });
365
+ withLock(poolDir, (state) => ({
366
+ state: (0, pool_state_1.updateWorktree)(state, id, {
367
+ status: 'warm',
368
+ warmed_at: new Date().toISOString(),
369
+ base_commit: baseCommit,
370
+ }),
371
+ result: undefined,
372
+ }));
373
+ created++;
374
+ }
375
+ catch (err) {
376
+ const msg = err instanceof Error ? err.message : String(err);
377
+ errors.push(`Failed to create ${id}: ${msg}`);
378
+ try {
379
+ destroyWorktree(gitRoot, tempBranch, absWorktreePath);
380
+ }
381
+ catch {
382
+ // best effort
383
+ }
384
+ withLock(poolDir, (state) => ({
385
+ state: (0, pool_state_1.removeWorktree)(state, id),
386
+ result: undefined,
387
+ }));
388
+ }
389
+ };
390
+ // Note: createOne uses execSync so parallelism is not possible in a single
391
+ // process. The --parallel flag is reserved for future async implementation.
392
+ for (let i = 0; i < toCreate; i++) {
393
+ createOne();
394
+ }
395
+ return { created, errors };
396
+ }
397
+ function claim(issue, branch) {
398
+ const gitRoot = findGitRoot();
399
+ const poolDir = resolvePoolDirSync(gitRoot);
400
+ const result = withLock(poolDir, (state) => {
401
+ const claimed = (0, pool_state_1.claimWorktree)(state, issue, branch);
402
+ if (!claimed)
403
+ return { state, result: null };
404
+ return { state: claimed.state, result: claimed.worktree };
405
+ });
406
+ if (!result)
407
+ return null;
408
+ const worktree = result;
409
+ const absPath = toAbs(poolDir, worktree.path);
410
+ const branchDir = branch.replace(/\//g, '-');
411
+ const newAbsPath = toAbs(poolDir, branchDir);
412
+ try {
413
+ // Check freshness
414
+ const currentMain = git('rev-parse origin/main', { cwd: gitRoot });
415
+ if (worktree.base_commit !== currentMain) {
416
+ let lockChanged = false;
417
+ try {
418
+ const diff = git(`diff --name-only ${worktree.base_commit}..origin/main`, { cwd: gitRoot });
419
+ lockChanged = diff.includes('package-lock.json');
420
+ }
421
+ catch {
422
+ lockChanged = true;
423
+ }
424
+ git('fetch origin', { cwd: absPath });
425
+ git('reset --hard origin/main', { cwd: absPath });
426
+ if (lockChanged) {
427
+ (0, node_child_process_1.execSync)('npm install', {
428
+ cwd: absPath,
429
+ stdio: 'pipe',
430
+ timeout: 300_000,
431
+ });
432
+ (0, node_child_process_1.execSync)('make build-core build-mcp build-cli', {
433
+ cwd: absPath,
434
+ stdio: 'pipe',
435
+ timeout: 300_000,
436
+ });
437
+ }
438
+ }
439
+ // Create issue branch
440
+ git(`checkout -b "${branch}"`, { cwd: absPath });
441
+ // Rename directory
442
+ if (absPath !== newAbsPath && !fs.existsSync(newAbsPath)) {
443
+ fs.renameSync(absPath, newAbsPath);
444
+ git('worktree repair', { cwd: gitRoot });
445
+ }
446
+ // Delete temp branch
447
+ try {
448
+ git(`branch -d "${worktree.temp_branch}"`, { cwd: gitRoot });
449
+ }
450
+ catch {
451
+ // may already be deleted
452
+ }
453
+ // Update state with new relative path
454
+ withLock(poolDir, (state) => ({
455
+ state: (0, pool_state_1.updateWorktree)(state, worktree.id, {
456
+ path: branchDir,
457
+ assigned_branch: branch,
458
+ assigned_to_issue: issue,
459
+ }),
460
+ result: undefined,
461
+ }));
462
+ return { path: newAbsPath };
463
+ }
464
+ catch (err) {
465
+ // Revert claim on failure
466
+ withLock(poolDir, (state) => ({
467
+ state: (0, pool_state_1.updateWorktree)(state, worktree.id, {
468
+ status: 'warm',
469
+ assigned_to_issue: null,
470
+ assigned_branch: null,
471
+ }),
472
+ result: undefined,
473
+ }));
474
+ throw err;
475
+ }
476
+ }
477
+ function returnWorktree(worktreePath) {
478
+ const gitRoot = findGitRoot();
479
+ const poolDir = resolvePoolDirSync(gitRoot);
480
+ const absPath = path.resolve(worktreePath);
481
+ const newId = (0, types_1.generateId)();
482
+ const newTempBranch = `pool/spare-${newId}`;
483
+ const newAbsPath = toAbs(poolDir, newId);
484
+ // Look up entry and mark as recycling atomically under lock
485
+ const entry = withLock(poolDir, (state) => {
486
+ const found = state.worktrees.find((w) => toAbs(poolDir, w.path) === absPath);
487
+ if (!found) {
488
+ throw new Error(`Worktree not found in pool state: ${worktreePath}`);
489
+ }
490
+ return {
491
+ state: (0, pool_state_1.updateWorktree)(state, found.id, { status: 'recycling' }),
492
+ result: { ...found },
493
+ };
494
+ });
495
+ try {
496
+ git('fetch origin', { cwd: absPath });
497
+ git(`checkout -b "${newTempBranch}" origin/main`, { cwd: absPath });
498
+ git('clean -fd', { cwd: absPath });
499
+ if (entry.assigned_branch) {
500
+ try {
501
+ git(`branch -D "${entry.assigned_branch}"`, { cwd: absPath });
502
+ }
503
+ catch {
504
+ // may not exist
505
+ }
506
+ }
507
+ if (absPath !== newAbsPath) {
508
+ fs.renameSync(absPath, newAbsPath);
509
+ git('worktree repair', { cwd: gitRoot });
510
+ }
511
+ const currentMain = git('rev-parse origin/main', { cwd: gitRoot });
512
+ let lockChanged = false;
513
+ try {
514
+ const diff = git(`diff --name-only ${entry.base_commit}..origin/main`, { cwd: gitRoot });
515
+ lockChanged = diff.includes('package-lock.json');
516
+ }
517
+ catch {
518
+ lockChanged = true;
519
+ }
520
+ if (lockChanged) {
521
+ (0, node_child_process_1.execSync)('npm install', {
522
+ cwd: newAbsPath,
523
+ stdio: 'pipe',
524
+ timeout: 300_000,
525
+ });
526
+ (0, node_child_process_1.execSync)('make build-core build-mcp build-cli', {
527
+ cwd: newAbsPath,
528
+ stdio: 'pipe',
529
+ timeout: 300_000,
530
+ });
531
+ }
532
+ withLock(poolDir, (state) => ({
533
+ state: (0, pool_state_1.updateWorktree)(state, entry.id, {
534
+ id: newId,
535
+ path: newId,
536
+ status: 'warm',
537
+ temp_branch: newTempBranch,
538
+ base_commit: currentMain,
539
+ warmed_at: new Date().toISOString(),
540
+ assigned_to_issue: null,
541
+ assigned_branch: null,
542
+ }),
543
+ result: undefined,
544
+ }));
545
+ }
546
+ catch (err) {
547
+ try {
548
+ destroyWorktree(gitRoot, entry.temp_branch, absPath);
549
+ }
550
+ catch {
551
+ // best effort
552
+ }
553
+ try {
554
+ destroyWorktree(gitRoot, newTempBranch, newAbsPath);
555
+ }
556
+ catch {
557
+ // best effort
558
+ }
559
+ withLock(poolDir, (state) => ({
560
+ state: (0, pool_state_1.removeWorktree)(state, entry.id),
561
+ result: undefined,
562
+ }));
563
+ throw new Error(`Recycle failed (destroyed worktree): ${err instanceof Error ? err.message : String(err)}`);
564
+ }
565
+ }
566
+ function refresh() {
567
+ const gitRoot = findGitRoot();
568
+ const poolDir = resolvePoolDirSync(gitRoot);
569
+ git('fetch origin', { cwd: gitRoot });
570
+ const state = readState(poolDir);
571
+ const warmWorktrees = state.worktrees.filter((w) => w.status === 'warm');
572
+ let refreshed = 0;
573
+ const errors = [];
574
+ for (const wt of warmWorktrees) {
575
+ const absPath = toAbs(poolDir, wt.path);
576
+ try {
577
+ git('fetch origin', { cwd: absPath });
578
+ git('reset --hard origin/main', { cwd: absPath });
579
+ (0, node_child_process_1.execSync)('npm install', {
580
+ cwd: absPath,
581
+ stdio: 'pipe',
582
+ timeout: 300_000,
583
+ });
584
+ (0, node_child_process_1.execSync)('make build-core build-mcp build-cli', {
585
+ cwd: absPath,
586
+ stdio: 'pipe',
587
+ timeout: 300_000,
588
+ });
589
+ const newSha = git('rev-parse HEAD', { cwd: absPath });
590
+ withLock(poolDir, (state) => ({
591
+ state: (0, pool_state_1.updateWorktree)(state, wt.id, {
592
+ base_commit: newSha,
593
+ warmed_at: new Date().toISOString(),
594
+ }),
595
+ result: undefined,
596
+ }));
597
+ refreshed++;
598
+ }
599
+ catch (err) {
600
+ errors.push(`Failed to refresh ${wt.id}: ${err instanceof Error ? err.message : String(err)}`);
601
+ }
602
+ }
603
+ return { refreshed, errors };
604
+ }
605
+ function gc() {
606
+ const gitRoot = findGitRoot();
607
+ const poolDir = resolvePoolDirSync(gitRoot);
608
+ const errors = [];
609
+ const staleIds = [];
610
+ const orphanIds = [];
611
+ let removed = 0;
612
+ // Get disk state — directory names inside poolDir
613
+ const existingNames = new Set();
614
+ if (fs.existsSync(poolDir)) {
615
+ for (const entry of fs.readdirSync(poolDir, { withFileTypes: true })) {
616
+ if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {
617
+ existingNames.add(entry.name);
618
+ }
619
+ }
620
+ }
621
+ const state = readState(poolDir);
622
+ // Remove stale worktrees
623
+ const stale = (0, pool_state_1.findStaleWorktrees)(state);
624
+ for (const wt of stale) {
625
+ try {
626
+ destroyWorktree(gitRoot, wt.temp_branch, toAbs(poolDir, wt.path));
627
+ withLock(poolDir, (s) => ({
628
+ state: (0, pool_state_1.removeWorktree)(s, wt.id),
629
+ result: undefined,
630
+ }));
631
+ staleIds.push(wt.id);
632
+ removed++;
633
+ }
634
+ catch (err) {
635
+ errors.push(`Failed to remove stale ${wt.id}: ${err instanceof Error ? err.message : String(err)}`);
636
+ }
637
+ }
638
+ // Reconcile orphans — compare relative path names
639
+ const stateNames = new Set(state.worktrees.map((w) => w.path));
640
+ const inStateNotOnDisk = state.worktrees.filter((w) => !existingNames.has(w.path));
641
+ const onDiskNotInState = [...existingNames].filter((name) => !stateNames.has(name));
642
+ for (const wt of inStateNotOnDisk) {
643
+ try {
644
+ withLock(poolDir, (s) => ({
645
+ state: (0, pool_state_1.removeWorktree)(s, wt.id),
646
+ result: undefined,
647
+ }));
648
+ try {
649
+ git(`branch -D "${wt.temp_branch}"`, { cwd: gitRoot });
650
+ }
651
+ catch {
652
+ // branch may not exist
653
+ }
654
+ orphanIds.push(wt.id);
655
+ removed++;
656
+ }
657
+ catch (err) {
658
+ errors.push(`Failed to clean orphan state ${wt.id}: ${err instanceof Error ? err.message : String(err)}`);
659
+ }
660
+ }
661
+ for (const dirName of onDiskNotInState) {
662
+ try {
663
+ const absPath = toAbs(poolDir, dirName);
664
+ try {
665
+ git(`worktree remove "${absPath}" --force`, { cwd: gitRoot });
666
+ }
667
+ catch {
668
+ fs.rmSync(absPath, { recursive: true, force: true });
669
+ }
670
+ orphanIds.push(dirName);
671
+ removed++;
672
+ }
673
+ catch (err) {
674
+ errors.push(`Failed to clean orphan disk ${dirName}: ${err instanceof Error ? err.message : String(err)}`);
675
+ }
676
+ }
677
+ git('worktree prune', { cwd: gitRoot });
678
+ return { removed, staleIds, orphanIds, errors };
679
+ }
680
+ function status() {
681
+ const gitRoot = findGitRoot();
682
+ const poolDir = resolvePoolDirSync(gitRoot);
683
+ const state = readState(poolDir);
684
+ return { ...(0, pool_state_1.getPoolStatus)(state), pool_dir: poolDir };
685
+ }
686
+ async function init() {
687
+ const gitRoot = findGitRoot();
688
+ const poolDir = await resolvePoolDir(gitRoot, { interactive: true });
689
+ fs.mkdirSync(poolDir, { recursive: true });
690
+ return { pool_dir: poolDir };
691
+ }
692
+ //# sourceMappingURL=pool-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-actions.js","sourceRoot":"","sources":["../src/pool-actions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuIA,wCA0BC;AA2JD,8BAqGC;AAED,sBAqFC;AAED,wCA6FC;AAED,0BA2CC;AAED,gBAwFC;AAED,wBAKC;AAED,oBAKC;AA5uBD,2DAAoE;AACpE,4CAA8B;AAC9B,gDAAkC;AAClC,wDAA0C;AAC1C,6CAUsB;AACtB,mCAAwE;AAExE,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAM/C,sBAAsB;AAEtB,SAAS,WAAW;IAClB,OACE,IAAA,6BAAQ,EAAC,+BAA+B,EAAE;QACxC,QAAQ,EAAE,OAAO;KAClB,CACF,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,IAAsB;IAC/C,OACE,IAAA,6BAAQ,EAAC,OAAO,IAAI,EAAE,EAAE;QACtB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QAC/B,GAAG,IAAI;KACR,CACF,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED,mCAAmC;AAEnC,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,IAAI,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAE,OAAe;IAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC9C,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChE,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;;oBAC/C,MAAM;YACb,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,EAAE,CAAC;YAC7C,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,IAAI,GAAG,GAAG,CAAC;gBACX,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,IAAI,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,IAAgC;IAEhC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;IAEnC,MAAM,UAAU,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,UAAU,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IAExD,IAAI,IAAI,EAAE,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,6CAA6C,SAAS,KAAK,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,MAAM,IAAI,SAAS,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,cAAc,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;IAEnC,MAAM,UAAU,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,UAAU,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IACtD,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uBAAuB;AACvB,2EAA2E;AAC3E,4DAA4D;AAE5D,SAAS,KAAK,CAAC,OAAe,EAAE,OAAe;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,2BAA2B;AAE3B,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,eAAe;AAEf,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACvB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC9E,IAAI,CAAC;wBACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAC3B,CAAC;oBAAC,MAAM,CAAC;wBACP,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;wBACtD,SAAS;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ;YACV,CAAC;YAED,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,eAAe,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CACb,oCAAoC,eAAe,OAAO;oBACxD,0CAA0C,QAAQ,EAAE,CACvD,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,oBAAoB;AAEpB,SAAS,SAAS,CAAC,OAAe;IAChC,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAA,6BAAgB,GAAE,CAAC;IAC5B,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,IAAA,0BAAa,EAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,KAAgB;IACnD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,QAAQ,CACf,OAAe,EACf,EAAyD;IAEzD,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAChD,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,WAAW,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,oBAAoB;AAEpB,SAAS,YAAY,CAAC,OAAe,EAAE,SAAiB;IACtD,MAAM,QAAQ,GAAG,CAAC,CAAC;IAEnB,SAAS,IAAI,CAAC,GAAW,EAAE,KAAa,EAAE,OAAe;QACvD,IAAI,KAAK,GAAG,QAAQ;YAAE,OAAO;QAC7B,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE/C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;oBACtF,SAAS;gBACX,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAC5F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC3C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC;AAED,yBAAyB;AAEzB,SAAS,eAAe,CAAC,OAAe,EAAE,UAAkB,EAAE,OAAe;IAC3E,IAAI,CAAC;QACH,GAAG,CAAC,oBAAoB,OAAO,WAAW,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC;QACH,GAAG,CAAC,cAAc,UAAU,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IACD,GAAG,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,4BAA4B;AAErB,KAAK,UAAU,SAAS,CAC7B,KAAc,EACd,SAAS,GAAG,KAAK;IAEjB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAEtC,IAAI,QAAgB,CAAC;IACrB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,QAAQ,GAAG,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,MAAM,EAAE,GAAG,IAAA,kBAAU,GAAE,CAAC;QACxB,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,cAAc,EAAE,EAAE,CAAC;QAEtC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3D,MAAM,EAAE,GAAiB;gBACvB,EAAE;gBACF,IAAI,EAAE,EAAE;gBACR,MAAM,EAAE,UAAU;gBAClB,WAAW,EAAE,UAAU;gBACvB,WAAW,EAAE,GAAG;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,iBAAiB,EAAE,IAAI;gBACvB,eAAe,EAAE,IAAI;aACtB,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAA,wBAAW,EAAC,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,GAAG,CAAC,WAAW,UAAU,eAAe,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5D,GAAG,CAAC,iBAAiB,eAAe,KAAK,UAAU,EAAE,EAAE;gBACrD,GAAG,EAAE,OAAO;aACb,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC5B,KAAK,EAAE,IAAA,2BAAc,EAAC,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBACvD,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC,CAAC;YAEJ,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YAEvC,IAAA,6BAAQ,EAAC,aAAa,EAAE;gBACtB,GAAG,EAAE,eAAe;gBACpB,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YACH,IAAA,6BAAQ,EAAC,qCAAqC,EAAE;gBAC9C,GAAG,EAAE,eAAe;gBACpB,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC5B,KAAK,EAAE,IAAA,2BAAc,EAAC,KAAK,EAAE,EAAE,EAAE;oBAC/B,MAAM,EAAE,MAAM;oBACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,WAAW,EAAE,UAAU;iBACxB,CAAC;gBACF,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC,CAAC;YAEJ,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACH,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC5B,KAAK,EAAE,IAAA,2BAAc,EAAC,KAAK,EAAE,EAAE,CAAC;gBAChC,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC,CAAC;IAEF,2EAA2E;IAC3E,4EAA4E;IAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,SAAS,EAAE,CAAC;IACd,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED,SAAgB,KAAK,CAAC,KAAa,EAAE,MAAc;IACjD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,IAAA,0BAAc,EAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,QAAQ,GAAG,MAAM,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,kBAAkB;QAClB,MAAM,WAAW,GAAG,GAAG,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE,IAAI,QAAQ,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;YACzC,IAAI,WAAW,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,GAAG,CAAC,oBAAoB,QAAQ,CAAC,WAAW,eAAe,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC5F,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;YAED,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YACtC,GAAG,CAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAElD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAA,6BAAQ,EAAC,aAAa,EAAE;oBACtB,GAAG,EAAE,OAAO;oBACZ,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,OAAO;iBACjB,CAAC,CAAC;gBACH,IAAA,6BAAQ,EAAC,qCAAqC,EAAE;oBAC9C,GAAG,EAAE,OAAO;oBACZ,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,OAAO;iBACjB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,GAAG,CAAC,gBAAgB,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAEjD,mBAAmB;QACnB,IAAI,OAAO,KAAK,UAAU,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACnC,GAAG,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC;YACH,GAAG,CAAC,cAAc,QAAQ,CAAC,WAAW,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QAED,sCAAsC;QACtC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,KAAK,EAAE,IAAA,2BAAc,EAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE;gBACxC,IAAI,EAAE,SAAS;gBACf,eAAe,EAAE,MAAM;gBACvB,iBAAiB,EAAE,KAAK;aACzB,CAAC;YACF,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC,CAAC;QAEJ,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0BAA0B;QAC1B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,KAAK,EAAE,IAAA,2BAAc,EAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE;gBACxC,MAAM,EAAE,MAAM;gBACd,iBAAiB,EAAE,IAAI;gBACvB,eAAe,EAAE,IAAI;aACtB,CAAC;YACF,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC,CAAC;QACJ,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAAC,YAAoB;IACjD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE3C,MAAM,KAAK,GAAG,IAAA,kBAAU,GAAE,CAAC;IAC3B,MAAM,aAAa,GAAG,cAAc,KAAK,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEzC,4DAA4D;IAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,qCAAqC,YAAY,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,OAAO;YACL,KAAK,EAAE,IAAA,2BAAc,EAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YAC/D,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE;SACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACtC,GAAG,CAAC,gBAAgB,aAAa,eAAe,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,GAAG,CAAC,cAAc,KAAK,CAAC,eAAe,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACnC,GAAG,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACnE,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,oBAAoB,KAAK,CAAC,WAAW,eAAe,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YACzF,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,IAAA,6BAAQ,EAAC,aAAa,EAAE;gBACtB,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YACH,IAAA,6BAAQ,EAAC,qCAAqC,EAAE;gBAC9C,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,KAAK,EAAE,IAAA,2BAAc,EAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;gBACrC,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,aAAa;gBAC1B,WAAW,EAAE,WAAW;gBACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,iBAAiB,EAAE,IAAI;gBACvB,eAAe,EAAE,IAAI;aACtB,CAAC;YACF,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YACH,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,IAAI,CAAC;YACH,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,KAAK,EAAE,IAAA,2BAAc,EAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC,CAAC;QACJ,MAAM,IAAI,KAAK,CACb,wCAAwC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC3F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAgB,OAAO;IACrB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5C,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACzE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YACtC,GAAG,CAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAClD,IAAA,6BAAQ,EAAC,aAAa,EAAE;gBACtB,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YACH,IAAA,6BAAQ,EAAC,qCAAqC,EAAE;gBAC9C,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YACvD,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC5B,KAAK,EAAE,IAAA,2BAAc,EAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;oBAClC,WAAW,EAAE,MAAM;oBACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC;gBACF,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC,CAAC;YACJ,SAAS,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,qBAAqB,EAAE,CAAC,EAAE,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAClF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC;AAED,SAAgB,EAAE;IAMhB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,kDAAkD;IAClD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACrE,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACxF,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAEjC,yBAAyB;IACzB,MAAM,KAAK,GAAG,IAAA,+BAAkB,EAAC,KAAK,CAAC,CAAC;IACxC,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAClE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxB,KAAK,EAAE,IAAA,2BAAc,EAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC/B,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC,CAAC;YACJ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,0BAA0B,EAAE,CAAC,EAAE,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnF,MAAM,gBAAgB,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpF,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxB,KAAK,EAAE,IAAA,2BAAc,EAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC/B,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC;gBACH,GAAG,CAAC,cAAc,EAAE,CAAC,WAAW,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,gCAAgC,EAAE,CAAC,EAAE,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC7F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC;gBACH,GAAG,CAAC,oBAAoB,OAAO,WAAW,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC;gBACP,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,+BAA+B,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC9F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,GAAG,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAExC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC;AAED,SAAgB,MAAM;IACpB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,IAAA,0BAAa,EAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC;AAEM,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type PoolConfig, type PoolState, type PoolWorktree } from './types';
2
+ export declare function createEmptyState(configOverrides?: Partial<PoolConfig>): PoolState;
3
+ export declare function validateState(data: unknown): PoolState;
4
+ export declare function addWorktree(state: PoolState, worktree: PoolWorktree): PoolState;
5
+ export declare function updateWorktree(state: PoolState, id: string, updates: Partial<PoolWorktree>): PoolState;
6
+ export declare function removeWorktree(state: PoolState, id: string): PoolState;
7
+ export declare function claimWorktree(state: PoolState, issue: number, branch: string): {
8
+ state: PoolState;
9
+ worktree: PoolWorktree;
10
+ } | null;
11
+ export declare function getWarmCount(state: PoolState): number;
12
+ export declare function getAssignedCount(state: PoolState): number;
13
+ export declare function getSparesNeeded(state: PoolState): number;
14
+ export declare function findStaleWorktrees(state: PoolState, now?: Date): PoolWorktree[];
15
+ export declare function findOrphans(state: PoolState, existingPaths: Set<string>): {
16
+ inStateNotOnDisk: PoolWorktree[];
17
+ onDiskNotInState: string[];
18
+ };
19
+ export interface PoolStatus {
20
+ warm: number;
21
+ assigned: number;
22
+ creating: number;
23
+ other: number;
24
+ total: number;
25
+ spares_needed: number;
26
+ config: PoolConfig;
27
+ worktrees: PoolWorktree[];
28
+ }
29
+ export declare function getPoolStatus(state: PoolState): PoolStatus;
30
+ //# sourceMappingURL=pool-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-state.d.ts","sourceRoot":"","sources":["../src/pool-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,YAAY,EAElB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,gBAAgB,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,SAAS,CAMjF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAmCtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,SAAS,CAQ/E;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAC7B,SAAS,CAQX;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAKtE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GAAG,IAAI,CAerD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAErD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAMxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,YAAY,EAAE,CAO3F;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB;IACD,gBAAgB,EAAE,YAAY,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CAKA;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAkB1D"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEmptyState = createEmptyState;
4
+ exports.validateState = validateState;
5
+ exports.addWorktree = addWorktree;
6
+ exports.updateWorktree = updateWorktree;
7
+ exports.removeWorktree = removeWorktree;
8
+ exports.claimWorktree = claimWorktree;
9
+ exports.getWarmCount = getWarmCount;
10
+ exports.getAssignedCount = getAssignedCount;
11
+ exports.getSparesNeeded = getSparesNeeded;
12
+ exports.findStaleWorktrees = findStaleWorktrees;
13
+ exports.findOrphans = findOrphans;
14
+ exports.getPoolStatus = getPoolStatus;
15
+ const types_1 = require("./types");
16
+ function createEmptyState(configOverrides) {
17
+ return {
18
+ schema_version: types_1.SCHEMA_VERSION,
19
+ config: { ...types_1.DEFAULT_CONFIG, ...configOverrides },
20
+ worktrees: [],
21
+ };
22
+ }
23
+ function validateState(data) {
24
+ if (!data || typeof data !== 'object') {
25
+ throw new Error('Pool state must be an object');
26
+ }
27
+ const obj = data;
28
+ if (obj.schema_version !== types_1.SCHEMA_VERSION) {
29
+ throw new Error(`Unsupported schema version: ${obj.schema_version} (expected ${types_1.SCHEMA_VERSION})`);
30
+ }
31
+ if (!obj.config || typeof obj.config !== 'object') {
32
+ throw new Error('Pool state must have a config object');
33
+ }
34
+ const config = obj.config;
35
+ if (typeof config.target_spares !== 'number' ||
36
+ config.target_spares < 1 ||
37
+ config.target_spares > 50) {
38
+ throw new Error('config.target_spares must be a number between 1 and 50');
39
+ }
40
+ if (typeof config.max_pool_size !== 'number' ||
41
+ config.max_pool_size < 1 ||
42
+ config.max_pool_size > 100) {
43
+ throw new Error('config.max_pool_size must be a number between 1 and 100');
44
+ }
45
+ if (typeof config.stale_after_hours !== 'number' || config.stale_after_hours < 1) {
46
+ throw new Error('config.stale_after_hours must be a positive number');
47
+ }
48
+ if (!Array.isArray(obj.worktrees)) {
49
+ throw new Error('Pool state must have a worktrees array');
50
+ }
51
+ return data;
52
+ }
53
+ function addWorktree(state, worktree) {
54
+ if (state.worktrees.length >= state.config.max_pool_size) {
55
+ throw new Error(`Pool is at max capacity (${state.config.max_pool_size})`);
56
+ }
57
+ return {
58
+ ...state,
59
+ worktrees: [...state.worktrees, worktree],
60
+ };
61
+ }
62
+ function updateWorktree(state, id, updates) {
63
+ const idx = state.worktrees.findIndex((w) => w.id === id);
64
+ if (idx === -1) {
65
+ throw new Error(`Worktree not found: ${id}`);
66
+ }
67
+ const worktrees = [...state.worktrees];
68
+ worktrees[idx] = { ...worktrees[idx], ...updates };
69
+ return { ...state, worktrees };
70
+ }
71
+ function removeWorktree(state, id) {
72
+ return {
73
+ ...state,
74
+ worktrees: state.worktrees.filter((w) => w.id !== id),
75
+ };
76
+ }
77
+ function claimWorktree(state, issue, branch) {
78
+ const warm = state.worktrees.find((w) => w.status === 'warm');
79
+ if (!warm)
80
+ return null;
81
+ const updated = {
82
+ ...warm,
83
+ status: 'assigned',
84
+ assigned_to_issue: issue,
85
+ assigned_branch: branch,
86
+ };
87
+ return {
88
+ state: updateWorktree(state, warm.id, updated),
89
+ worktree: updated,
90
+ };
91
+ }
92
+ function getWarmCount(state) {
93
+ return state.worktrees.filter((w) => w.status === 'warm').length;
94
+ }
95
+ function getAssignedCount(state) {
96
+ return state.worktrees.filter((w) => w.status === 'assigned').length;
97
+ }
98
+ function getSparesNeeded(state) {
99
+ const warmCount = getWarmCount(state);
100
+ const totalCount = state.worktrees.length;
101
+ const capacityLeft = state.config.max_pool_size - totalCount;
102
+ const sparesNeeded = state.config.target_spares - warmCount;
103
+ return Math.max(0, Math.min(sparesNeeded, capacityLeft));
104
+ }
105
+ function findStaleWorktrees(state, now = new Date()) {
106
+ const cutoff = now.getTime() - state.config.stale_after_hours * 60 * 60 * 1000;
107
+ return state.worktrees.filter((w) => {
108
+ if (w.status === 'assigned')
109
+ return false;
110
+ const warmedAt = new Date(w.warmed_at).getTime();
111
+ return warmedAt < cutoff;
112
+ });
113
+ }
114
+ function findOrphans(state, existingPaths) {
115
+ const inStateNotOnDisk = state.worktrees.filter((w) => !existingPaths.has(w.path));
116
+ const statePaths = new Set(state.worktrees.map((w) => w.path));
117
+ const onDiskNotInState = [...existingPaths].filter((p) => !statePaths.has(p));
118
+ return { inStateNotOnDisk, onDiskNotInState };
119
+ }
120
+ function getPoolStatus(state) {
121
+ const warm = getWarmCount(state);
122
+ const assigned = getAssignedCount(state);
123
+ const creating = state.worktrees.filter((w) => w.status === 'creating' || w.status === 'warming').length;
124
+ const other = state.worktrees.length - warm - assigned - creating;
125
+ return {
126
+ warm,
127
+ assigned,
128
+ creating,
129
+ other,
130
+ total: state.worktrees.length,
131
+ spares_needed: getSparesNeeded(state),
132
+ config: state.config,
133
+ worktrees: state.worktrees,
134
+ };
135
+ }
136
+ //# sourceMappingURL=pool-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-state.js","sourceRoot":"","sources":["../src/pool-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export type WorktreeStatus = 'creating' | 'warming' | 'warm' | 'assigned' | 'recycling' | 'destroying';
2
+ export interface PoolConfig {
3
+ target_spares: number;
4
+ max_pool_size: number;
5
+ stale_after_hours: number;
6
+ }
7
+ export interface PoolWorktree {
8
+ id: string;
9
+ path: string;
10
+ status: WorktreeStatus;
11
+ temp_branch: string;
12
+ base_commit: string;
13
+ warmed_at: string;
14
+ assigned_to_issue: number | null;
15
+ assigned_branch: string | null;
16
+ }
17
+ export interface PoolState {
18
+ schema_version: '1.0.0';
19
+ config: PoolConfig;
20
+ worktrees: PoolWorktree[];
21
+ }
22
+ export declare const DEFAULT_CONFIG: PoolConfig;
23
+ export declare const SCHEMA_VERSION: "1.0.0";
24
+ export declare function generateId(): string;
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,SAAS,GACT,MAAM,GACN,UAAU,GACV,WAAW,GACX,YAAY,CAAC;AAEjB,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAC;AAE/C,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
package/dist/types.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SCHEMA_VERSION = exports.DEFAULT_CONFIG = void 0;
4
+ exports.generateId = generateId;
5
+ exports.DEFAULT_CONFIG = {
6
+ target_spares: 5,
7
+ max_pool_size: 10,
8
+ stale_after_hours: 72,
9
+ };
10
+ exports.SCHEMA_VERSION = '1.0.0';
11
+ function generateId() {
12
+ return `pool-${Date.now()}-${process.pid}`;
13
+ }
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAuCA,gCAEC;AAVY,QAAA,cAAc,GAAe;IACxC,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,EAAE;IACjB,iBAAiB,EAAE,EAAE;CACtB,CAAC;AAEW,QAAA,cAAc,GAAG,OAAgB,CAAC;AAE/C,SAAgB,UAAU;IACxB,OAAO,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAC7C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@ai-dossier/worktree-pool",
3
+ "version": "0.1.0",
4
+ "description": "Pre-warmed git worktree pool for instant issue setup",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "worktree-pool": "./dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist/"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "test:coverage": "vitest run --coverage"
19
+ },
20
+ "keywords": [
21
+ "worktree",
22
+ "pool",
23
+ "git",
24
+ "dossier",
25
+ "pre-warm"
26
+ ],
27
+ "author": "Yuval Dimnik <yuval.dimnik@gmail.com>",
28
+ "license": "AGPL-3.0-only",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/imboard-ai/ai-dossier.git",
32
+ "directory": "packages/worktree-pool"
33
+ },
34
+ "homepage": "https://github.com/imboard-ai/ai-dossier#readme",
35
+ "bugs": {
36
+ "url": "https://github.com/imboard-ai/ai-dossier/issues"
37
+ },
38
+ "engines": {
39
+ "node": ">=20.0.0"
40
+ },
41
+ "publishConfig": {
42
+ "access": "public",
43
+ "registry": "https://registry.npmjs.org"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^24.10.0",
47
+ "typescript": "^5.9.3",
48
+ "vitest": "^4.0.9"
49
+ }
50
+ }