copilot-agent 0.1.0 → 0.2.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 +29 -0
- package/dist/index.js +390 -37
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,6 +9,8 @@ Autonomous GitHub Copilot CLI agent — auto-resume sessions, discover tasks, ru
|
|
|
9
9
|
- **`run`** — Auto-discover and fix issues in any project
|
|
10
10
|
- **`overnight`** — Run tasks continuously until a deadline (e.g. 07:00)
|
|
11
11
|
- **`research`** — Research improvements, dependencies, architecture
|
|
12
|
+
- **`daemon`** — Background watchdog that auto-resumes interrupted sessions
|
|
13
|
+
- **`multi`** — Multi-project orchestrator (register projects, run health/research on all)
|
|
12
14
|
|
|
13
15
|
## Install
|
|
14
16
|
|
|
@@ -79,6 +81,33 @@ copilot-agent research
|
|
|
79
81
|
copilot-agent research "migrate from Room to SQLDelight"
|
|
80
82
|
```
|
|
81
83
|
|
|
84
|
+
### Background daemon
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Start watchdog (monitors & auto-resumes sessions)
|
|
88
|
+
copilot-agent daemon start --resume
|
|
89
|
+
|
|
90
|
+
# Check status / view logs / stop
|
|
91
|
+
copilot-agent daemon status
|
|
92
|
+
copilot-agent daemon logs
|
|
93
|
+
copilot-agent daemon stop
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Multi-project
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Register projects
|
|
100
|
+
copilot-agent multi add ~/project-a
|
|
101
|
+
copilot-agent multi add ~/project-b
|
|
102
|
+
copilot-agent multi list
|
|
103
|
+
|
|
104
|
+
# Run health check on all projects
|
|
105
|
+
copilot-agent multi health
|
|
106
|
+
|
|
107
|
+
# Run research on all projects
|
|
108
|
+
copilot-agent multi research --dry-run
|
|
109
|
+
```
|
|
110
|
+
|
|
82
111
|
## How it works
|
|
83
112
|
|
|
84
113
|
1. **Session detection** — Reads `~/.copilot/session-state/*/events.jsonl` to detect task completion vs interruption
|
package/dist/index.js
CHANGED
|
@@ -265,7 +265,7 @@ async function waitForExit(pid, timeoutMs = 144e5) {
|
|
|
265
265
|
return false;
|
|
266
266
|
}
|
|
267
267
|
function runCopilot(args, options) {
|
|
268
|
-
return new Promise((
|
|
268
|
+
return new Promise((resolve4) => {
|
|
269
269
|
const child = spawn("copilot", args, {
|
|
270
270
|
cwd: options?.cwd,
|
|
271
271
|
stdio: "inherit",
|
|
@@ -275,14 +275,14 @@ function runCopilot(args, options) {
|
|
|
275
275
|
await sleep(3e3);
|
|
276
276
|
const sid = getLatestSessionId();
|
|
277
277
|
const premium = sid ? getSessionPremium(sid) : 0;
|
|
278
|
-
|
|
278
|
+
resolve4({
|
|
279
279
|
exitCode: code ?? 1,
|
|
280
280
|
sessionId: sid,
|
|
281
281
|
premium
|
|
282
282
|
});
|
|
283
283
|
});
|
|
284
284
|
child.on("error", () => {
|
|
285
|
-
|
|
285
|
+
resolve4({ exitCode: 1, sessionId: null, premium: 0 });
|
|
286
286
|
});
|
|
287
287
|
});
|
|
288
288
|
}
|
|
@@ -633,43 +633,34 @@ async function withLock(name, fn) {
|
|
|
633
633
|
}
|
|
634
634
|
|
|
635
635
|
// src/lib/git.ts
|
|
636
|
+
import { existsSync as existsSync4 } from "fs";
|
|
637
|
+
import { join as join4 } from "path";
|
|
636
638
|
import { execSync as execSync4 } from "child_process";
|
|
637
|
-
function
|
|
639
|
+
function gitExec(dir, cmd) {
|
|
638
640
|
try {
|
|
639
|
-
return execSync4(
|
|
640
|
-
cwd,
|
|
641
|
-
encoding: "utf-8"
|
|
641
|
+
return execSync4(cmd, {
|
|
642
|
+
cwd: dir,
|
|
643
|
+
encoding: "utf-8",
|
|
644
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
642
645
|
}).trim();
|
|
643
646
|
} catch {
|
|
644
|
-
return
|
|
647
|
+
return null;
|
|
645
648
|
}
|
|
646
649
|
}
|
|
647
|
-
function
|
|
648
|
-
|
|
649
|
-
return execSync4("git status --porcelain", {
|
|
650
|
-
cwd,
|
|
651
|
-
encoding: "utf-8"
|
|
652
|
-
}).trim();
|
|
653
|
-
} catch {
|
|
654
|
-
return "";
|
|
655
|
-
}
|
|
650
|
+
function isGitRepo(dir) {
|
|
651
|
+
return existsSync4(join4(dir, ".git"));
|
|
656
652
|
}
|
|
657
|
-
function
|
|
658
|
-
|
|
659
|
-
cwd,
|
|
660
|
-
stdio: "ignore"
|
|
661
|
-
});
|
|
653
|
+
function gitCurrentBranch(dir) {
|
|
654
|
+
return gitExec(dir, "git branch --show-current");
|
|
662
655
|
}
|
|
663
|
-
function
|
|
664
|
-
|
|
656
|
+
function gitStash(dir) {
|
|
657
|
+
return gitExec(dir, "git stash -q") !== null;
|
|
665
658
|
}
|
|
666
|
-
function
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
return false;
|
|
672
|
-
}
|
|
659
|
+
function gitCheckout(dir, branch) {
|
|
660
|
+
return gitExec(dir, `git checkout ${branch} -q`) !== null;
|
|
661
|
+
}
|
|
662
|
+
function gitStatus(dir) {
|
|
663
|
+
return gitExec(dir, "git status --porcelain") ?? "";
|
|
673
664
|
}
|
|
674
665
|
|
|
675
666
|
// src/commands/run.ts
|
|
@@ -691,7 +682,7 @@ async function runCommand(dir, opts) {
|
|
|
691
682
|
log(chalk3.dim("(dry-run \u2014 not executing)"));
|
|
692
683
|
return;
|
|
693
684
|
}
|
|
694
|
-
const originalBranch =
|
|
685
|
+
const originalBranch = isGitRepo(dir) ? gitCurrentBranch(dir) : null;
|
|
695
686
|
let completed = 0;
|
|
696
687
|
let premiumTotal = 0;
|
|
697
688
|
for (const task of tasks) {
|
|
@@ -699,7 +690,7 @@ async function runCommand(dir, opts) {
|
|
|
699
690
|
${"\u2550".repeat(60)}`);
|
|
700
691
|
log(`Task: ${chalk3.bold(task.title)}`);
|
|
701
692
|
log(`${"\u2550".repeat(60)}`);
|
|
702
|
-
if (originalBranch &&
|
|
693
|
+
if (originalBranch && isGitRepo(dir)) {
|
|
703
694
|
const branch = `copilot-agent/${task.title.toLowerCase().replace(/[^a-z0-9]+/g, "-")}`;
|
|
704
695
|
try {
|
|
705
696
|
if (gitStatus(dir)) gitStash(dir);
|
|
@@ -717,7 +708,7 @@ ${"\u2550".repeat(60)}`);
|
|
|
717
708
|
premiumTotal += result.premium;
|
|
718
709
|
completed++;
|
|
719
710
|
ok(`${task.title} \u2014 exit ${result.exitCode}, premium: ${result.premium}`);
|
|
720
|
-
if (originalBranch &&
|
|
711
|
+
if (originalBranch && isGitRepo(dir)) {
|
|
721
712
|
try {
|
|
722
713
|
gitCheckout(dir, originalBranch);
|
|
723
714
|
} catch {
|
|
@@ -732,12 +723,12 @@ Completed ${completed}/${tasks.length} tasks. Total premium: ${premiumTotal}`);
|
|
|
732
723
|
// src/commands/overnight.ts
|
|
733
724
|
import chalk4 from "chalk";
|
|
734
725
|
import ora3 from "ora";
|
|
735
|
-
import { join as
|
|
726
|
+
import { join as join5 } from "path";
|
|
736
727
|
import { homedir as homedir3 } from "os";
|
|
737
728
|
async function overnightCommand(dir, opts) {
|
|
738
729
|
assertCopilot();
|
|
739
730
|
const ts = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "").slice(0, 15);
|
|
740
|
-
const logPath =
|
|
731
|
+
const logPath = join5(
|
|
741
732
|
homedir3(),
|
|
742
733
|
".copilot",
|
|
743
734
|
"auto-resume-logs",
|
|
@@ -876,9 +867,349 @@ ${chalk5.bold(r.title)}`);
|
|
|
876
867
|
notify("All research tasks complete");
|
|
877
868
|
}
|
|
878
869
|
|
|
870
|
+
// src/commands/daemon.ts
|
|
871
|
+
import { existsSync as existsSync5, readFileSync as readFileSync4, writeFileSync as writeFileSync2, unlinkSync, statSync as statSync2 } from "fs";
|
|
872
|
+
import { join as join6 } from "path";
|
|
873
|
+
import { homedir as homedir4 } from "os";
|
|
874
|
+
import { spawn as spawn2 } from "child_process";
|
|
875
|
+
var PID_FILE = join6(homedir4(), ".copilot", "watchdog.pid");
|
|
876
|
+
var LOG_FILE = join6(homedir4(), ".copilot", "auto-resume-logs", "watchdog.log");
|
|
877
|
+
var SESSION_DIR2 = join6(homedir4(), ".copilot", "session-state");
|
|
878
|
+
async function daemonCommand(action, opts) {
|
|
879
|
+
switch (action) {
|
|
880
|
+
case "start":
|
|
881
|
+
return startDaemon(opts);
|
|
882
|
+
case "stop":
|
|
883
|
+
return stopDaemon();
|
|
884
|
+
case "status":
|
|
885
|
+
return statusDaemon();
|
|
886
|
+
case "logs":
|
|
887
|
+
return showLogs();
|
|
888
|
+
default:
|
|
889
|
+
fail(`Unknown action: ${action}. Use: start, stop, status, logs`);
|
|
890
|
+
process.exit(1);
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
function isDaemonRunning() {
|
|
894
|
+
if (!existsSync5(PID_FILE)) return { running: false };
|
|
895
|
+
try {
|
|
896
|
+
const pid = parseInt(readFileSync4(PID_FILE, "utf-8").trim());
|
|
897
|
+
process.kill(pid, 0);
|
|
898
|
+
return { running: true, pid };
|
|
899
|
+
} catch {
|
|
900
|
+
return { running: false };
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
async function startDaemon(opts) {
|
|
904
|
+
assertCopilot();
|
|
905
|
+
const { running, pid } = isDaemonRunning();
|
|
906
|
+
if (running) {
|
|
907
|
+
fail(`Watchdog already running (PID: ${pid}). Use 'copilot-agent daemon stop' first.`);
|
|
908
|
+
process.exit(1);
|
|
909
|
+
}
|
|
910
|
+
if (existsSync5(PID_FILE)) {
|
|
911
|
+
unlinkSync(PID_FILE);
|
|
912
|
+
}
|
|
913
|
+
log(`\u{1F415} Starting watchdog daemon (poll: ${opts.poll}s, auto-resume: ${opts.resume})`);
|
|
914
|
+
log(` Log: ${LOG_FILE}`);
|
|
915
|
+
const child = spawn2(
|
|
916
|
+
process.execPath,
|
|
917
|
+
[
|
|
918
|
+
process.argv[1],
|
|
919
|
+
"daemon",
|
|
920
|
+
"_loop",
|
|
921
|
+
"--poll",
|
|
922
|
+
String(opts.poll),
|
|
923
|
+
"--idle",
|
|
924
|
+
String(opts.idle),
|
|
925
|
+
"--steps",
|
|
926
|
+
String(opts.steps),
|
|
927
|
+
...opts.resume ? ["--resume"] : []
|
|
928
|
+
],
|
|
929
|
+
{
|
|
930
|
+
detached: true,
|
|
931
|
+
stdio: "ignore"
|
|
932
|
+
}
|
|
933
|
+
);
|
|
934
|
+
child.unref();
|
|
935
|
+
if (child.pid) {
|
|
936
|
+
writeFileSync2(PID_FILE, String(child.pid));
|
|
937
|
+
ok(`Watchdog started (PID: ${child.pid})`);
|
|
938
|
+
} else {
|
|
939
|
+
fail("Failed to start watchdog");
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
async function stopDaemon() {
|
|
943
|
+
const { running, pid } = isDaemonRunning();
|
|
944
|
+
if (!running) {
|
|
945
|
+
warn("Watchdog is not running.");
|
|
946
|
+
return;
|
|
947
|
+
}
|
|
948
|
+
try {
|
|
949
|
+
process.kill(pid, "SIGTERM");
|
|
950
|
+
ok(`Watchdog stopped (PID: ${pid})`);
|
|
951
|
+
} catch {
|
|
952
|
+
fail(`Could not stop PID ${pid}`);
|
|
953
|
+
}
|
|
954
|
+
try {
|
|
955
|
+
unlinkSync(PID_FILE);
|
|
956
|
+
} catch {
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
async function statusDaemon() {
|
|
960
|
+
const { running, pid } = isDaemonRunning();
|
|
961
|
+
if (running) {
|
|
962
|
+
ok(`Watchdog running (PID: ${pid})`);
|
|
963
|
+
if (existsSync5(LOG_FILE)) {
|
|
964
|
+
const stat = statSync2(LOG_FILE);
|
|
965
|
+
log(`Log: ${LOG_FILE} (${(stat.size / 1024).toFixed(1)} KB)`);
|
|
966
|
+
}
|
|
967
|
+
} else {
|
|
968
|
+
log("Watchdog is not running.");
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
async function showLogs() {
|
|
972
|
+
if (!existsSync5(LOG_FILE)) {
|
|
973
|
+
log("No log file found.");
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
const lines = readFileSync4(LOG_FILE, "utf-8").trimEnd().split("\n");
|
|
977
|
+
const tail = lines.slice(-30);
|
|
978
|
+
for (const line of tail) console.log(line);
|
|
979
|
+
}
|
|
980
|
+
async function daemonLoop(opts) {
|
|
981
|
+
setLogFile(LOG_FILE);
|
|
982
|
+
log(`\u{1F415} Watchdog daemon loop started (PID: ${process.pid})`);
|
|
983
|
+
let lastAlertedSid = "";
|
|
984
|
+
const shutdown = () => {
|
|
985
|
+
log("Watchdog shutting down");
|
|
986
|
+
try {
|
|
987
|
+
unlinkSync(PID_FILE);
|
|
988
|
+
} catch {
|
|
989
|
+
}
|
|
990
|
+
process.exit(0);
|
|
991
|
+
};
|
|
992
|
+
process.on("SIGTERM", shutdown);
|
|
993
|
+
process.on("SIGINT", shutdown);
|
|
994
|
+
while (true) {
|
|
995
|
+
await sleep4(opts.poll * 1e3);
|
|
996
|
+
try {
|
|
997
|
+
const sid = getLatestSessionId();
|
|
998
|
+
if (!sid || !validateSession(sid)) continue;
|
|
999
|
+
if (sid === lastAlertedSid && hasTaskComplete(sid)) continue;
|
|
1000
|
+
const pid = await findPidForSession(sid);
|
|
1001
|
+
if (pid) continue;
|
|
1002
|
+
if (hasTaskComplete(sid)) {
|
|
1003
|
+
if (sid !== lastAlertedSid) {
|
|
1004
|
+
log(`\u2705 Session ${sid.slice(0, 8)} completed: ${getSessionSummary(sid).slice(0, 60)}`);
|
|
1005
|
+
notify("Task completed", `Session ${sid.slice(0, 8)}`);
|
|
1006
|
+
lastAlertedSid = sid;
|
|
1007
|
+
}
|
|
1008
|
+
continue;
|
|
1009
|
+
}
|
|
1010
|
+
const eventsPath = join6(SESSION_DIR2, sid, "events.jsonl");
|
|
1011
|
+
const mtime = statSync2(eventsPath).mtimeMs;
|
|
1012
|
+
const idleMinutes = (Date.now() - mtime) / 6e4;
|
|
1013
|
+
if (idleMinutes < opts.idle) continue;
|
|
1014
|
+
log(`\u23F8\uFE0F Session ${sid.slice(0, 8)} idle ${idleMinutes.toFixed(0)}m (last: ${getLastEvent(sid)})`);
|
|
1015
|
+
if (opts.resume) {
|
|
1016
|
+
log(`\u{1F504} Auto-resuming session ${sid.slice(0, 8)}\u2026`);
|
|
1017
|
+
lastAlertedSid = sid;
|
|
1018
|
+
try {
|
|
1019
|
+
await withLock("watchdog-resume", async () => {
|
|
1020
|
+
const result = await runCopilotResume(sid, opts.steps);
|
|
1021
|
+
ok(`Resume done \u2014 exit ${result.exitCode}, premium: ${result.premium}`);
|
|
1022
|
+
});
|
|
1023
|
+
} catch (err) {
|
|
1024
|
+
fail(`Resume failed: ${err}`);
|
|
1025
|
+
}
|
|
1026
|
+
} else {
|
|
1027
|
+
if (sid !== lastAlertedSid) {
|
|
1028
|
+
warn(`Session ${sid.slice(0, 8)} needs attention (idle ${idleMinutes.toFixed(0)}m)`);
|
|
1029
|
+
notify("Session interrupted", `${sid.slice(0, 8)} idle ${idleMinutes.toFixed(0)}m`);
|
|
1030
|
+
lastAlertedSid = sid;
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
} catch (err) {
|
|
1034
|
+
fail(`Watchdog error: ${err}`);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
function sleep4(ms) {
|
|
1039
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
// src/commands/multi.ts
|
|
1043
|
+
import { existsSync as existsSync6, mkdirSync as mkdirSync3, readFileSync as readFileSync5, writeFileSync as writeFileSync3 } from "fs";
|
|
1044
|
+
import { join as join7, resolve as resolve3, basename as basename2 } from "path";
|
|
1045
|
+
import { homedir as homedir5 } from "os";
|
|
1046
|
+
import chalk6 from "chalk";
|
|
1047
|
+
var PROJECTS_FILE = join7(homedir5(), ".copilot", "autonomous-projects.txt");
|
|
1048
|
+
var LOG_DIR = join7(homedir5(), ".copilot", "auto-resume-logs");
|
|
1049
|
+
async function multiCommand(action, args, opts) {
|
|
1050
|
+
ensureFiles();
|
|
1051
|
+
switch (action) {
|
|
1052
|
+
case "add":
|
|
1053
|
+
return addProject(args[0]);
|
|
1054
|
+
case "remove":
|
|
1055
|
+
return removeProject(args[0]);
|
|
1056
|
+
case "list":
|
|
1057
|
+
return listProjects();
|
|
1058
|
+
case "health":
|
|
1059
|
+
case "research":
|
|
1060
|
+
return runAll(action, opts);
|
|
1061
|
+
default:
|
|
1062
|
+
fail(`Unknown action: ${action}. Use: add, remove, list, health, research`);
|
|
1063
|
+
process.exit(1);
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
function ensureFiles() {
|
|
1067
|
+
mkdirSync3(LOG_DIR, { recursive: true });
|
|
1068
|
+
if (!existsSync6(PROJECTS_FILE)) writeFileSync3(PROJECTS_FILE, "");
|
|
1069
|
+
}
|
|
1070
|
+
function readProjects() {
|
|
1071
|
+
return readFileSync5(PROJECTS_FILE, "utf-8").split("\n").map((l) => l.trim()).filter(Boolean);
|
|
1072
|
+
}
|
|
1073
|
+
function writeProjects(projects) {
|
|
1074
|
+
writeFileSync3(PROJECTS_FILE, projects.join("\n") + "\n");
|
|
1075
|
+
}
|
|
1076
|
+
async function addProject(path) {
|
|
1077
|
+
if (!path) {
|
|
1078
|
+
fail("Usage: copilot-agent multi add <path>");
|
|
1079
|
+
process.exit(1);
|
|
1080
|
+
}
|
|
1081
|
+
const resolved = resolve3(path);
|
|
1082
|
+
if (!existsSync6(resolved)) {
|
|
1083
|
+
fail(`Not found: ${resolved}`);
|
|
1084
|
+
process.exit(1);
|
|
1085
|
+
}
|
|
1086
|
+
await withLock("projects-file", async () => {
|
|
1087
|
+
const projects = readProjects();
|
|
1088
|
+
if (projects.includes(resolved)) {
|
|
1089
|
+
warn(`Already registered: ${resolved}`);
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
projects.push(resolved);
|
|
1093
|
+
writeProjects(projects);
|
|
1094
|
+
ok(`Added: ${resolved}`);
|
|
1095
|
+
});
|
|
1096
|
+
}
|
|
1097
|
+
async function removeProject(path) {
|
|
1098
|
+
if (!path) {
|
|
1099
|
+
fail("Usage: copilot-agent multi remove <path>");
|
|
1100
|
+
process.exit(1);
|
|
1101
|
+
}
|
|
1102
|
+
const resolved = resolve3(path);
|
|
1103
|
+
await withLock("projects-file", async () => {
|
|
1104
|
+
const projects = readProjects();
|
|
1105
|
+
const filtered = projects.filter((p) => p !== resolved);
|
|
1106
|
+
if (filtered.length === projects.length) {
|
|
1107
|
+
warn(`Not registered: ${resolved}`);
|
|
1108
|
+
return;
|
|
1109
|
+
}
|
|
1110
|
+
writeProjects(filtered);
|
|
1111
|
+
ok(`Removed: ${resolved}`);
|
|
1112
|
+
});
|
|
1113
|
+
}
|
|
1114
|
+
function listProjects() {
|
|
1115
|
+
const projects = readProjects();
|
|
1116
|
+
if (projects.length === 0) {
|
|
1117
|
+
log("No projects registered. Add: copilot-agent multi add <path>");
|
|
1118
|
+
return;
|
|
1119
|
+
}
|
|
1120
|
+
console.log(chalk6.bold("\nRegistered projects:"));
|
|
1121
|
+
for (let i = 0; i < projects.length; i++) {
|
|
1122
|
+
const exists = existsSync6(projects[i]);
|
|
1123
|
+
const icon = exists ? chalk6.green("\u2705") : chalk6.red("\u274C");
|
|
1124
|
+
const type = exists ? detectProjectType(projects[i]) : "?";
|
|
1125
|
+
console.log(` ${i + 1}. ${icon} ${projects[i]} ${chalk6.dim(`(${type})`)}`);
|
|
1126
|
+
}
|
|
1127
|
+
console.log();
|
|
1128
|
+
}
|
|
1129
|
+
async function runAll(mode, opts) {
|
|
1130
|
+
assertCopilot();
|
|
1131
|
+
const ts = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "").slice(0, 15);
|
|
1132
|
+
setLogFile(join7(LOG_DIR, `multi-${mode}-${ts}.log`));
|
|
1133
|
+
const projects = readProjects();
|
|
1134
|
+
if (projects.length === 0) {
|
|
1135
|
+
fail("No projects registered. Add: copilot-agent multi add <path>");
|
|
1136
|
+
process.exit(1);
|
|
1137
|
+
}
|
|
1138
|
+
log(`\u{1F3ED} Multi-project ${mode} \u2014 ${projects.length} projects`);
|
|
1139
|
+
if (opts.dryRun) {
|
|
1140
|
+
for (const p of projects) {
|
|
1141
|
+
const type = existsSync6(p) ? detectProjectType(p) : "unknown";
|
|
1142
|
+
const tasks = getTasksForProject(type);
|
|
1143
|
+
console.log(`
|
|
1144
|
+
${chalk6.bold(basename2(p))} (${type})`);
|
|
1145
|
+
for (const t of tasks.slice(0, 3)) {
|
|
1146
|
+
console.log(` ${chalk6.dim("\u2022")} ${t.title}`);
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
log(chalk6.dim("\n(dry-run \u2014 not executing)"));
|
|
1150
|
+
return;
|
|
1151
|
+
}
|
|
1152
|
+
let total = 0;
|
|
1153
|
+
let success = 0;
|
|
1154
|
+
let failed = 0;
|
|
1155
|
+
let skipped = 0;
|
|
1156
|
+
const report = [];
|
|
1157
|
+
for (const project of projects) {
|
|
1158
|
+
total++;
|
|
1159
|
+
if (!existsSync6(project)) {
|
|
1160
|
+
warn(`Skipping (not found): ${project}`);
|
|
1161
|
+
report.push(`\u23ED ${basename2(project)} (not found)`);
|
|
1162
|
+
skipped++;
|
|
1163
|
+
continue;
|
|
1164
|
+
}
|
|
1165
|
+
const name = detectProjectName(project);
|
|
1166
|
+
const type = detectProjectType(project);
|
|
1167
|
+
log(`
|
|
1168
|
+
${"\u2550".repeat(50)}`);
|
|
1169
|
+
log(`${chalk6.bold(name)} (${type}) \u2014 ${total}/${projects.length}`);
|
|
1170
|
+
log(`${"\u2550".repeat(50)}`);
|
|
1171
|
+
const tasks = mode === "research" ? [{ title: "Research", prompt: "Research latest best practices, dependency updates, and architecture improvements. Create a report.", priority: 1 }] : getTasksForProject(type).slice(0, 3);
|
|
1172
|
+
let projectSuccess = true;
|
|
1173
|
+
for (const task of tasks) {
|
|
1174
|
+
try {
|
|
1175
|
+
const result = await withLock(
|
|
1176
|
+
"copilot-multi",
|
|
1177
|
+
() => runCopilotTask(
|
|
1178
|
+
`Project: ${project}
|
|
1179
|
+
|
|
1180
|
+
${task.prompt}`,
|
|
1181
|
+
opts.steps
|
|
1182
|
+
)
|
|
1183
|
+
);
|
|
1184
|
+
ok(`${task.title} \u2014 exit ${result.exitCode}, premium: ${result.premium}`);
|
|
1185
|
+
} catch (err) {
|
|
1186
|
+
fail(`${task.title} failed: ${err}`);
|
|
1187
|
+
projectSuccess = false;
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
if (projectSuccess) {
|
|
1191
|
+
success++;
|
|
1192
|
+
report.push(`\u2705 ${name}`);
|
|
1193
|
+
} else {
|
|
1194
|
+
failed++;
|
|
1195
|
+
report.push(`\u274C ${name}`);
|
|
1196
|
+
}
|
|
1197
|
+
if (total < projects.length) {
|
|
1198
|
+
log(`Cooldown ${opts.cooldown}s\u2026`);
|
|
1199
|
+
await new Promise((r) => setTimeout(r, opts.cooldown * 1e3));
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
console.log(`
|
|
1203
|
+
${"\u2550".repeat(50)}`);
|
|
1204
|
+
log(`\u{1F4CA} Summary: ${success}/${total} succeeded, ${failed} failed, ${skipped} skipped`);
|
|
1205
|
+
for (const line of report) console.log(` ${line}`);
|
|
1206
|
+
console.log();
|
|
1207
|
+
notify(`Multi-${mode}: ${success}/${total} succeeded`, "copilot-agent");
|
|
1208
|
+
}
|
|
1209
|
+
|
|
879
1210
|
// src/index.ts
|
|
880
1211
|
var program = new Command();
|
|
881
|
-
program.name("copilot-agent").description("Autonomous GitHub Copilot CLI agent \u2014 auto-resume, task discovery, overnight runner").version("0.
|
|
1212
|
+
program.name("copilot-agent").description("Autonomous GitHub Copilot CLI agent \u2014 auto-resume, task discovery, overnight runner").version("0.2.0");
|
|
882
1213
|
program.command("status").description("Show copilot session status").option("-l, --limit <n>", "Number of sessions to show", "10").option("-a, --active", "Show only active (running) sessions").action(async (opts) => {
|
|
883
1214
|
await statusCommand({
|
|
884
1215
|
limit: parseInt(opts.limit),
|
|
@@ -912,5 +1243,27 @@ program.command("research [topic]").description("Research improvements or a spec
|
|
|
912
1243
|
steps: parseInt(opts.steps)
|
|
913
1244
|
});
|
|
914
1245
|
});
|
|
1246
|
+
var daemon = program.command("daemon <action>").description("Background watchdog daemon (start, stop, status, logs)").option("--poll <n>", "Poll interval in seconds", "20").option("--idle <n>", "Minutes before considering session idle", "5").option("--resume", "Auto-resume interrupted sessions").option("-s, --steps <n>", "Max autopilot continues per resume", "50").action(async (action, opts) => {
|
|
1247
|
+
const parsed = {
|
|
1248
|
+
poll: parseInt(opts.poll),
|
|
1249
|
+
idle: parseInt(opts.idle),
|
|
1250
|
+
resume: opts.resume ?? false,
|
|
1251
|
+
steps: parseInt(opts.steps)
|
|
1252
|
+
};
|
|
1253
|
+
if (action === "_loop") {
|
|
1254
|
+
await daemonLoop(parsed);
|
|
1255
|
+
} else {
|
|
1256
|
+
await daemonCommand(action, parsed);
|
|
1257
|
+
}
|
|
1258
|
+
});
|
|
1259
|
+
var multi = program.command("multi <action> [args...]").description("Multi-project orchestrator (add, remove, list, health, research)").option("-s, --steps <n>", "Max autopilot continues per task", "30").option("-c, --cooldown <n>", "Seconds between projects", "60").option("-p, --max-premium <n>", "Max premium per project", "30").option("--dry-run", "Show plan without executing").action(async (action, args, opts) => {
|
|
1260
|
+
await multiCommand(action, args, {
|
|
1261
|
+
mode: action,
|
|
1262
|
+
cooldown: parseInt(opts.cooldown),
|
|
1263
|
+
steps: parseInt(opts.steps),
|
|
1264
|
+
maxPremium: parseInt(opts.maxPremium),
|
|
1265
|
+
dryRun: opts.dryRun ?? false
|
|
1266
|
+
});
|
|
1267
|
+
});
|
|
915
1268
|
program.parse();
|
|
916
1269
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/status.ts","../src/lib/session.ts","../src/lib/process.ts","../src/lib/logger.ts","../src/lib/colors.ts","../src/commands/watch.ts","../src/commands/run.ts","../src/lib/detect.ts","../src/lib/tasks.ts","../src/lib/lock.ts","../src/lib/git.ts","../src/commands/overnight.ts","../src/commands/research.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { watchCommand } from \"./commands/watch.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { overnightCommand } from \"./commands/overnight.js\";\nimport { researchCommand } from \"./commands/research.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"copilot-agent\")\n .description(\"Autonomous GitHub Copilot CLI agent — auto-resume, task discovery, overnight runner\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"status\")\n .description(\"Show copilot session status\")\n .option(\"-l, --limit <n>\", \"Number of sessions to show\", \"10\")\n .option(\"-a, --active\", \"Show only active (running) sessions\")\n .action(async (opts) => {\n await statusCommand({\n limit: parseInt(opts.limit),\n active: opts.active ?? false,\n });\n });\n\nprogram\n .command(\"watch [session-id]\")\n .description(\"Watch a session and auto-resume when it stops\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues per resume\", \"50\")\n .option(\"-r, --max-resumes <n>\", \"Max number of resumes\", \"20\")\n .option(\"-m, --message <msg>\", \"Message to send on resume\")\n .action(async (sid, opts) => {\n await watchCommand(sid, {\n steps: parseInt(opts.steps),\n maxResumes: parseInt(opts.maxResumes),\n message: opts.message,\n });\n });\n\nprogram\n .command(\"run [dir]\")\n .description(\"Discover and fix issues in a project\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues per task\", \"30\")\n .option(\"-t, --max-tasks <n>\", \"Max number of tasks to run\", \"5\")\n .option(\"--dry-run\", \"Show tasks without executing\")\n .action(async (dir, opts) => {\n await runCommand(dir ?? process.cwd(), {\n steps: parseInt(opts.steps),\n maxTasks: parseInt(opts.maxTasks),\n dryRun: opts.dryRun ?? false,\n });\n });\n\nprogram\n .command(\"overnight [dir]\")\n .description(\"Run tasks continuously until a deadline\")\n .option(\"-u, --until <HH:MM>\", \"Deadline time (24h format)\", \"07:00\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues per task\", \"50\")\n .option(\"-p, --max-premium <n>\", \"Max premium requests budget\", \"300\")\n .option(\"--dry-run\", \"Show plan without executing\")\n .action(async (dir, opts) => {\n await overnightCommand(dir ?? process.cwd(), {\n until: opts.until,\n steps: parseInt(opts.steps),\n maxPremium: parseInt(opts.maxPremium),\n dryRun: opts.dryRun ?? false,\n });\n });\n\nprogram\n .command(\"research [topic]\")\n .description(\"Research improvements or a specific topic\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues\", \"30\")\n .action(async (topic, opts) => {\n await researchCommand(topic, {\n steps: parseInt(opts.steps),\n });\n });\n\nprogram.parse();\n","import chalk from \"chalk\";\nimport {\n listSessions,\n hasTaskComplete,\n getLastEvent,\n getSessionPremium,\n} from \"../lib/session.js\";\nimport { findCopilotProcesses } from \"../lib/process.js\";\nimport { log } from \"../lib/logger.js\";\n\nexport interface StatusOptions {\n limit: number;\n active: boolean;\n}\n\nexport async function statusCommand(opts: StatusOptions): Promise<void> {\n if (opts.active) {\n return showActive();\n }\n showRecent(opts.limit);\n}\n\nasync function showActive(): Promise<void> {\n const procs = await findCopilotProcesses();\n if (procs.length === 0) {\n log(\"No active copilot processes.\");\n return;\n }\n\n console.log(\n chalk.bold(\n `\\n${\"PID\".padEnd(8)} ${\"Session\".padEnd(40)} ${\"Command\".slice(0, 60)}`,\n ),\n );\n console.log(\"─\".repeat(108));\n\n for (const p of procs) {\n console.log(\n `${String(p.pid).padEnd(8)} ${(p.sessionId ?? \"—\").padEnd(40)} ${(p.command ?? \"\").slice(0, 60)}`,\n );\n }\n console.log();\n}\n\nfunction showRecent(limit: number): void {\n const sessions = listSessions(limit);\n if (sessions.length === 0) {\n log(\"No sessions found.\");\n return;\n }\n\n console.log(\n chalk.bold(\n `\\n${\"Status\".padEnd(10)} ${\"Premium\".padEnd(10)} ${\"Last Event\".padEnd(25)} ${\"Summary\".padEnd(40)} ${\"ID\"}`,\n ),\n );\n console.log(\"─\".repeat(120));\n\n for (const s of sessions) {\n const done = hasTaskComplete(s.id);\n const status = done\n ? chalk.green(\"✅ done\")\n : chalk.yellow(\"⏸️ stopped\");\n const premium = String(getSessionPremium(s.id));\n const lastEvt = getLastEvent(s.id);\n const summary = (s.summary ?? \"—\").slice(0, 38);\n\n console.log(\n `${status.padEnd(20)} ${premium.padEnd(10)} ${lastEvt.padEnd(25)} ${summary.padEnd(40)} ${chalk.dim(s.id)}`,\n );\n }\n console.log();\n}\n","import {\n existsSync,\n readdirSync,\n readFileSync,\n statSync,\n} from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface Session {\n id: string;\n dir: string;\n mtime: number;\n lastEvent: string;\n premiumRequests: number;\n summary: string;\n cwd: string;\n complete: boolean;\n}\n\nconst SESSION_DIR = join(homedir(), '.copilot', 'session-state');\n\nexport function getSessionDir(): string {\n return SESSION_DIR;\n}\n\nexport function validateSession(sid: string): boolean {\n const events = join(SESSION_DIR, sid, 'events.jsonl');\n try {\n return existsSync(events) && statSync(events).size > 0;\n } catch {\n return false;\n }\n}\n\nexport function listSessions(limit = 20): Session[] {\n if (!existsSync(SESSION_DIR)) return [];\n\n const entries = readdirSync(SESSION_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n const dirs: { id: string; dir: string; mtime: number }[] = [];\n for (const entry of entries) {\n const dirPath = join(SESSION_DIR, entry.name);\n if (!existsSync(join(dirPath, 'events.jsonl'))) continue;\n try {\n const stat = statSync(dirPath);\n dirs.push({ id: entry.name, dir: dirPath, mtime: stat.mtimeMs });\n } catch { /* skip */ }\n }\n\n dirs.sort((a, b) => b.mtime - a.mtime);\n\n return dirs.slice(0, limit).map(s => ({\n id: s.id,\n dir: s.dir,\n mtime: s.mtime,\n lastEvent: getLastEvent(s.id),\n premiumRequests: getSessionPremium(s.id),\n summary: getSessionSummary(s.id),\n cwd: getSessionCwd(s.id),\n complete: hasTaskComplete(s.id),\n }));\n}\n\nexport function getLatestSessionId(): string | null {\n if (!existsSync(SESSION_DIR)) return null;\n\n const entries = readdirSync(SESSION_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n let latest: { id: string; mtime: number } | null = null;\n for (const entry of entries) {\n try {\n const stat = statSync(join(SESSION_DIR, entry.name));\n if (!latest || stat.mtimeMs > latest.mtime) {\n latest = { id: entry.name, mtime: stat.mtimeMs };\n }\n } catch { /* skip */ }\n }\n return latest?.id ?? null;\n}\n\nexport function hasTaskComplete(sid: string): boolean {\n if (!validateSession(sid)) return false;\n try {\n const content = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8');\n return content.includes('\"session.task_complete\"');\n } catch {\n return false;\n }\n}\n\nexport function getLastEvent(sid: string): string {\n if (!validateSession(sid)) return 'invalid';\n try {\n const lines = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8')\n .trimEnd()\n .split('\\n');\n const last = JSON.parse(lines[lines.length - 1]);\n return last.type ?? 'unknown';\n } catch {\n return 'corrupted';\n }\n}\n\nexport function getSessionPremium(sid: string): number {\n if (!validateSession(sid)) return 0;\n try {\n const content = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8');\n const lines = content.trimEnd().split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n try {\n const event = JSON.parse(lines[i]);\n if (event.type === 'session.shutdown' && event.data?.totalPremiumRequests != null) {\n return event.data.totalPremiumRequests;\n }\n } catch { /* skip malformed line */ }\n }\n return 0;\n } catch {\n return 0;\n }\n}\n\nfunction parseSimpleYaml(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const idx = line.indexOf(': ');\n if (idx === -1) continue;\n const key = line.substring(0, idx).trim();\n const value = line.substring(idx + 2).trim();\n if (key) result[key] = value;\n }\n return result;\n}\n\nfunction readWorkspace(sid: string): Record<string, string> {\n const wsPath = join(SESSION_DIR, sid, 'workspace.yaml');\n if (!existsSync(wsPath)) return {};\n try {\n return parseSimpleYaml(readFileSync(wsPath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function getSessionSummary(sid: string): string {\n return readWorkspace(sid).summary ?? '';\n}\n\nexport function getSessionCwd(sid: string): string {\n return readWorkspace(sid).cwd ?? '';\n}\n\nexport function findSessionForProject(projectPath: string): string | null {\n const resolved = resolve(projectPath);\n const sessions = listSessions(50);\n for (const s of sessions) {\n if (s.cwd && resolve(s.cwd) === resolved) return s.id;\n }\n return null;\n}\n\nexport function findLatestIncomplete(): string | null {\n const sessions = listSessions(50);\n for (const s of sessions) {\n if (!s.complete) return s.id;\n }\n return null;\n}\n","import { execSync, spawn } from 'node:child_process';\nimport { getLatestSessionId, getSessionPremium } from './session.js';\nimport { fail } from './logger.js';\n\nexport interface CopilotProcess {\n pid: number;\n command: string;\n sessionId?: string;\n}\n\nexport interface CopilotResult {\n exitCode: number;\n sessionId: string | null;\n premium: number;\n}\n\nexport function isCopilotInstalled(): boolean {\n try {\n execSync('which copilot', { stdio: 'pipe', encoding: 'utf-8' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function assertCopilot(): void {\n if (!isCopilotInstalled()) {\n fail('copilot CLI not found. Install with: npm i -g @githubnext/copilot');\n process.exit(1);\n }\n}\n\nexport function findCopilotProcesses(): CopilotProcess[] {\n try {\n const output = execSync('ps -eo pid,command', { encoding: 'utf-8' });\n const results: CopilotProcess[] = [];\n for (const line of output.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (\n (trimmed.includes('copilot') || trimmed.includes('@githubnext/copilot')) &&\n !trimmed.includes('ps -eo') &&\n !trimmed.includes('copilot-agent') &&\n !trimmed.includes('grep')\n ) {\n const match = trimmed.match(/^(\\d+)\\s+(.+)$/);\n if (match) {\n const cmd = match[2];\n const sidMatch = cmd.match(/resume[= ]+([a-f0-9-]{36})/);\n results.push({\n pid: parseInt(match[1], 10),\n command: cmd,\n sessionId: sidMatch?.[1],\n });\n }\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n\nexport function findPidForSession(sid: string): number | null {\n const procs = findCopilotProcesses();\n const matching = procs\n .filter(p => p.command.includes(sid))\n .sort((a, b) => b.pid - a.pid);\n return matching[0]?.pid ?? null;\n}\n\nexport async function waitForExit(pid: number, timeoutMs = 14_400_000): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n process.kill(pid, 0);\n await sleep(5000);\n } catch {\n return true; // process exited\n }\n }\n return false; // timeout\n}\n\nexport function runCopilot(\n args: string[],\n options?: { cwd?: string },\n): Promise<CopilotResult> {\n return new Promise((resolve) => {\n const child = spawn('copilot', args, {\n cwd: options?.cwd,\n stdio: 'inherit',\n env: { ...process.env },\n });\n\n child.on('close', async (code) => {\n await sleep(3000); // let events flush\n const sid = getLatestSessionId();\n const premium = sid ? getSessionPremium(sid) : 0;\n resolve({\n exitCode: code ?? 1,\n sessionId: sid,\n premium,\n });\n });\n\n child.on('error', () => {\n resolve({ exitCode: 1, sessionId: null, premium: 0 });\n });\n });\n}\n\nexport function runCopilotResume(\n sid: string,\n steps: number,\n message?: string,\n cwd?: string,\n): Promise<CopilotResult> {\n const args = [\n `--resume=${sid}`,\n '--autopilot',\n '--allow-all',\n '--max-autopilot-continues',\n String(steps),\n '--no-ask-user',\n ];\n if (message) args.push('-p', message);\n return runCopilot(args, { cwd });\n}\n\nexport function runCopilotTask(\n prompt: string,\n steps: number,\n cwd?: string,\n): Promise<CopilotResult> {\n return runCopilot([\n '-p', prompt,\n '--autopilot',\n '--allow-all',\n '--max-autopilot-continues', String(steps),\n '--no-ask-user',\n ], { cwd });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { RED, GREEN, YELLOW, CYAN, DIM, RESET } from './colors.js';\n\nlet logFilePath: string | null = null;\n\nconst ANSI_RE =\n /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;\n\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, '');\n}\n\nfunction writeToFile(msg: string): void {\n if (!logFilePath) return;\n try {\n appendFileSync(logFilePath, stripAnsi(msg) + '\\n');\n } catch { /* ignore file write errors */ }\n}\n\nexport function setLogFile(path: string): void {\n mkdirSync(dirname(path), { recursive: true });\n logFilePath = path;\n}\n\nexport function log(msg: string): void {\n console.log(msg);\n writeToFile(msg);\n}\n\nexport function warn(msg: string): void {\n const out = `${YELLOW}⚠ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`⚠ ${msg}`);\n}\n\nexport function ok(msg: string): void {\n const out = `${GREEN}✔ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`✔ ${msg}`);\n}\n\nexport function fail(msg: string): void {\n const out = `${RED}✖ ${msg}${RESET}`;\n console.error(out);\n writeToFile(`✖ ${msg}`);\n}\n\nexport function info(msg: string): void {\n const out = `${CYAN}ℹ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`ℹ ${msg}`);\n}\n\nexport function dim(msg: string): void {\n const out = `${DIM}${msg}${RESET}`;\n console.log(out);\n writeToFile(msg);\n}\n\nexport function notify(message: string, title = 'copilot-agent'): void {\n try {\n if (process.platform === 'darwin') {\n execSync(\n `osascript -e 'display notification \"${message.replace(/\"/g, '\\\\\"')}\" with title \"${title.replace(/\"/g, '\\\\\"')}\"'`,\n { stdio: 'ignore' },\n );\n } else {\n try {\n execSync('which notify-send', { stdio: 'pipe' });\n execSync(\n `notify-send \"${title}\" \"${message.replace(/\"/g, '\\\\\"')}\"`,\n { stdio: 'ignore' },\n );\n } catch { /* notify-send not available */ }\n }\n } catch { /* notification not available */ }\n}\n","export const RED = '\\x1b[31m';\nexport const GREEN = '\\x1b[32m';\nexport const YELLOW = '\\x1b[33m';\nexport const BLUE = '\\x1b[34m';\nexport const CYAN = '\\x1b[36m';\nexport const DIM = '\\x1b[2m';\nexport const BOLD = '\\x1b[1m';\nexport const RESET = '\\x1b[0m';\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n validateSession,\n hasTaskComplete,\n getSessionSummary,\n getLastEvent,\n findLatestIncomplete,\n} from \"../lib/session.js\";\nimport {\n findPidForSession,\n waitForExit,\n runCopilotResume,\n assertCopilot,\n} from \"../lib/process.js\";\nimport { log, ok, warn, fail, notify } from \"../lib/logger.js\";\n\nexport interface WatchOptions {\n steps: number;\n maxResumes: number;\n message?: string;\n}\n\nexport async function watchCommand(\n sid: string | undefined,\n opts: WatchOptions,\n): Promise<void> {\n assertCopilot();\n\n if (!sid) {\n sid = findLatestIncomplete() ?? undefined;\n if (!sid) {\n fail(\"No incomplete session found.\");\n process.exit(1);\n }\n log(`Auto-detected incomplete session: ${chalk.cyan(sid)}`);\n }\n\n if (!validateSession(sid)) {\n fail(`Invalid session: ${sid}`);\n process.exit(1);\n }\n\n if (hasTaskComplete(sid)) {\n ok(`Session ${sid} already completed.`);\n return;\n }\n\n let resumes = 0;\n\n while (resumes < opts.maxResumes) {\n const pid = await findPidForSession(sid);\n\n if (pid) {\n const spinner = ora(\n `Watching PID ${pid} for session ${chalk.cyan(sid.slice(0, 8))}…`,\n ).start();\n const exited = await waitForExit(pid);\n spinner.stop();\n\n if (!exited) {\n warn(\"Timeout waiting for process exit.\");\n break;\n }\n }\n\n // Small delay for events to flush\n await sleep(3000);\n\n if (hasTaskComplete(sid)) {\n ok(\n `Task complete! Summary: ${getSessionSummary(sid) || \"none\"}`,\n );\n notify(\"Task completed!\", `Session ${sid.slice(0, 8)}`);\n return;\n }\n\n // Interrupted — resume\n resumes++;\n log(\n `Session interrupted (${getLastEvent(sid)}). Resume ${resumes}/${opts.maxResumes}…`,\n );\n\n const result = await runCopilotResume(sid, opts.steps, opts.message);\n if (result.sessionId && result.sessionId !== sid) {\n log(`New session created: ${chalk.cyan(result.sessionId)}`);\n sid = result.sessionId;\n }\n }\n\n warn(`Max resumes (${opts.maxResumes}) reached.`);\n notify(\"Max resumes reached\", `Session ${sid.slice(0, 8)}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { detectProjectType, detectProjectName } from \"../lib/detect.js\";\nimport { getTasksForProject } from \"../lib/tasks.js\";\nimport { runCopilotTask, assertCopilot } from \"../lib/process.js\";\nimport { withLock } from \"../lib/lock.js\";\nimport { gitBranch, gitStatus, gitStash, gitCheckout, gitIsRepo } from \"../lib/git.js\";\nimport { log, ok, warn, fail, notify } from \"../lib/logger.js\";\n\nexport interface RunOptions {\n steps: number;\n maxTasks: number;\n dryRun: boolean;\n}\n\nexport async function runCommand(\n dir: string,\n opts: RunOptions,\n): Promise<void> {\n assertCopilot();\n\n const projectType = detectProjectType(dir);\n const name = detectProjectName(dir);\n log(`Project: ${chalk.cyan(name)} (${projectType})`);\n\n const tasks = getTasksForProject(projectType).slice(0, opts.maxTasks);\n\n if (tasks.length === 0) {\n warn(\"No tasks found for this project type.\");\n return;\n }\n\n log(`Found ${tasks.length} tasks:`);\n for (const t of tasks) {\n console.log(` ${chalk.dim(\"•\")} ${t.title}`);\n }\n\n if (opts.dryRun) {\n log(chalk.dim(\"(dry-run — not executing)\"));\n return;\n }\n\n const originalBranch = gitIsRepo(dir) ? gitBranch(dir) : null;\n let completed = 0;\n let premiumTotal = 0;\n\n for (const task of tasks) {\n log(`\\n${\"═\".repeat(60)}`);\n log(`Task: ${chalk.bold(task.title)}`);\n log(`${\"═\".repeat(60)}`);\n\n // Create a feature branch for safety\n if (originalBranch && gitIsRepo(dir)) {\n const branch = `copilot-agent/${task.title.toLowerCase().replace(/[^a-z0-9]+/g, \"-\")}`;\n try {\n if (gitStatus(dir)) gitStash(dir);\n gitCheckout(dir, branch);\n } catch (e) {\n warn(`Could not create branch ${branch}, continuing on current.`);\n }\n }\n\n const spinner = ora(`Running: ${task.title}…`).start();\n\n const result = await withLock(\"copilot-run\", () =>\n runCopilotTask(task.prompt, opts.steps),\n );\n\n spinner.stop();\n\n premiumTotal += result.premium;\n completed++;\n ok(`${task.title} — exit ${result.exitCode}, premium: ${result.premium}`);\n\n if (originalBranch && gitIsRepo(dir)) {\n try {\n gitCheckout(dir, originalBranch);\n } catch {\n /* stay on feature branch */\n }\n }\n }\n\n log(`\\nCompleted ${completed}/${tasks.length} tasks. Total premium: ${premiumTotal}`);\n notify(`Completed ${completed} tasks`, name);\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, basename, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\n\nexport type ProjectType =\n | 'kmp' | 'kotlin' | 'java'\n | 'node' | 'typescript' | 'react' | 'next'\n | 'python' | 'rust' | 'swift' | 'go' | 'flutter'\n | 'unknown';\n\nexport function detectProjectType(dir: string): ProjectType {\n const exists = (f: string) => existsSync(join(dir, f));\n\n if (exists('build.gradle.kts') || exists('build.gradle')) {\n if (exists('composeApp') || exists('gradle.properties')) {\n try {\n const gradle = readFileSync(join(dir, 'build.gradle.kts'), 'utf-8');\n if (gradle.includes('multiplatform') || gradle.includes('KotlinMultiplatform')) return 'kmp';\n } catch { /* ignore */ }\n }\n if (exists('pom.xml')) return 'java';\n return 'kotlin';\n }\n if (exists('pubspec.yaml')) return 'flutter';\n if (exists('Package.swift')) return 'swift';\n try {\n const entries = readdirSync(dir);\n if (entries.some(e => e.endsWith('.xcodeproj'))) return 'swift';\n } catch { /* ignore */ }\n if (exists('Cargo.toml')) return 'rust';\n if (exists('go.mod')) return 'go';\n if (exists('pyproject.toml') || exists('setup.py') || exists('requirements.txt')) return 'python';\n if (exists('package.json')) {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (allDeps['next']) return 'next';\n if (allDeps['react']) return 'react';\n if (allDeps['typescript'] || exists('tsconfig.json')) return 'typescript';\n } catch { /* ignore */ }\n return 'node';\n }\n if (exists('pom.xml')) return 'java';\n return 'unknown';\n}\n\nexport function detectProjectName(dir: string): string {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));\n if (pkg.name) return pkg.name;\n } catch { /* ignore */ }\n return basename(resolve(dir));\n}\n\nexport function detectMainBranch(dir: string): string {\n try {\n const ref = execSync('git symbolic-ref refs/remotes/origin/HEAD', {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n return ref.split('/').pop() ?? 'main';\n } catch { /* ignore */ }\n\n try {\n const branch = execSync('git branch --show-current', {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n if (branch) return branch;\n } catch { /* ignore */ }\n\n return 'main';\n}\n","import type { ProjectType } from \"./detect.js\";\n\ninterface TaskPrompt {\n title: string;\n prompt: string;\n priority: number;\n}\n\nconst COMMON_TASKS: TaskPrompt[] = [\n {\n title: \"Fix TODOs\",\n prompt:\n \"Scan for TODO, FIXME, HACK comments. Fix the most impactful ones. Run tests to verify.\",\n priority: 1,\n },\n {\n title: \"Update dependencies\",\n prompt:\n \"Check for outdated dependencies. Update patch/minor versions that are safe. Run tests after updating.\",\n priority: 2,\n },\n {\n title: \"Improve test coverage\",\n prompt:\n \"Find untested public functions. Write tests for the most critical ones. Target 80%+ coverage.\",\n priority: 3,\n },\n {\n title: \"Fix lint warnings\",\n prompt:\n \"Run the project linter. Fix all warnings without changing behavior. Run tests.\",\n priority: 4,\n },\n {\n title: \"Improve documentation\",\n prompt:\n \"Review README and code docs. Add missing JSDoc/KDoc for public APIs. Update outdated sections.\",\n priority: 5,\n },\n {\n title: \"Security audit\",\n prompt:\n \"Check for common security issues: hardcoded secrets, SQL injection, XSS, insecure defaults. Fix any found.\",\n priority: 6,\n },\n];\n\nconst TYPE_TASKS: Partial<Record<ProjectType, TaskPrompt[]>> = {\n kmp: [\n {\n title: \"KMP: Optimize Compose\",\n prompt:\n \"Review Compose UI code for recomposition issues. Add @Stable/@Immutable where needed. Check remember usage.\",\n priority: 2,\n },\n {\n title: \"KMP: Check expect/actual\",\n prompt:\n \"Review expect/actual declarations. Ensure all platforms have proper implementations. Check for missing iOS/Desktop actuals.\",\n priority: 3,\n },\n {\n title: \"KMP: Room migrations\",\n prompt:\n \"Check Room database schema. Ensure migrations are defined for schema changes. Add missing migration tests.\",\n priority: 4,\n },\n ],\n typescript: [\n {\n title: \"TS: Strict type safety\",\n prompt:\n \"Find `any` types and loose assertions. Replace with proper types. Enable stricter tsconfig options if safe.\",\n priority: 2,\n },\n ],\n react: [\n {\n title: \"React: Performance\",\n prompt:\n \"Find unnecessary re-renders. Add React.memo, useMemo, useCallback where beneficial. Check bundle size.\",\n priority: 2,\n },\n ],\n python: [\n {\n title: \"Python: Type hints\",\n prompt:\n \"Add type hints to public functions. Run mypy to check type safety. Fix any type errors.\",\n priority: 2,\n },\n ],\n node: [\n {\n title: \"Node: Error handling\",\n prompt:\n \"Review async error handling. Add try/catch for unhandled promises. Check for missing error middleware.\",\n priority: 2,\n },\n ],\n};\n\nexport function getTasksForProject(type: ProjectType): TaskPrompt[] {\n const specific = TYPE_TASKS[type] ?? [];\n return [...specific, ...COMMON_TASKS].sort(\n (a, b) => a.priority - b.priority,\n );\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst LOCK_BASE = join(homedir(), '.copilot', 'locks');\n\nfunction lockDir(name: string): string {\n return join(LOCK_BASE, `${name}.lock`);\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function acquireLock(name: string, timeoutMs = 30_000): boolean {\n mkdirSync(LOCK_BASE, { recursive: true });\n const dir = lockDir(name);\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n try {\n mkdirSync(dir);\n // Lock acquired — write metadata\n writeFileSync(join(dir, 'pid'), String(process.pid));\n writeFileSync(join(dir, 'acquired'), new Date().toISOString());\n return true;\n } catch {\n // Lock dir exists — check if holder is still alive\n try {\n const holderPid = parseInt(readFileSync(join(dir, 'pid'), 'utf-8').trim(), 10);\n if (!isPidAlive(holderPid)) {\n // Stale lock — break it\n rmSync(dir, { recursive: true, force: true });\n continue;\n }\n } catch {\n // Can't read pid file — try breaking\n rmSync(dir, { recursive: true, force: true });\n continue;\n }\n // Holder is alive — wait and retry\n const waitMs = Math.min(500, deadline - Date.now());\n if (waitMs > 0) {\n const start = Date.now();\n while (Date.now() - start < waitMs) { /* spin wait */ }\n }\n }\n }\n return false;\n}\n\nexport function releaseLock(name: string): void {\n const dir = lockDir(name);\n try {\n rmSync(dir, { recursive: true, force: true });\n } catch { /* already released */ }\n}\n\nexport async function withLock<T>(name: string, fn: () => T | Promise<T>): Promise<T> {\n if (!acquireLock(name)) {\n throw new Error(`Failed to acquire lock: ${name}`);\n }\n try {\n return await fn();\n } finally {\n releaseLock(name);\n }\n}\n","import { execSync } from \"node:child_process\";\n\nexport function gitBranch(cwd: string): string {\n try {\n return execSync(\"git rev-parse --abbrev-ref HEAD\", {\n cwd,\n encoding: \"utf-8\",\n }).trim();\n } catch {\n return \"unknown\";\n }\n}\n\nexport function gitStatus(cwd: string): string {\n try {\n return execSync(\"git status --porcelain\", {\n cwd,\n encoding: \"utf-8\",\n }).trim();\n } catch {\n return \"\";\n }\n}\n\nexport function gitStash(cwd: string): void {\n execSync(\"git stash push -m 'copilot-agent auto-stash'\", {\n cwd,\n stdio: \"ignore\",\n });\n}\n\nexport function gitCheckout(cwd: string, branch: string): void {\n execSync(`git checkout -B ${branch}`, { cwd, stdio: \"ignore\" });\n}\n\nexport function gitIsRepo(cwd: string): boolean {\n try {\n execSync(\"git rev-parse --git-dir\", { cwd, stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { detectProjectType, detectProjectName } from \"../lib/detect.js\";\nimport { getTasksForProject } from \"../lib/tasks.js\";\nimport { runCopilotTask, assertCopilot } from \"../lib/process.js\";\nimport { withLock } from \"../lib/lock.js\";\nimport { log, ok, warn, fail, setLogFile, notify } from \"../lib/logger.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface OvernightOptions {\n until: string; // HH:MM\n steps: number;\n maxPremium: number;\n dryRun: boolean;\n}\n\nexport async function overnightCommand(\n dir: string,\n opts: OvernightOptions,\n): Promise<void> {\n assertCopilot();\n\n const ts = new Date().toISOString().replace(/[:.]/g, \"\").slice(0, 15);\n const logPath = join(\n homedir(),\n \".copilot\",\n \"auto-resume-logs\",\n `overnight-${ts}.log`,\n );\n setLogFile(logPath);\n\n const deadline = parseDeadline(opts.until);\n const name = detectProjectName(dir);\n const projectType = detectProjectType(dir);\n\n log(`Overnight runner for ${chalk.cyan(name)} (${projectType})`);\n log(`Deadline: ${opts.until} (${msToHuman(deadline - Date.now())} from now)`);\n log(`Max premium: ${opts.maxPremium}, Steps: ${opts.steps}`);\n log(`Log: ${logPath}`);\n\n if (opts.dryRun) {\n const tasks = getTasksForProject(projectType);\n log(`\\nWould run ${tasks.length} tasks:`);\n for (const t of tasks) console.log(` ${chalk.dim(\"•\")} ${t.title}`);\n return;\n }\n\n const tasks = getTasksForProject(projectType);\n let taskIdx = 0;\n let totalPremium = 0;\n let completedTasks = 0;\n let cycle = 0;\n\n while (Date.now() < deadline) {\n if (totalPremium >= opts.maxPremium) {\n warn(`Premium budget exhausted: ${totalPremium}/${opts.maxPremium}`);\n break;\n }\n\n const task = tasks[taskIdx % tasks.length];\n cycle++;\n taskIdx++;\n\n log(`\\n${\"═\".repeat(60)}`);\n log(\n `Cycle ${cycle} | Task: ${chalk.bold(task.title)} | Premium: ${totalPremium}/${opts.maxPremium}`,\n );\n log(`Time remaining: ${msToHuman(deadline - Date.now())}`);\n log(`${\"═\".repeat(60)}`);\n\n const spinner = ora(`Running: ${task.title}…`).start();\n\n try {\n const result = await withLock(\"copilot-overnight\", () =>\n runCopilotTask(task.prompt, opts.steps),\n );\n spinner.stop();\n\n totalPremium += result.premium;\n completedTasks++;\n ok(\n `${task.title} — exit ${result.exitCode}, premium: ${result.premium}`,\n );\n } catch (err) {\n spinner.stop();\n fail(`Task failed: ${err}`);\n }\n\n // Cooldown between tasks\n if (Date.now() < deadline) {\n log(\"Cooldown 30s…\");\n await sleep(30_000);\n }\n }\n\n const summary = `Overnight done. ${completedTasks} tasks, ${totalPremium} premium.`;\n log(summary);\n notify(summary, name);\n}\n\nfunction parseDeadline(hhmm: string): number {\n const [h, m] = hhmm.split(\":\").map(Number);\n const now = new Date();\n const target = new Date(now);\n target.setHours(h, m, 0, 0);\n if (target <= now) target.setDate(target.getDate() + 1);\n return target.getTime();\n}\n\nfunction msToHuman(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import chalk from \"chalk\";\nimport { runCopilotTask, assertCopilot } from \"../lib/process.js\";\nimport { withLock } from \"../lib/lock.js\";\nimport { log, ok, fail, notify } from \"../lib/logger.js\";\n\nexport interface ResearchOptions {\n steps: number;\n}\n\nconst RESEARCH_PROMPTS = [\n {\n title: \"Dependency updates\",\n prompt:\n \"Research the latest versions of all dependencies. Check changelogs for breaking changes. Create a summary of what can be safely updated.\",\n },\n {\n title: \"Performance review\",\n prompt:\n \"Profile the application for performance bottlenecks. Check startup time, memory usage, and hot paths. Suggest optimizations with benchmarks.\",\n },\n {\n title: \"Architecture review\",\n prompt:\n \"Review the project architecture. Check for code smells, circular dependencies, and coupling issues. Suggest improvements following clean architecture.\",\n },\n {\n title: \"Accessibility audit\",\n prompt:\n \"Audit the UI for accessibility issues. Check color contrast, screen reader support, and keyboard navigation. Create a report.\",\n },\n {\n title: \"Best practices\",\n prompt:\n \"Compare the codebase against current best practices for this framework/language. Identify gaps and suggest improvements.\",\n },\n];\n\nexport async function researchCommand(\n topic: string | undefined,\n opts: ResearchOptions,\n): Promise<void> {\n assertCopilot();\n\n if (topic) {\n log(`Research topic: ${chalk.cyan(topic)}`);\n const result = await withLock(\"copilot-research\", () =>\n runCopilotTask(\n `Research the following topic and create a detailed report: ${topic}`,\n opts.steps,\n ),\n );\n ok(`Research complete — premium: ${result.premium}`);\n notify(\"Research complete\", topic.slice(0, 30));\n return;\n }\n\n log(\"Running predefined research tasks…\");\n for (const r of RESEARCH_PROMPTS) {\n log(`\\n${chalk.bold(r.title)}`);\n try {\n const result = await withLock(\"copilot-research\", () =>\n runCopilotTask(r.prompt, opts.steps),\n );\n ok(`${r.title} — premium: ${result.premium}`);\n } catch (err) {\n fail(`${r.title} failed: ${err}`);\n }\n }\n notify(\"All research tasks complete\");\n}\n"],"mappings":";;;AACA,SAAS,eAAe;;;ACDxB,OAAO,WAAW;;;ACAlB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,MAAM,eAAe;AAC9B,SAAS,eAAe;AAaxB,IAAM,cAAc,KAAK,QAAQ,GAAG,YAAY,eAAe;AAMxD,SAAS,gBAAgB,KAAsB;AACpD,QAAM,SAAS,KAAK,aAAa,KAAK,cAAc;AACpD,MAAI;AACF,WAAO,WAAW,MAAM,KAAK,SAAS,MAAM,EAAE,OAAO;AAAA,EACvD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,QAAQ,IAAe;AAClD,MAAI,CAAC,WAAW,WAAW,EAAG,QAAO,CAAC;AAEtC,QAAM,UAAU,YAAY,aAAa,EAAE,eAAe,KAAK,CAAC,EAC7D,OAAO,OAAK,EAAE,YAAY,CAAC;AAE9B,QAAM,OAAqD,CAAC;AAC5D,aAAW,SAAS,SAAS;AAC3B,UAAM,UAAU,KAAK,aAAa,MAAM,IAAI;AAC5C,QAAI,CAAC,WAAW,KAAK,SAAS,cAAc,CAAC,EAAG;AAChD,QAAI;AACF,YAAM,OAAO,SAAS,OAAO;AAC7B,WAAK,KAAK,EAAE,IAAI,MAAM,MAAM,KAAK,SAAS,OAAO,KAAK,QAAQ,CAAC;AAAA,IACjE,QAAQ;AAAA,IAAa;AAAA,EACvB;AAEA,OAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAErC,SAAO,KAAK,MAAM,GAAG,KAAK,EAAE,IAAI,QAAM;AAAA,IACpC,IAAI,EAAE;AAAA,IACN,KAAK,EAAE;AAAA,IACP,OAAO,EAAE;AAAA,IACT,WAAW,aAAa,EAAE,EAAE;AAAA,IAC5B,iBAAiB,kBAAkB,EAAE,EAAE;AAAA,IACvC,SAAS,kBAAkB,EAAE,EAAE;AAAA,IAC/B,KAAK,cAAc,EAAE,EAAE;AAAA,IACvB,UAAU,gBAAgB,EAAE,EAAE;AAAA,EAChC,EAAE;AACJ;AAEO,SAAS,qBAAoC;AAClD,MAAI,CAAC,WAAW,WAAW,EAAG,QAAO;AAErC,QAAM,UAAU,YAAY,aAAa,EAAE,eAAe,KAAK,CAAC,EAC7D,OAAO,OAAK,EAAE,YAAY,CAAC;AAE9B,MAAI,SAA+C;AACnD,aAAW,SAAS,SAAS;AAC3B,QAAI;AACF,YAAM,OAAO,SAAS,KAAK,aAAa,MAAM,IAAI,CAAC;AACnD,UAAI,CAAC,UAAU,KAAK,UAAU,OAAO,OAAO;AAC1C,iBAAS,EAAE,IAAI,MAAM,MAAM,OAAO,KAAK,QAAQ;AAAA,MACjD;AAAA,IACF,QAAQ;AAAA,IAAa;AAAA,EACvB;AACA,SAAO,QAAQ,MAAM;AACvB;AAEO,SAAS,gBAAgB,KAAsB;AACpD,MAAI,CAAC,gBAAgB,GAAG,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,UAAU,aAAa,KAAK,aAAa,KAAK,cAAc,GAAG,OAAO;AAC5E,WAAO,QAAQ,SAAS,yBAAyB;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,KAAqB;AAChD,MAAI,CAAC,gBAAgB,GAAG,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,QAAQ,aAAa,KAAK,aAAa,KAAK,cAAc,GAAG,OAAO,EACvE,QAAQ,EACR,MAAM,IAAI;AACb,UAAM,OAAO,KAAK,MAAM,MAAM,MAAM,SAAS,CAAC,CAAC;AAC/C,WAAO,KAAK,QAAQ;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,KAAqB;AACrD,MAAI,CAAC,gBAAgB,GAAG,EAAG,QAAO;AAClC,MAAI;AACF,UAAM,UAAU,aAAa,KAAK,aAAa,KAAK,cAAc,GAAG,OAAO;AAC5E,UAAM,QAAQ,QAAQ,QAAQ,EAAE,MAAM,IAAI;AAC1C,aAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,MAAM,CAAC,CAAC;AACjC,YAAI,MAAM,SAAS,sBAAsB,MAAM,MAAM,wBAAwB,MAAM;AACjF,iBAAO,MAAM,KAAK;AAAA,QACpB;AAAA,MACF,QAAQ;AAAA,MAA4B;AAAA,IACtC;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,SAAyC;AAChE,QAAM,SAAiC,CAAC;AACxC,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,MAAM,KAAK,QAAQ,IAAI;AAC7B,QAAI,QAAQ,GAAI;AAChB,UAAM,MAAM,KAAK,UAAU,GAAG,GAAG,EAAE,KAAK;AACxC,UAAM,QAAQ,KAAK,UAAU,MAAM,CAAC,EAAE,KAAK;AAC3C,QAAI,IAAK,QAAO,GAAG,IAAI;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAAqC;AAC1D,QAAM,SAAS,KAAK,aAAa,KAAK,gBAAgB;AACtD,MAAI,CAAC,WAAW,MAAM,EAAG,QAAO,CAAC;AACjC,MAAI;AACF,WAAO,gBAAgB,aAAa,QAAQ,OAAO,CAAC;AAAA,EACtD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,kBAAkB,KAAqB;AACrD,SAAO,cAAc,GAAG,EAAE,WAAW;AACvC;AAEO,SAAS,cAAc,KAAqB;AACjD,SAAO,cAAc,GAAG,EAAE,OAAO;AACnC;AAWO,SAAS,uBAAsC;AACpD,QAAM,WAAW,aAAa,EAAE;AAChC,aAAW,KAAK,UAAU;AACxB,QAAI,CAAC,EAAE,SAAU,QAAO,EAAE;AAAA,EAC5B;AACA,SAAO;AACT;;;AC1KA,SAAS,YAAAA,WAAU,aAAa;;;ACAhC,SAAS,gBAAgB,iBAAiB;AAC1C,SAAS,eAAe;AACxB,SAAS,gBAAgB;;;ACFlB,IAAM,MAAM;AACZ,IAAM,QAAQ;AACd,IAAM,SAAS;AAKf,IAAM,QAAQ;;;ADFrB,IAAI,cAA6B;AAEjC,IAAM,UACJ;AAEF,SAAS,UAAU,GAAmB;AACpC,SAAO,EAAE,QAAQ,SAAS,EAAE;AAC9B;AAEA,SAAS,YAAY,KAAmB;AACtC,MAAI,CAAC,YAAa;AAClB,MAAI;AACF,mBAAe,aAAa,UAAU,GAAG,IAAI,IAAI;AAAA,EACnD,QAAQ;AAAA,EAAiC;AAC3C;AAEO,SAAS,WAAW,MAAoB;AAC7C,YAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,gBAAc;AAChB;AAEO,SAAS,IAAI,KAAmB;AACrC,UAAQ,IAAI,GAAG;AACf,cAAY,GAAG;AACjB;AAEO,SAAS,KAAK,KAAmB;AACtC,QAAM,MAAM,GAAG,MAAM,UAAK,GAAG,GAAG,KAAK;AACrC,UAAQ,IAAI,GAAG;AACf,cAAY,UAAK,GAAG,EAAE;AACxB;AAEO,SAAS,GAAG,KAAmB;AACpC,QAAM,MAAM,GAAG,KAAK,UAAK,GAAG,GAAG,KAAK;AACpC,UAAQ,IAAI,GAAG;AACf,cAAY,UAAK,GAAG,EAAE;AACxB;AAEO,SAAS,KAAK,KAAmB;AACtC,QAAM,MAAM,GAAG,GAAG,UAAK,GAAG,GAAG,KAAK;AAClC,UAAQ,MAAM,GAAG;AACjB,cAAY,UAAK,GAAG,EAAE;AACxB;AAcO,SAAS,OAAO,SAAiB,QAAQ,iBAAuB;AACrE,MAAI;AACF,QAAI,QAAQ,aAAa,UAAU;AACjC;AAAA,QACE,uCAAuC,QAAQ,QAAQ,MAAM,KAAK,CAAC,iBAAiB,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QAC9G,EAAE,OAAO,SAAS;AAAA,MACpB;AAAA,IACF,OAAO;AACL,UAAI;AACF,iBAAS,qBAAqB,EAAE,OAAO,OAAO,CAAC;AAC/C;AAAA,UACE,gBAAgB,KAAK,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC;AAAA,UACvD,EAAE,OAAO,SAAS;AAAA,QACpB;AAAA,MACF,QAAQ;AAAA,MAAkC;AAAA,IAC5C;AAAA,EACF,QAAQ;AAAA,EAAmC;AAC7C;;;AD9DO,SAAS,qBAA8B;AAC5C,MAAI;AACF,IAAAC,UAAS,iBAAiB,EAAE,OAAO,QAAQ,UAAU,QAAQ,CAAC;AAC9D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAsB;AACpC,MAAI,CAAC,mBAAmB,GAAG;AACzB,SAAK,mEAAmE;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,SAAS,uBAAyC;AACvD,MAAI;AACF,UAAM,SAASA,UAAS,sBAAsB,EAAE,UAAU,QAAQ,CAAC;AACnE,UAAM,UAA4B,CAAC;AACnC,eAAW,QAAQ,OAAO,MAAM,IAAI,GAAG;AACrC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS;AACd,WACG,QAAQ,SAAS,SAAS,KAAK,QAAQ,SAAS,qBAAqB,MACtE,CAAC,QAAQ,SAAS,QAAQ,KAC1B,CAAC,QAAQ,SAAS,eAAe,KACjC,CAAC,QAAQ,SAAS,MAAM,GACxB;AACA,cAAM,QAAQ,QAAQ,MAAM,gBAAgB;AAC5C,YAAI,OAAO;AACT,gBAAM,MAAM,MAAM,CAAC;AACnB,gBAAM,WAAW,IAAI,MAAM,4BAA4B;AACvD,kBAAQ,KAAK;AAAA,YACX,KAAK,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,YAC1B,SAAS;AAAA,YACT,WAAW,WAAW,CAAC;AAAA,UACzB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,kBAAkB,KAA4B;AAC5D,QAAM,QAAQ,qBAAqB;AACnC,QAAM,WAAW,MACd,OAAO,OAAK,EAAE,QAAQ,SAAS,GAAG,CAAC,EACnC,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG;AAC/B,SAAO,SAAS,CAAC,GAAG,OAAO;AAC7B;AAEA,eAAsB,YAAY,KAAa,YAAY,OAA8B;AACvF,QAAM,QAAQ,KAAK,IAAI;AACvB,SAAO,KAAK,IAAI,IAAI,QAAQ,WAAW;AACrC,QAAI;AACF,cAAQ,KAAK,KAAK,CAAC;AACnB,YAAM,MAAM,GAAI;AAAA,IAClB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,WACd,MACA,SACwB;AACxB,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,UAAM,QAAQ,MAAM,WAAW,MAAM;AAAA,MACnC,KAAK,SAAS;AAAA,MACd,OAAO;AAAA,MACP,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,IACxB,CAAC;AAED,UAAM,GAAG,SAAS,OAAO,SAAS;AAChC,YAAM,MAAM,GAAI;AAChB,YAAM,MAAM,mBAAmB;AAC/B,YAAM,UAAU,MAAM,kBAAkB,GAAG,IAAI;AAC/C,MAAAA,SAAQ;AAAA,QACN,UAAU,QAAQ;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,UAAM,GAAG,SAAS,MAAM;AACtB,MAAAA,SAAQ,EAAE,UAAU,GAAG,WAAW,MAAM,SAAS,EAAE,CAAC;AAAA,IACtD,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,iBACd,KACA,OACA,SACA,KACwB;AACxB,QAAM,OAAO;AAAA,IACX,YAAY,GAAG;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,IACZ;AAAA,EACF;AACA,MAAI,QAAS,MAAK,KAAK,MAAM,OAAO;AACpC,SAAO,WAAW,MAAM,EAAE,IAAI,CAAC;AACjC;AAEO,SAAS,eACd,QACA,OACA,KACwB;AACxB,SAAO,WAAW;AAAA,IAChB;AAAA,IAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IAA6B,OAAO,KAAK;AAAA,IACzC;AAAA,EACF,GAAG,EAAE,IAAI,CAAC;AACZ;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,OAAK,WAAW,GAAG,EAAE,CAAC;AAC3C;;;AFnIA,eAAsB,cAAc,MAAoC;AACtE,MAAI,KAAK,QAAQ;AACf,WAAO,WAAW;AAAA,EACpB;AACA,aAAW,KAAK,KAAK;AACvB;AAEA,eAAe,aAA4B;AACzC,QAAM,QAAQ,MAAM,qBAAqB;AACzC,MAAI,MAAM,WAAW,GAAG;AACtB,QAAI,8BAA8B;AAClC;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,MAAM;AAAA,MACJ;AAAA,EAAK,MAAM,OAAO,CAAC,CAAC,IAAI,UAAU,OAAO,EAAE,CAAC,IAAI,UAAU,MAAM,GAAG,EAAE,CAAC;AAAA,IACxE;AAAA,EACF;AACA,UAAQ,IAAI,SAAI,OAAO,GAAG,CAAC;AAE3B,aAAW,KAAK,OAAO;AACrB,YAAQ;AAAA,MACN,GAAG,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,aAAa,UAAK,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,IAAI,MAAM,GAAG,EAAE,CAAC;AAAA,IACjG;AAAA,EACF;AACA,UAAQ,IAAI;AACd;AAEA,SAAS,WAAW,OAAqB;AACvC,QAAM,WAAW,aAAa,KAAK;AACnC,MAAI,SAAS,WAAW,GAAG;AACzB,QAAI,oBAAoB;AACxB;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,MAAM;AAAA,MACJ;AAAA,EAAK,SAAS,OAAO,EAAE,CAAC,IAAI,UAAU,OAAO,EAAE,CAAC,IAAI,aAAa,OAAO,EAAE,CAAC,IAAI,UAAU,OAAO,EAAE,CAAC,IAAI,IAAI;AAAA,IAC7G;AAAA,EACF;AACA,UAAQ,IAAI,SAAI,OAAO,GAAG,CAAC;AAE3B,aAAW,KAAK,UAAU;AACxB,UAAM,OAAO,gBAAgB,EAAE,EAAE;AACjC,UAAM,SAAS,OACX,MAAM,MAAM,aAAQ,IACpB,MAAM,OAAO,uBAAa;AAC9B,UAAM,UAAU,OAAO,kBAAkB,EAAE,EAAE,CAAC;AAC9C,UAAM,UAAU,aAAa,EAAE,EAAE;AACjC,UAAM,WAAW,EAAE,WAAW,UAAK,MAAM,GAAG,EAAE;AAE9C,YAAQ;AAAA,MACN,GAAG,OAAO,OAAO,EAAE,CAAC,IAAI,QAAQ,OAAO,EAAE,CAAC,IAAI,QAAQ,OAAO,EAAE,CAAC,IAAI,QAAQ,OAAO,EAAE,CAAC,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;AAAA,IAC3G;AAAA,EACF;AACA,UAAQ,IAAI;AACd;;;AKxEA,OAAOC,YAAW;AAClB,OAAO,SAAS;AAsBhB,eAAsB,aACpB,KACA,MACe;AACf,gBAAc;AAEd,MAAI,CAAC,KAAK;AACR,UAAM,qBAAqB,KAAK;AAChC,QAAI,CAAC,KAAK;AACR,WAAK,8BAA8B;AACnC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,qCAAqCC,OAAM,KAAK,GAAG,CAAC,EAAE;AAAA,EAC5D;AAEA,MAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,SAAK,oBAAoB,GAAG,EAAE;AAC9B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,gBAAgB,GAAG,GAAG;AACxB,OAAG,WAAW,GAAG,qBAAqB;AACtC;AAAA,EACF;AAEA,MAAI,UAAU;AAEd,SAAO,UAAU,KAAK,YAAY;AAChC,UAAM,MAAM,MAAM,kBAAkB,GAAG;AAEvC,QAAI,KAAK;AACP,YAAM,UAAU;AAAA,QACd,gBAAgB,GAAG,gBAAgBA,OAAM,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;AAAA,MAChE,EAAE,MAAM;AACR,YAAM,SAAS,MAAM,YAAY,GAAG;AACpC,cAAQ,KAAK;AAEb,UAAI,CAAC,QAAQ;AACX,aAAK,mCAAmC;AACxC;AAAA,MACF;AAAA,IACF;AAGA,UAAMC,OAAM,GAAI;AAEhB,QAAI,gBAAgB,GAAG,GAAG;AACxB;AAAA,QACE,2BAA2B,kBAAkB,GAAG,KAAK,MAAM;AAAA,MAC7D;AACA,aAAO,mBAAmB,WAAW,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE;AACtD;AAAA,IACF;AAGA;AACA;AAAA,MACE,wBAAwB,aAAa,GAAG,CAAC,aAAa,OAAO,IAAI,KAAK,UAAU;AAAA,IAClF;AAEA,UAAM,SAAS,MAAM,iBAAiB,KAAK,KAAK,OAAO,KAAK,OAAO;AACnE,QAAI,OAAO,aAAa,OAAO,cAAc,KAAK;AAChD,UAAI,wBAAwBD,OAAM,KAAK,OAAO,SAAS,CAAC,EAAE;AAC1D,YAAM,OAAO;AAAA,IACf;AAAA,EACF;AAEA,OAAK,gBAAgB,KAAK,UAAU,YAAY;AAChD,SAAO,uBAAuB,WAAW,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE;AAC5D;AAEA,SAASC,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC7C;;;AChGA,OAAOC,YAAW;AAClB,OAAOC,UAAS;;;ACDhB,SAAS,cAAAC,aAAY,gBAAAC,eAAc,eAAAC,oBAAmB;AACtD,SAAS,QAAAC,OAAM,UAAU,WAAAC,gBAAe;AACxC,SAAS,YAAAC,iBAAgB;AAQlB,SAAS,kBAAkB,KAA0B;AAC1D,QAAM,SAAS,CAAC,MAAcL,YAAWG,MAAK,KAAK,CAAC,CAAC;AAErD,MAAI,OAAO,kBAAkB,KAAK,OAAO,cAAc,GAAG;AACxD,QAAI,OAAO,YAAY,KAAK,OAAO,mBAAmB,GAAG;AACvD,UAAI;AACF,cAAM,SAASF,cAAaE,MAAK,KAAK,kBAAkB,GAAG,OAAO;AAClE,YAAI,OAAO,SAAS,eAAe,KAAK,OAAO,SAAS,qBAAqB,EAAG,QAAO;AAAA,MACzF,QAAQ;AAAA,MAAe;AAAA,IACzB;AACA,QAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,cAAc,EAAG,QAAO;AACnC,MAAI,OAAO,eAAe,EAAG,QAAO;AACpC,MAAI;AACF,UAAM,UAAUD,aAAY,GAAG;AAC/B,QAAI,QAAQ,KAAK,OAAK,EAAE,SAAS,YAAY,CAAC,EAAG,QAAO;AAAA,EAC1D,QAAQ;AAAA,EAAe;AACvB,MAAI,OAAO,YAAY,EAAG,QAAO;AACjC,MAAI,OAAO,QAAQ,EAAG,QAAO;AAC7B,MAAI,OAAO,gBAAgB,KAAK,OAAO,UAAU,KAAK,OAAO,kBAAkB,EAAG,QAAO;AACzF,MAAI,OAAO,cAAc,GAAG;AAC1B,QAAI;AACF,YAAM,MAAM,KAAK,MAAMD,cAAaE,MAAK,KAAK,cAAc,GAAG,OAAO,CAAC;AACvE,YAAM,UAAU,EAAE,GAAG,IAAI,cAAc,GAAG,IAAI,gBAAgB;AAC9D,UAAI,QAAQ,MAAM,EAAG,QAAO;AAC5B,UAAI,QAAQ,OAAO,EAAG,QAAO;AAC7B,UAAI,QAAQ,YAAY,KAAK,OAAO,eAAe,EAAG,QAAO;AAAA,IAC/D,QAAQ;AAAA,IAAe;AACvB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,SAAO;AACT;AAEO,SAAS,kBAAkB,KAAqB;AACrD,MAAI;AACF,UAAM,MAAM,KAAK,MAAMF,cAAaE,MAAK,KAAK,cAAc,GAAG,OAAO,CAAC;AACvE,QAAI,IAAI,KAAM,QAAO,IAAI;AAAA,EAC3B,QAAQ;AAAA,EAAe;AACvB,SAAO,SAASC,SAAQ,GAAG,CAAC;AAC9B;;;AC5CA,IAAM,eAA6B;AAAA,EACjC;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,IACF,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,IACF,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,IACF,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,IACF,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,IACF,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,IACF,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,aAAyD;AAAA,EAC7D,KAAK;AAAA,IACH;AAAA,MACE,OAAO;AAAA,MACP,QACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,QACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,QACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,MACE,OAAO;AAAA,MACP,QACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,QACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,MACE,OAAO;AAAA,MACP,QACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ;AAAA,MACE,OAAO;AAAA,MACP,QACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,MAAiC;AAClE,QAAM,WAAW,WAAW,IAAI,KAAK,CAAC;AACtC,SAAO,CAAC,GAAG,UAAU,GAAG,YAAY,EAAE;AAAA,IACpC,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE;AAAA,EAC3B;AACF;;;AC3GA,SAAqB,aAAAE,YAAW,gBAAAC,eAAc,QAAQ,qBAAqB;AAC3E,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAExB,IAAM,YAAYD,MAAKC,SAAQ,GAAG,YAAY,OAAO;AAErD,SAAS,QAAQ,MAAsB;AACrC,SAAOD,MAAK,WAAW,GAAG,IAAI,OAAO;AACvC;AAEA,SAAS,WAAW,KAAsB;AACxC,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,YAAY,MAAc,YAAY,KAAiB;AACrE,EAAAF,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,QAAI;AACF,MAAAA,WAAU,GAAG;AAEb,oBAAcE,MAAK,KAAK,KAAK,GAAG,OAAO,QAAQ,GAAG,CAAC;AACnD,oBAAcA,MAAK,KAAK,UAAU,IAAG,oBAAI,KAAK,GAAE,YAAY,CAAC;AAC7D,aAAO;AAAA,IACT,QAAQ;AAEN,UAAI;AACF,cAAM,YAAY,SAASD,cAAaC,MAAK,KAAK,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,EAAE;AAC7E,YAAI,CAAC,WAAW,SAAS,GAAG;AAE1B,iBAAO,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC5C;AAAA,QACF;AAAA,MACF,QAAQ;AAEN,eAAO,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC5C;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,IAAI,KAAK,WAAW,KAAK,IAAI,CAAC;AAClD,UAAI,SAAS,GAAG;AACd,cAAM,QAAQ,KAAK,IAAI;AACvB,eAAO,KAAK,IAAI,IAAI,QAAQ,QAAQ;AAAA,QAAkB;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,YAAY,MAAoB;AAC9C,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI;AACF,WAAO,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAC9C,QAAQ;AAAA,EAAyB;AACnC;AAEA,eAAsB,SAAY,MAAc,IAAsC;AACpF,MAAI,CAAC,YAAY,IAAI,GAAG;AACtB,UAAM,IAAI,MAAM,2BAA2B,IAAI,EAAE;AAAA,EACnD;AACA,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,UAAE;AACA,gBAAY,IAAI;AAAA,EAClB;AACF;;;ACxEA,SAAS,YAAAE,iBAAgB;AAElB,SAAS,UAAU,KAAqB;AAC7C,MAAI;AACF,WAAOA,UAAS,mCAAmC;AAAA,MACjD;AAAA,MACA,UAAU;AAAA,IACZ,CAAC,EAAE,KAAK;AAAA,EACV,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAU,KAAqB;AAC7C,MAAI;AACF,WAAOA,UAAS,0BAA0B;AAAA,MACxC;AAAA,MACA,UAAU;AAAA,IACZ,CAAC,EAAE,KAAK;AAAA,EACV,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,SAAS,KAAmB;AAC1C,EAAAA,UAAS,gDAAgD;AAAA,IACvD;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,YAAY,KAAa,QAAsB;AAC7D,EAAAA,UAAS,mBAAmB,MAAM,IAAI,EAAE,KAAK,OAAO,SAAS,CAAC;AAChE;AAEO,SAAS,UAAU,KAAsB;AAC9C,MAAI;AACF,IAAAA,UAAS,2BAA2B,EAAE,KAAK,OAAO,SAAS,CAAC;AAC5D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AJ3BA,eAAsB,WACpB,KACA,MACe;AACf,gBAAc;AAEd,QAAM,cAAc,kBAAkB,GAAG;AACzC,QAAM,OAAO,kBAAkB,GAAG;AAClC,MAAI,YAAYC,OAAM,KAAK,IAAI,CAAC,KAAK,WAAW,GAAG;AAEnD,QAAM,QAAQ,mBAAmB,WAAW,EAAE,MAAM,GAAG,KAAK,QAAQ;AAEpE,MAAI,MAAM,WAAW,GAAG;AACtB,SAAK,uCAAuC;AAC5C;AAAA,EACF;AAEA,MAAI,SAAS,MAAM,MAAM,SAAS;AAClC,aAAW,KAAK,OAAO;AACrB,YAAQ,IAAI,KAAKA,OAAM,IAAI,QAAG,CAAC,IAAI,EAAE,KAAK,EAAE;AAAA,EAC9C;AAEA,MAAI,KAAK,QAAQ;AACf,QAAIA,OAAM,IAAI,gCAA2B,CAAC;AAC1C;AAAA,EACF;AAEA,QAAM,iBAAiB,UAAU,GAAG,IAAI,UAAU,GAAG,IAAI;AACzD,MAAI,YAAY;AAChB,MAAI,eAAe;AAEnB,aAAW,QAAQ,OAAO;AACxB,QAAI;AAAA,EAAK,SAAI,OAAO,EAAE,CAAC,EAAE;AACzB,QAAI,SAASA,OAAM,KAAK,KAAK,KAAK,CAAC,EAAE;AACrC,QAAI,GAAG,SAAI,OAAO,EAAE,CAAC,EAAE;AAGvB,QAAI,kBAAkB,UAAU,GAAG,GAAG;AACpC,YAAM,SAAS,iBAAiB,KAAK,MAAM,YAAY,EAAE,QAAQ,eAAe,GAAG,CAAC;AACpF,UAAI;AACF,YAAI,UAAU,GAAG,EAAG,UAAS,GAAG;AAChC,oBAAY,KAAK,MAAM;AAAA,MACzB,SAAS,GAAG;AACV,aAAK,2BAA2B,MAAM,0BAA0B;AAAA,MAClE;AAAA,IACF;AAEA,UAAM,UAAUC,KAAI,YAAY,KAAK,KAAK,QAAG,EAAE,MAAM;AAErD,UAAM,SAAS,MAAM;AAAA,MAAS;AAAA,MAAe,MAC3C,eAAe,KAAK,QAAQ,KAAK,KAAK;AAAA,IACxC;AAEA,YAAQ,KAAK;AAEb,oBAAgB,OAAO;AACvB;AACA,OAAG,GAAG,KAAK,KAAK,gBAAW,OAAO,QAAQ,cAAc,OAAO,OAAO,EAAE;AAExE,QAAI,kBAAkB,UAAU,GAAG,GAAG;AACpC,UAAI;AACF,oBAAY,KAAK,cAAc;AAAA,MACjC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AAAA,YAAe,SAAS,IAAI,MAAM,MAAM,0BAA0B,YAAY,EAAE;AACpF,SAAO,aAAa,SAAS,UAAU,IAAI;AAC7C;;;AKrFA,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAMhB,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AASxB,eAAsB,iBACpB,KACA,MACe;AACf,gBAAc;AAEd,QAAM,MAAK,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AACpE,QAAM,UAAUD;AAAA,IACdC,SAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,aAAa,EAAE;AAAA,EACjB;AACA,aAAW,OAAO;AAElB,QAAM,WAAW,cAAc,KAAK,KAAK;AACzC,QAAM,OAAO,kBAAkB,GAAG;AAClC,QAAM,cAAc,kBAAkB,GAAG;AAEzC,MAAI,wBAAwBC,OAAM,KAAK,IAAI,CAAC,KAAK,WAAW,GAAG;AAC/D,MAAI,aAAa,KAAK,KAAK,KAAK,UAAU,WAAW,KAAK,IAAI,CAAC,CAAC,YAAY;AAC5E,MAAI,gBAAgB,KAAK,UAAU,YAAY,KAAK,KAAK,EAAE;AAC3D,MAAI,QAAQ,OAAO,EAAE;AAErB,MAAI,KAAK,QAAQ;AACf,UAAMC,SAAQ,mBAAmB,WAAW;AAC5C,QAAI;AAAA,YAAeA,OAAM,MAAM,SAAS;AACxC,eAAW,KAAKA,OAAO,SAAQ,IAAI,KAAKD,OAAM,IAAI,QAAG,CAAC,IAAI,EAAE,KAAK,EAAE;AACnE;AAAA,EACF;AAEA,QAAM,QAAQ,mBAAmB,WAAW;AAC5C,MAAI,UAAU;AACd,MAAI,eAAe;AACnB,MAAI,iBAAiB;AACrB,MAAI,QAAQ;AAEZ,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,QAAI,gBAAgB,KAAK,YAAY;AACnC,WAAK,6BAA6B,YAAY,IAAI,KAAK,UAAU,EAAE;AACnE;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,UAAU,MAAM,MAAM;AACzC;AACA;AAEA,QAAI;AAAA,EAAK,SAAI,OAAO,EAAE,CAAC,EAAE;AACzB;AAAA,MACE,SAAS,KAAK,YAAYA,OAAM,KAAK,KAAK,KAAK,CAAC,eAAe,YAAY,IAAI,KAAK,UAAU;AAAA,IAChG;AACA,QAAI,mBAAmB,UAAU,WAAW,KAAK,IAAI,CAAC,CAAC,EAAE;AACzD,QAAI,GAAG,SAAI,OAAO,EAAE,CAAC,EAAE;AAEvB,UAAM,UAAUE,KAAI,YAAY,KAAK,KAAK,QAAG,EAAE,MAAM;AAErD,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QAAS;AAAA,QAAqB,MACjD,eAAe,KAAK,QAAQ,KAAK,KAAK;AAAA,MACxC;AACA,cAAQ,KAAK;AAEb,sBAAgB,OAAO;AACvB;AACA;AAAA,QACE,GAAG,KAAK,KAAK,gBAAW,OAAO,QAAQ,cAAc,OAAO,OAAO;AAAA,MACrE;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,KAAK;AACb,WAAK,gBAAgB,GAAG,EAAE;AAAA,IAC5B;AAGA,QAAI,KAAK,IAAI,IAAI,UAAU;AACzB,UAAI,oBAAe;AACnB,YAAMC,OAAM,GAAM;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,UAAU,mBAAmB,cAAc,WAAW,YAAY;AACxE,MAAI,OAAO;AACX,SAAO,SAAS,IAAI;AACtB;AAEA,SAAS,cAAc,MAAsB;AAC3C,QAAM,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AACzC,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,SAAS,IAAI,KAAK,GAAG;AAC3B,SAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAC1B,MAAI,UAAU,IAAK,QAAO,QAAQ,OAAO,QAAQ,IAAI,CAAC;AACtD,SAAO,OAAO,QAAQ;AACxB;AAEA,SAAS,UAAU,IAAoB;AACrC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAS;AACnC,QAAM,IAAI,KAAK,MAAO,KAAK,OAAa,GAAM;AAC9C,SAAO,GAAG,CAAC,KAAK,CAAC;AACnB;AAEA,SAASA,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC7C;;;ACtHA,OAAOC,YAAW;AASlB,IAAM,mBAAmB;AAAA,EACvB;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QACE;AAAA,EACJ;AACF;AAEA,eAAsB,gBACpB,OACA,MACe;AACf,gBAAc;AAEd,MAAI,OAAO;AACT,QAAI,mBAAmBC,OAAM,KAAK,KAAK,CAAC,EAAE;AAC1C,UAAM,SAAS,MAAM;AAAA,MAAS;AAAA,MAAoB,MAChD;AAAA,QACE,8DAA8D,KAAK;AAAA,QACnE,KAAK;AAAA,MACP;AAAA,IACF;AACA,OAAG,qCAAgC,OAAO,OAAO,EAAE;AACnD,WAAO,qBAAqB,MAAM,MAAM,GAAG,EAAE,CAAC;AAC9C;AAAA,EACF;AAEA,MAAI,yCAAoC;AACxC,aAAW,KAAK,kBAAkB;AAChC,QAAI;AAAA,EAAKA,OAAM,KAAK,EAAE,KAAK,CAAC,EAAE;AAC9B,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QAAS;AAAA,QAAoB,MAChD,eAAe,EAAE,QAAQ,KAAK,KAAK;AAAA,MACrC;AACA,SAAG,GAAG,EAAE,KAAK,oBAAe,OAAO,OAAO,EAAE;AAAA,IAC9C,SAAS,KAAK;AACZ,WAAK,GAAG,EAAE,KAAK,YAAY,GAAG,EAAE;AAAA,IAClC;AAAA,EACF;AACA,SAAO,6BAA6B;AACtC;;;Ab7DA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,eAAe,EACpB,YAAY,0FAAqF,EACjG,QAAQ,OAAO;AAElB,QACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC,OAAO,mBAAmB,8BAA8B,IAAI,EAC5D,OAAO,gBAAgB,qCAAqC,EAC5D,OAAO,OAAO,SAAS;AACtB,QAAM,cAAc;AAAA,IAClB,OAAO,SAAS,KAAK,KAAK;AAAA,IAC1B,QAAQ,KAAK,UAAU;AAAA,EACzB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,oBAAoB,EAC5B,YAAY,+CAA+C,EAC3D,OAAO,mBAAmB,sCAAsC,IAAI,EACpE,OAAO,yBAAyB,yBAAyB,IAAI,EAC7D,OAAO,uBAAuB,2BAA2B,EACzD,OAAO,OAAO,KAAK,SAAS;AAC3B,QAAM,aAAa,KAAK;AAAA,IACtB,OAAO,SAAS,KAAK,KAAK;AAAA,IAC1B,YAAY,SAAS,KAAK,UAAU;AAAA,IACpC,SAAS,KAAK;AAAA,EAChB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,WAAW,EACnB,YAAY,sCAAsC,EAClD,OAAO,mBAAmB,oCAAoC,IAAI,EAClE,OAAO,uBAAuB,8BAA8B,GAAG,EAC/D,OAAO,aAAa,8BAA8B,EAClD,OAAO,OAAO,KAAK,SAAS;AAC3B,QAAM,WAAW,OAAO,QAAQ,IAAI,GAAG;AAAA,IACrC,OAAO,SAAS,KAAK,KAAK;AAAA,IAC1B,UAAU,SAAS,KAAK,QAAQ;AAAA,IAChC,QAAQ,KAAK,UAAU;AAAA,EACzB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,iBAAiB,EACzB,YAAY,yCAAyC,EACrD,OAAO,uBAAuB,8BAA8B,OAAO,EACnE,OAAO,mBAAmB,oCAAoC,IAAI,EAClE,OAAO,yBAAyB,+BAA+B,KAAK,EACpE,OAAO,aAAa,6BAA6B,EACjD,OAAO,OAAO,KAAK,SAAS;AAC3B,QAAM,iBAAiB,OAAO,QAAQ,IAAI,GAAG;AAAA,IAC3C,OAAO,KAAK;AAAA,IACZ,OAAO,SAAS,KAAK,KAAK;AAAA,IAC1B,YAAY,SAAS,KAAK,UAAU;AAAA,IACpC,QAAQ,KAAK,UAAU;AAAA,EACzB,CAAC;AACH,CAAC;AAEH,QACG,QAAQ,kBAAkB,EAC1B,YAAY,2CAA2C,EACvD,OAAO,mBAAmB,2BAA2B,IAAI,EACzD,OAAO,OAAO,OAAO,SAAS;AAC7B,QAAM,gBAAgB,OAAO;AAAA,IAC3B,OAAO,SAAS,KAAK,KAAK;AAAA,EAC5B,CAAC;AACH,CAAC;AAEH,QAAQ,MAAM;","names":["execSync","execSync","resolve","chalk","chalk","sleep","chalk","ora","existsSync","readFileSync","readdirSync","join","resolve","execSync","mkdirSync","readFileSync","join","homedir","execSync","chalk","ora","chalk","ora","join","homedir","chalk","tasks","ora","sleep","chalk","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/status.ts","../src/lib/session.ts","../src/lib/process.ts","../src/lib/logger.ts","../src/lib/colors.ts","../src/commands/watch.ts","../src/commands/run.ts","../src/lib/detect.ts","../src/lib/tasks.ts","../src/lib/lock.ts","../src/lib/git.ts","../src/commands/overnight.ts","../src/commands/research.ts","../src/commands/daemon.ts","../src/commands/multi.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { watchCommand } from \"./commands/watch.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { overnightCommand } from \"./commands/overnight.js\";\nimport { researchCommand } from \"./commands/research.js\";\nimport { daemonCommand, daemonLoop } from \"./commands/daemon.js\";\nimport { multiCommand } from \"./commands/multi.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"copilot-agent\")\n .description(\"Autonomous GitHub Copilot CLI agent — auto-resume, task discovery, overnight runner\")\n .version(\"0.2.0\");\n\nprogram\n .command(\"status\")\n .description(\"Show copilot session status\")\n .option(\"-l, --limit <n>\", \"Number of sessions to show\", \"10\")\n .option(\"-a, --active\", \"Show only active (running) sessions\")\n .action(async (opts) => {\n await statusCommand({\n limit: parseInt(opts.limit),\n active: opts.active ?? false,\n });\n });\n\nprogram\n .command(\"watch [session-id]\")\n .description(\"Watch a session and auto-resume when it stops\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues per resume\", \"50\")\n .option(\"-r, --max-resumes <n>\", \"Max number of resumes\", \"20\")\n .option(\"-m, --message <msg>\", \"Message to send on resume\")\n .action(async (sid, opts) => {\n await watchCommand(sid, {\n steps: parseInt(opts.steps),\n maxResumes: parseInt(opts.maxResumes),\n message: opts.message,\n });\n });\n\nprogram\n .command(\"run [dir]\")\n .description(\"Discover and fix issues in a project\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues per task\", \"30\")\n .option(\"-t, --max-tasks <n>\", \"Max number of tasks to run\", \"5\")\n .option(\"--dry-run\", \"Show tasks without executing\")\n .action(async (dir, opts) => {\n await runCommand(dir ?? process.cwd(), {\n steps: parseInt(opts.steps),\n maxTasks: parseInt(opts.maxTasks),\n dryRun: opts.dryRun ?? false,\n });\n });\n\nprogram\n .command(\"overnight [dir]\")\n .description(\"Run tasks continuously until a deadline\")\n .option(\"-u, --until <HH:MM>\", \"Deadline time (24h format)\", \"07:00\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues per task\", \"50\")\n .option(\"-p, --max-premium <n>\", \"Max premium requests budget\", \"300\")\n .option(\"--dry-run\", \"Show plan without executing\")\n .action(async (dir, opts) => {\n await overnightCommand(dir ?? process.cwd(), {\n until: opts.until,\n steps: parseInt(opts.steps),\n maxPremium: parseInt(opts.maxPremium),\n dryRun: opts.dryRun ?? false,\n });\n });\n\nprogram\n .command(\"research [topic]\")\n .description(\"Research improvements or a specific topic\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues\", \"30\")\n .action(async (topic, opts) => {\n await researchCommand(topic, {\n steps: parseInt(opts.steps),\n });\n });\n\nconst daemon = program\n .command(\"daemon <action>\")\n .description(\"Background watchdog daemon (start, stop, status, logs)\")\n .option(\"--poll <n>\", \"Poll interval in seconds\", \"20\")\n .option(\"--idle <n>\", \"Minutes before considering session idle\", \"5\")\n .option(\"--resume\", \"Auto-resume interrupted sessions\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues per resume\", \"50\")\n .action(async (action, opts) => {\n const parsed = {\n poll: parseInt(opts.poll),\n idle: parseInt(opts.idle),\n resume: opts.resume ?? false,\n steps: parseInt(opts.steps),\n };\n // Internal: _loop is called by spawned daemon child\n if (action === \"_loop\") {\n await daemonLoop(parsed);\n } else {\n await daemonCommand(action, parsed);\n }\n });\n\nconst multi = program\n .command(\"multi <action> [args...]\")\n .description(\"Multi-project orchestrator (add, remove, list, health, research)\")\n .option(\"-s, --steps <n>\", \"Max autopilot continues per task\", \"30\")\n .option(\"-c, --cooldown <n>\", \"Seconds between projects\", \"60\")\n .option(\"-p, --max-premium <n>\", \"Max premium per project\", \"30\")\n .option(\"--dry-run\", \"Show plan without executing\")\n .action(async (action, args, opts) => {\n await multiCommand(action, args, {\n mode: action,\n cooldown: parseInt(opts.cooldown),\n steps: parseInt(opts.steps),\n maxPremium: parseInt(opts.maxPremium),\n dryRun: opts.dryRun ?? false,\n });\n });\n\nprogram.parse();\n","import chalk from \"chalk\";\nimport {\n listSessions,\n hasTaskComplete,\n getLastEvent,\n getSessionPremium,\n} from \"../lib/session.js\";\nimport { findCopilotProcesses } from \"../lib/process.js\";\nimport { log } from \"../lib/logger.js\";\n\nexport interface StatusOptions {\n limit: number;\n active: boolean;\n}\n\nexport async function statusCommand(opts: StatusOptions): Promise<void> {\n if (opts.active) {\n return showActive();\n }\n showRecent(opts.limit);\n}\n\nasync function showActive(): Promise<void> {\n const procs = await findCopilotProcesses();\n if (procs.length === 0) {\n log(\"No active copilot processes.\");\n return;\n }\n\n console.log(\n chalk.bold(\n `\\n${\"PID\".padEnd(8)} ${\"Session\".padEnd(40)} ${\"Command\".slice(0, 60)}`,\n ),\n );\n console.log(\"─\".repeat(108));\n\n for (const p of procs) {\n console.log(\n `${String(p.pid).padEnd(8)} ${(p.sessionId ?? \"—\").padEnd(40)} ${(p.command ?? \"\").slice(0, 60)}`,\n );\n }\n console.log();\n}\n\nfunction showRecent(limit: number): void {\n const sessions = listSessions(limit);\n if (sessions.length === 0) {\n log(\"No sessions found.\");\n return;\n }\n\n console.log(\n chalk.bold(\n `\\n${\"Status\".padEnd(10)} ${\"Premium\".padEnd(10)} ${\"Last Event\".padEnd(25)} ${\"Summary\".padEnd(40)} ${\"ID\"}`,\n ),\n );\n console.log(\"─\".repeat(120));\n\n for (const s of sessions) {\n const done = hasTaskComplete(s.id);\n const status = done\n ? chalk.green(\"✅ done\")\n : chalk.yellow(\"⏸️ stopped\");\n const premium = String(getSessionPremium(s.id));\n const lastEvt = getLastEvent(s.id);\n const summary = (s.summary ?? \"—\").slice(0, 38);\n\n console.log(\n `${status.padEnd(20)} ${premium.padEnd(10)} ${lastEvt.padEnd(25)} ${summary.padEnd(40)} ${chalk.dim(s.id)}`,\n );\n }\n console.log();\n}\n","import {\n existsSync,\n readdirSync,\n readFileSync,\n statSync,\n} from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface Session {\n id: string;\n dir: string;\n mtime: number;\n lastEvent: string;\n premiumRequests: number;\n summary: string;\n cwd: string;\n complete: boolean;\n}\n\nconst SESSION_DIR = join(homedir(), '.copilot', 'session-state');\n\nexport function getSessionDir(): string {\n return SESSION_DIR;\n}\n\nexport function validateSession(sid: string): boolean {\n const events = join(SESSION_DIR, sid, 'events.jsonl');\n try {\n return existsSync(events) && statSync(events).size > 0;\n } catch {\n return false;\n }\n}\n\nexport function listSessions(limit = 20): Session[] {\n if (!existsSync(SESSION_DIR)) return [];\n\n const entries = readdirSync(SESSION_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n const dirs: { id: string; dir: string; mtime: number }[] = [];\n for (const entry of entries) {\n const dirPath = join(SESSION_DIR, entry.name);\n if (!existsSync(join(dirPath, 'events.jsonl'))) continue;\n try {\n const stat = statSync(dirPath);\n dirs.push({ id: entry.name, dir: dirPath, mtime: stat.mtimeMs });\n } catch { /* skip */ }\n }\n\n dirs.sort((a, b) => b.mtime - a.mtime);\n\n return dirs.slice(0, limit).map(s => ({\n id: s.id,\n dir: s.dir,\n mtime: s.mtime,\n lastEvent: getLastEvent(s.id),\n premiumRequests: getSessionPremium(s.id),\n summary: getSessionSummary(s.id),\n cwd: getSessionCwd(s.id),\n complete: hasTaskComplete(s.id),\n }));\n}\n\nexport function getLatestSessionId(): string | null {\n if (!existsSync(SESSION_DIR)) return null;\n\n const entries = readdirSync(SESSION_DIR, { withFileTypes: true })\n .filter(d => d.isDirectory());\n\n let latest: { id: string; mtime: number } | null = null;\n for (const entry of entries) {\n try {\n const stat = statSync(join(SESSION_DIR, entry.name));\n if (!latest || stat.mtimeMs > latest.mtime) {\n latest = { id: entry.name, mtime: stat.mtimeMs };\n }\n } catch { /* skip */ }\n }\n return latest?.id ?? null;\n}\n\nexport function hasTaskComplete(sid: string): boolean {\n if (!validateSession(sid)) return false;\n try {\n const content = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8');\n return content.includes('\"session.task_complete\"');\n } catch {\n return false;\n }\n}\n\nexport function getLastEvent(sid: string): string {\n if (!validateSession(sid)) return 'invalid';\n try {\n const lines = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8')\n .trimEnd()\n .split('\\n');\n const last = JSON.parse(lines[lines.length - 1]);\n return last.type ?? 'unknown';\n } catch {\n return 'corrupted';\n }\n}\n\nexport function getSessionPremium(sid: string): number {\n if (!validateSession(sid)) return 0;\n try {\n const content = readFileSync(join(SESSION_DIR, sid, 'events.jsonl'), 'utf-8');\n const lines = content.trimEnd().split('\\n');\n for (let i = lines.length - 1; i >= 0; i--) {\n try {\n const event = JSON.parse(lines[i]);\n if (event.type === 'session.shutdown' && event.data?.totalPremiumRequests != null) {\n return event.data.totalPremiumRequests;\n }\n } catch { /* skip malformed line */ }\n }\n return 0;\n } catch {\n return 0;\n }\n}\n\nfunction parseSimpleYaml(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const idx = line.indexOf(': ');\n if (idx === -1) continue;\n const key = line.substring(0, idx).trim();\n const value = line.substring(idx + 2).trim();\n if (key) result[key] = value;\n }\n return result;\n}\n\nfunction readWorkspace(sid: string): Record<string, string> {\n const wsPath = join(SESSION_DIR, sid, 'workspace.yaml');\n if (!existsSync(wsPath)) return {};\n try {\n return parseSimpleYaml(readFileSync(wsPath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function getSessionSummary(sid: string): string {\n return readWorkspace(sid).summary ?? '';\n}\n\nexport function getSessionCwd(sid: string): string {\n return readWorkspace(sid).cwd ?? '';\n}\n\nexport function findSessionForProject(projectPath: string): string | null {\n const resolved = resolve(projectPath);\n const sessions = listSessions(50);\n for (const s of sessions) {\n if (s.cwd && resolve(s.cwd) === resolved) return s.id;\n }\n return null;\n}\n\nexport function findLatestIncomplete(): string | null {\n const sessions = listSessions(50);\n for (const s of sessions) {\n if (!s.complete) return s.id;\n }\n return null;\n}\n","import { execSync, spawn } from 'node:child_process';\nimport { getLatestSessionId, getSessionPremium } from './session.js';\nimport { fail } from './logger.js';\n\nexport interface CopilotProcess {\n pid: number;\n command: string;\n sessionId?: string;\n}\n\nexport interface CopilotResult {\n exitCode: number;\n sessionId: string | null;\n premium: number;\n}\n\nexport function isCopilotInstalled(): boolean {\n try {\n execSync('which copilot', { stdio: 'pipe', encoding: 'utf-8' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function assertCopilot(): void {\n if (!isCopilotInstalled()) {\n fail('copilot CLI not found. Install with: npm i -g @githubnext/copilot');\n process.exit(1);\n }\n}\n\nexport function findCopilotProcesses(): CopilotProcess[] {\n try {\n const output = execSync('ps -eo pid,command', { encoding: 'utf-8' });\n const results: CopilotProcess[] = [];\n for (const line of output.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n if (\n (trimmed.includes('copilot') || trimmed.includes('@githubnext/copilot')) &&\n !trimmed.includes('ps -eo') &&\n !trimmed.includes('copilot-agent') &&\n !trimmed.includes('grep')\n ) {\n const match = trimmed.match(/^(\\d+)\\s+(.+)$/);\n if (match) {\n const cmd = match[2];\n const sidMatch = cmd.match(/resume[= ]+([a-f0-9-]{36})/);\n results.push({\n pid: parseInt(match[1], 10),\n command: cmd,\n sessionId: sidMatch?.[1],\n });\n }\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n\nexport function findPidForSession(sid: string): number | null {\n const procs = findCopilotProcesses();\n const matching = procs\n .filter(p => p.command.includes(sid))\n .sort((a, b) => b.pid - a.pid);\n return matching[0]?.pid ?? null;\n}\n\nexport async function waitForExit(pid: number, timeoutMs = 14_400_000): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n try {\n process.kill(pid, 0);\n await sleep(5000);\n } catch {\n return true; // process exited\n }\n }\n return false; // timeout\n}\n\nexport function runCopilot(\n args: string[],\n options?: { cwd?: string },\n): Promise<CopilotResult> {\n return new Promise((resolve) => {\n const child = spawn('copilot', args, {\n cwd: options?.cwd,\n stdio: 'inherit',\n env: { ...process.env },\n });\n\n child.on('close', async (code) => {\n await sleep(3000); // let events flush\n const sid = getLatestSessionId();\n const premium = sid ? getSessionPremium(sid) : 0;\n resolve({\n exitCode: code ?? 1,\n sessionId: sid,\n premium,\n });\n });\n\n child.on('error', () => {\n resolve({ exitCode: 1, sessionId: null, premium: 0 });\n });\n });\n}\n\nexport function runCopilotResume(\n sid: string,\n steps: number,\n message?: string,\n cwd?: string,\n): Promise<CopilotResult> {\n const args = [\n `--resume=${sid}`,\n '--autopilot',\n '--allow-all',\n '--max-autopilot-continues',\n String(steps),\n '--no-ask-user',\n ];\n if (message) args.push('-p', message);\n return runCopilot(args, { cwd });\n}\n\nexport function runCopilotTask(\n prompt: string,\n steps: number,\n cwd?: string,\n): Promise<CopilotResult> {\n return runCopilot([\n '-p', prompt,\n '--autopilot',\n '--allow-all',\n '--max-autopilot-continues', String(steps),\n '--no-ask-user',\n ], { cwd });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(r => setTimeout(r, ms));\n}\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { RED, GREEN, YELLOW, CYAN, DIM, RESET } from './colors.js';\n\nlet logFilePath: string | null = null;\n\nconst ANSI_RE =\n /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;\n\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, '');\n}\n\nfunction writeToFile(msg: string): void {\n if (!logFilePath) return;\n try {\n appendFileSync(logFilePath, stripAnsi(msg) + '\\n');\n } catch { /* ignore file write errors */ }\n}\n\nexport function setLogFile(path: string): void {\n mkdirSync(dirname(path), { recursive: true });\n logFilePath = path;\n}\n\nexport function log(msg: string): void {\n console.log(msg);\n writeToFile(msg);\n}\n\nexport function warn(msg: string): void {\n const out = `${YELLOW}⚠ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`⚠ ${msg}`);\n}\n\nexport function ok(msg: string): void {\n const out = `${GREEN}✔ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`✔ ${msg}`);\n}\n\nexport function fail(msg: string): void {\n const out = `${RED}✖ ${msg}${RESET}`;\n console.error(out);\n writeToFile(`✖ ${msg}`);\n}\n\nexport function info(msg: string): void {\n const out = `${CYAN}ℹ ${msg}${RESET}`;\n console.log(out);\n writeToFile(`ℹ ${msg}`);\n}\n\nexport function dim(msg: string): void {\n const out = `${DIM}${msg}${RESET}`;\n console.log(out);\n writeToFile(msg);\n}\n\nexport function notify(message: string, title = 'copilot-agent'): void {\n try {\n if (process.platform === 'darwin') {\n execSync(\n `osascript -e 'display notification \"${message.replace(/\"/g, '\\\\\"')}\" with title \"${title.replace(/\"/g, '\\\\\"')}\"'`,\n { stdio: 'ignore' },\n );\n } else {\n try {\n execSync('which notify-send', { stdio: 'pipe' });\n execSync(\n `notify-send \"${title}\" \"${message.replace(/\"/g, '\\\\\"')}\"`,\n { stdio: 'ignore' },\n );\n } catch { /* notify-send not available */ }\n }\n } catch { /* notification not available */ }\n}\n","export const RED = '\\x1b[31m';\nexport const GREEN = '\\x1b[32m';\nexport const YELLOW = '\\x1b[33m';\nexport const BLUE = '\\x1b[34m';\nexport const CYAN = '\\x1b[36m';\nexport const DIM = '\\x1b[2m';\nexport const BOLD = '\\x1b[1m';\nexport const RESET = '\\x1b[0m';\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n validateSession,\n hasTaskComplete,\n getSessionSummary,\n getLastEvent,\n findLatestIncomplete,\n} from \"../lib/session.js\";\nimport {\n findPidForSession,\n waitForExit,\n runCopilotResume,\n assertCopilot,\n} from \"../lib/process.js\";\nimport { log, ok, warn, fail, notify } from \"../lib/logger.js\";\n\nexport interface WatchOptions {\n steps: number;\n maxResumes: number;\n message?: string;\n}\n\nexport async function watchCommand(\n sid: string | undefined,\n opts: WatchOptions,\n): Promise<void> {\n assertCopilot();\n\n if (!sid) {\n sid = findLatestIncomplete() ?? undefined;\n if (!sid) {\n fail(\"No incomplete session found.\");\n process.exit(1);\n }\n log(`Auto-detected incomplete session: ${chalk.cyan(sid)}`);\n }\n\n if (!validateSession(sid)) {\n fail(`Invalid session: ${sid}`);\n process.exit(1);\n }\n\n if (hasTaskComplete(sid)) {\n ok(`Session ${sid} already completed.`);\n return;\n }\n\n let resumes = 0;\n\n while (resumes < opts.maxResumes) {\n const pid = await findPidForSession(sid);\n\n if (pid) {\n const spinner = ora(\n `Watching PID ${pid} for session ${chalk.cyan(sid.slice(0, 8))}…`,\n ).start();\n const exited = await waitForExit(pid);\n spinner.stop();\n\n if (!exited) {\n warn(\"Timeout waiting for process exit.\");\n break;\n }\n }\n\n // Small delay for events to flush\n await sleep(3000);\n\n if (hasTaskComplete(sid)) {\n ok(\n `Task complete! Summary: ${getSessionSummary(sid) || \"none\"}`,\n );\n notify(\"Task completed!\", `Session ${sid.slice(0, 8)}`);\n return;\n }\n\n // Interrupted — resume\n resumes++;\n log(\n `Session interrupted (${getLastEvent(sid)}). Resume ${resumes}/${opts.maxResumes}…`,\n );\n\n const result = await runCopilotResume(sid, opts.steps, opts.message);\n if (result.sessionId && result.sessionId !== sid) {\n log(`New session created: ${chalk.cyan(result.sessionId)}`);\n sid = result.sessionId;\n }\n }\n\n warn(`Max resumes (${opts.maxResumes}) reached.`);\n notify(\"Max resumes reached\", `Session ${sid.slice(0, 8)}`);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { detectProjectType, detectProjectName } from \"../lib/detect.js\";\nimport { getTasksForProject } from \"../lib/tasks.js\";\nimport { runCopilotTask, assertCopilot } from \"../lib/process.js\";\nimport { withLock } from \"../lib/lock.js\";\nimport { gitCurrentBranch, gitStatus, gitStash, gitCheckout, isGitRepo } from \"../lib/git.js\";\nimport { log, ok, warn, fail, notify } from \"../lib/logger.js\";\n\nexport interface RunOptions {\n steps: number;\n maxTasks: number;\n dryRun: boolean;\n}\n\nexport async function runCommand(\n dir: string,\n opts: RunOptions,\n): Promise<void> {\n assertCopilot();\n\n const projectType = detectProjectType(dir);\n const name = detectProjectName(dir);\n log(`Project: ${chalk.cyan(name)} (${projectType})`);\n\n const tasks = getTasksForProject(projectType).slice(0, opts.maxTasks);\n\n if (tasks.length === 0) {\n warn(\"No tasks found for this project type.\");\n return;\n }\n\n log(`Found ${tasks.length} tasks:`);\n for (const t of tasks) {\n console.log(` ${chalk.dim(\"•\")} ${t.title}`);\n }\n\n if (opts.dryRun) {\n log(chalk.dim(\"(dry-run — not executing)\"));\n return;\n }\n\n const originalBranch = isGitRepo(dir) ? gitCurrentBranch(dir) : null;\n let completed = 0;\n let premiumTotal = 0;\n\n for (const task of tasks) {\n log(`\\n${\"═\".repeat(60)}`);\n log(`Task: ${chalk.bold(task.title)}`);\n log(`${\"═\".repeat(60)}`);\n\n // Create a feature branch for safety\n if (originalBranch && isGitRepo(dir)) {\n const branch = `copilot-agent/${task.title.toLowerCase().replace(/[^a-z0-9]+/g, \"-\")}`;\n try {\n if (gitStatus(dir)) gitStash(dir);\n gitCheckout(dir, branch);\n } catch (e) {\n warn(`Could not create branch ${branch}, continuing on current.`);\n }\n }\n\n const spinner = ora(`Running: ${task.title}…`).start();\n\n const result = await withLock(\"copilot-run\", () =>\n runCopilotTask(task.prompt, opts.steps),\n );\n\n spinner.stop();\n\n premiumTotal += result.premium;\n completed++;\n ok(`${task.title} — exit ${result.exitCode}, premium: ${result.premium}`);\n\n if (originalBranch && isGitRepo(dir)) {\n try {\n gitCheckout(dir, originalBranch);\n } catch {\n /* stay on feature branch */\n }\n }\n }\n\n log(`\\nCompleted ${completed}/${tasks.length} tasks. Total premium: ${premiumTotal}`);\n notify(`Completed ${completed} tasks`, name);\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, basename, resolve } from 'node:path';\nimport { execSync } from 'node:child_process';\n\nexport type ProjectType =\n | 'kmp' | 'kotlin' | 'java'\n | 'node' | 'typescript' | 'react' | 'next'\n | 'python' | 'rust' | 'swift' | 'go' | 'flutter'\n | 'unknown';\n\nexport function detectProjectType(dir: string): ProjectType {\n const exists = (f: string) => existsSync(join(dir, f));\n\n if (exists('build.gradle.kts') || exists('build.gradle')) {\n if (exists('composeApp') || exists('gradle.properties')) {\n try {\n const gradle = readFileSync(join(dir, 'build.gradle.kts'), 'utf-8');\n if (gradle.includes('multiplatform') || gradle.includes('KotlinMultiplatform')) return 'kmp';\n } catch { /* ignore */ }\n }\n if (exists('pom.xml')) return 'java';\n return 'kotlin';\n }\n if (exists('pubspec.yaml')) return 'flutter';\n if (exists('Package.swift')) return 'swift';\n try {\n const entries = readdirSync(dir);\n if (entries.some(e => e.endsWith('.xcodeproj'))) return 'swift';\n } catch { /* ignore */ }\n if (exists('Cargo.toml')) return 'rust';\n if (exists('go.mod')) return 'go';\n if (exists('pyproject.toml') || exists('setup.py') || exists('requirements.txt')) return 'python';\n if (exists('package.json')) {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (allDeps['next']) return 'next';\n if (allDeps['react']) return 'react';\n if (allDeps['typescript'] || exists('tsconfig.json')) return 'typescript';\n } catch { /* ignore */ }\n return 'node';\n }\n if (exists('pom.xml')) return 'java';\n return 'unknown';\n}\n\nexport function detectProjectName(dir: string): string {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8'));\n if (pkg.name) return pkg.name;\n } catch { /* ignore */ }\n return basename(resolve(dir));\n}\n\nexport function detectMainBranch(dir: string): string {\n try {\n const ref = execSync('git symbolic-ref refs/remotes/origin/HEAD', {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n return ref.split('/').pop() ?? 'main';\n } catch { /* ignore */ }\n\n try {\n const branch = execSync('git branch --show-current', {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n if (branch) return branch;\n } catch { /* ignore */ }\n\n return 'main';\n}\n","import type { ProjectType } from \"./detect.js\";\n\ninterface TaskPrompt {\n title: string;\n prompt: string;\n priority: number;\n}\n\nconst COMMON_TASKS: TaskPrompt[] = [\n {\n title: \"Fix TODOs\",\n prompt:\n \"Scan for TODO, FIXME, HACK comments. Fix the most impactful ones. Run tests to verify.\",\n priority: 1,\n },\n {\n title: \"Update dependencies\",\n prompt:\n \"Check for outdated dependencies. Update patch/minor versions that are safe. Run tests after updating.\",\n priority: 2,\n },\n {\n title: \"Improve test coverage\",\n prompt:\n \"Find untested public functions. Write tests for the most critical ones. Target 80%+ coverage.\",\n priority: 3,\n },\n {\n title: \"Fix lint warnings\",\n prompt:\n \"Run the project linter. Fix all warnings without changing behavior. Run tests.\",\n priority: 4,\n },\n {\n title: \"Improve documentation\",\n prompt:\n \"Review README and code docs. Add missing JSDoc/KDoc for public APIs. Update outdated sections.\",\n priority: 5,\n },\n {\n title: \"Security audit\",\n prompt:\n \"Check for common security issues: hardcoded secrets, SQL injection, XSS, insecure defaults. Fix any found.\",\n priority: 6,\n },\n];\n\nconst TYPE_TASKS: Partial<Record<ProjectType, TaskPrompt[]>> = {\n kmp: [\n {\n title: \"KMP: Optimize Compose\",\n prompt:\n \"Review Compose UI code for recomposition issues. Add @Stable/@Immutable where needed. Check remember usage.\",\n priority: 2,\n },\n {\n title: \"KMP: Check expect/actual\",\n prompt:\n \"Review expect/actual declarations. Ensure all platforms have proper implementations. Check for missing iOS/Desktop actuals.\",\n priority: 3,\n },\n {\n title: \"KMP: Room migrations\",\n prompt:\n \"Check Room database schema. Ensure migrations are defined for schema changes. Add missing migration tests.\",\n priority: 4,\n },\n ],\n typescript: [\n {\n title: \"TS: Strict type safety\",\n prompt:\n \"Find `any` types and loose assertions. Replace with proper types. Enable stricter tsconfig options if safe.\",\n priority: 2,\n },\n ],\n react: [\n {\n title: \"React: Performance\",\n prompt:\n \"Find unnecessary re-renders. Add React.memo, useMemo, useCallback where beneficial. Check bundle size.\",\n priority: 2,\n },\n ],\n python: [\n {\n title: \"Python: Type hints\",\n prompt:\n \"Add type hints to public functions. Run mypy to check type safety. Fix any type errors.\",\n priority: 2,\n },\n ],\n node: [\n {\n title: \"Node: Error handling\",\n prompt:\n \"Review async error handling. Add try/catch for unhandled promises. Check for missing error middleware.\",\n priority: 2,\n },\n ],\n};\n\nexport function getTasksForProject(type: ProjectType): TaskPrompt[] {\n const specific = TYPE_TASKS[type] ?? [];\n return [...specific, ...COMMON_TASKS].sort(\n (a, b) => a.priority - b.priority,\n );\n}\n","import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst LOCK_BASE = join(homedir(), '.copilot', 'locks');\n\nfunction lockDir(name: string): string {\n return join(LOCK_BASE, `${name}.lock`);\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function acquireLock(name: string, timeoutMs = 30_000): boolean {\n mkdirSync(LOCK_BASE, { recursive: true });\n const dir = lockDir(name);\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n try {\n mkdirSync(dir);\n // Lock acquired — write metadata\n writeFileSync(join(dir, 'pid'), String(process.pid));\n writeFileSync(join(dir, 'acquired'), new Date().toISOString());\n return true;\n } catch {\n // Lock dir exists — check if holder is still alive\n try {\n const holderPid = parseInt(readFileSync(join(dir, 'pid'), 'utf-8').trim(), 10);\n if (!isPidAlive(holderPid)) {\n // Stale lock — break it\n rmSync(dir, { recursive: true, force: true });\n continue;\n }\n } catch {\n // Can't read pid file — try breaking\n rmSync(dir, { recursive: true, force: true });\n continue;\n }\n // Holder is alive — wait and retry\n const waitMs = Math.min(500, deadline - Date.now());\n if (waitMs > 0) {\n const start = Date.now();\n while (Date.now() - start < waitMs) { /* spin wait */ }\n }\n }\n }\n return false;\n}\n\nexport function releaseLock(name: string): void {\n const dir = lockDir(name);\n try {\n rmSync(dir, { recursive: true, force: true });\n } catch { /* already released */ }\n}\n\nexport async function withLock<T>(name: string, fn: () => T | Promise<T>): Promise<T> {\n if (!acquireLock(name)) {\n throw new Error(`Failed to acquire lock: ${name}`);\n }\n try {\n return await fn();\n } finally {\n releaseLock(name);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\n\nfunction gitExec(dir: string, cmd: string): string | null {\n try {\n return execSync(cmd, {\n cwd: dir,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n } catch {\n return null;\n }\n}\n\nexport function isGitRepo(dir: string): boolean {\n return existsSync(join(dir, '.git'));\n}\n\nexport function gitCurrentBranch(dir: string): string | null {\n return gitExec(dir, 'git branch --show-current');\n}\n\nexport function gitStash(dir: string): boolean {\n return gitExec(dir, 'git stash -q') !== null;\n}\n\nexport function gitStashPop(dir: string): boolean {\n return gitExec(dir, 'git stash pop -q') !== null;\n}\n\nexport function gitCheckout(dir: string, branch: string): boolean {\n return gitExec(dir, `git checkout ${branch} -q`) !== null;\n}\n\nexport function gitCreateBranch(dir: string, branch: string): boolean {\n return gitExec(dir, `git checkout -b ${branch}`) !== null;\n}\n\nexport function gitCountCommits(dir: string, from: string, to: string): number {\n const result = gitExec(dir, `git log ${from}..${to} --oneline`);\n if (!result) return 0;\n return result.split('\\n').filter(l => l.trim()).length;\n}\n\nexport function gitStatus(dir: string): string {\n return gitExec(dir, 'git status --porcelain') ?? '';\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { detectProjectType, detectProjectName } from \"../lib/detect.js\";\nimport { getTasksForProject } from \"../lib/tasks.js\";\nimport { runCopilotTask, assertCopilot } from \"../lib/process.js\";\nimport { withLock } from \"../lib/lock.js\";\nimport { log, ok, warn, fail, setLogFile, notify } from \"../lib/logger.js\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport interface OvernightOptions {\n until: string; // HH:MM\n steps: number;\n maxPremium: number;\n dryRun: boolean;\n}\n\nexport async function overnightCommand(\n dir: string,\n opts: OvernightOptions,\n): Promise<void> {\n assertCopilot();\n\n const ts = new Date().toISOString().replace(/[:.]/g, \"\").slice(0, 15);\n const logPath = join(\n homedir(),\n \".copilot\",\n \"auto-resume-logs\",\n `overnight-${ts}.log`,\n );\n setLogFile(logPath);\n\n const deadline = parseDeadline(opts.until);\n const name = detectProjectName(dir);\n const projectType = detectProjectType(dir);\n\n log(`Overnight runner for ${chalk.cyan(name)} (${projectType})`);\n log(`Deadline: ${opts.until} (${msToHuman(deadline - Date.now())} from now)`);\n log(`Max premium: ${opts.maxPremium}, Steps: ${opts.steps}`);\n log(`Log: ${logPath}`);\n\n if (opts.dryRun) {\n const tasks = getTasksForProject(projectType);\n log(`\\nWould run ${tasks.length} tasks:`);\n for (const t of tasks) console.log(` ${chalk.dim(\"•\")} ${t.title}`);\n return;\n }\n\n const tasks = getTasksForProject(projectType);\n let taskIdx = 0;\n let totalPremium = 0;\n let completedTasks = 0;\n let cycle = 0;\n\n while (Date.now() < deadline) {\n if (totalPremium >= opts.maxPremium) {\n warn(`Premium budget exhausted: ${totalPremium}/${opts.maxPremium}`);\n break;\n }\n\n const task = tasks[taskIdx % tasks.length];\n cycle++;\n taskIdx++;\n\n log(`\\n${\"═\".repeat(60)}`);\n log(\n `Cycle ${cycle} | Task: ${chalk.bold(task.title)} | Premium: ${totalPremium}/${opts.maxPremium}`,\n );\n log(`Time remaining: ${msToHuman(deadline - Date.now())}`);\n log(`${\"═\".repeat(60)}`);\n\n const spinner = ora(`Running: ${task.title}…`).start();\n\n try {\n const result = await withLock(\"copilot-overnight\", () =>\n runCopilotTask(task.prompt, opts.steps),\n );\n spinner.stop();\n\n totalPremium += result.premium;\n completedTasks++;\n ok(\n `${task.title} — exit ${result.exitCode}, premium: ${result.premium}`,\n );\n } catch (err) {\n spinner.stop();\n fail(`Task failed: ${err}`);\n }\n\n // Cooldown between tasks\n if (Date.now() < deadline) {\n log(\"Cooldown 30s…\");\n await sleep(30_000);\n }\n }\n\n const summary = `Overnight done. ${completedTasks} tasks, ${totalPremium} premium.`;\n log(summary);\n notify(summary, name);\n}\n\nfunction parseDeadline(hhmm: string): number {\n const [h, m] = hhmm.split(\":\").map(Number);\n const now = new Date();\n const target = new Date(now);\n target.setHours(h, m, 0, 0);\n if (target <= now) target.setDate(target.getDate() + 1);\n return target.getTime();\n}\n\nfunction msToHuman(ms: number): string {\n const h = Math.floor(ms / 3_600_000);\n const m = Math.floor((ms % 3_600_000) / 60_000);\n return `${h}h ${m}m`;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import chalk from \"chalk\";\nimport { runCopilotTask, assertCopilot } from \"../lib/process.js\";\nimport { withLock } from \"../lib/lock.js\";\nimport { log, ok, fail, notify } from \"../lib/logger.js\";\n\nexport interface ResearchOptions {\n steps: number;\n}\n\nconst RESEARCH_PROMPTS = [\n {\n title: \"Dependency updates\",\n prompt:\n \"Research the latest versions of all dependencies. Check changelogs for breaking changes. Create a summary of what can be safely updated.\",\n },\n {\n title: \"Performance review\",\n prompt:\n \"Profile the application for performance bottlenecks. Check startup time, memory usage, and hot paths. Suggest optimizations with benchmarks.\",\n },\n {\n title: \"Architecture review\",\n prompt:\n \"Review the project architecture. Check for code smells, circular dependencies, and coupling issues. Suggest improvements following clean architecture.\",\n },\n {\n title: \"Accessibility audit\",\n prompt:\n \"Audit the UI for accessibility issues. Check color contrast, screen reader support, and keyboard navigation. Create a report.\",\n },\n {\n title: \"Best practices\",\n prompt:\n \"Compare the codebase against current best practices for this framework/language. Identify gaps and suggest improvements.\",\n },\n];\n\nexport async function researchCommand(\n topic: string | undefined,\n opts: ResearchOptions,\n): Promise<void> {\n assertCopilot();\n\n if (topic) {\n log(`Research topic: ${chalk.cyan(topic)}`);\n const result = await withLock(\"copilot-research\", () =>\n runCopilotTask(\n `Research the following topic and create a detailed report: ${topic}`,\n opts.steps,\n ),\n );\n ok(`Research complete — premium: ${result.premium}`);\n notify(\"Research complete\", topic.slice(0, 30));\n return;\n }\n\n log(\"Running predefined research tasks…\");\n for (const r of RESEARCH_PROMPTS) {\n log(`\\n${chalk.bold(r.title)}`);\n try {\n const result = await withLock(\"copilot-research\", () =>\n runCopilotTask(r.prompt, opts.steps),\n );\n ok(`${r.title} — premium: ${result.premium}`);\n } catch (err) {\n fail(`${r.title} failed: ${err}`);\n }\n }\n notify(\"All research tasks complete\");\n}\n","import { existsSync, readFileSync, writeFileSync, unlinkSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { spawn } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport {\n getLatestSessionId,\n validateSession,\n hasTaskComplete,\n getLastEvent,\n getSessionSummary,\n} from \"../lib/session.js\";\nimport {\n findPidForSession,\n waitForExit,\n runCopilotResume,\n assertCopilot,\n} from \"../lib/process.js\";\nimport { withLock } from \"../lib/lock.js\";\nimport { log, ok, warn, fail, notify, setLogFile } from \"../lib/logger.js\";\n\nconst PID_FILE = join(homedir(), \".copilot\", \"watchdog.pid\");\nconst LOG_FILE = join(homedir(), \".copilot\", \"auto-resume-logs\", \"watchdog.log\");\nconst SESSION_DIR = join(homedir(), \".copilot\", \"session-state\");\n\nexport interface DaemonOptions {\n poll: number;\n idle: number;\n resume: boolean;\n steps: number;\n}\n\nexport async function daemonCommand(\n action: string,\n opts: DaemonOptions,\n): Promise<void> {\n switch (action) {\n case \"start\":\n return startDaemon(opts);\n case \"stop\":\n return stopDaemon();\n case \"status\":\n return statusDaemon();\n case \"logs\":\n return showLogs();\n default:\n fail(`Unknown action: ${action}. Use: start, stop, status, logs`);\n process.exit(1);\n }\n}\n\nfunction isDaemonRunning(): { running: boolean; pid?: number } {\n if (!existsSync(PID_FILE)) return { running: false };\n try {\n const pid = parseInt(readFileSync(PID_FILE, \"utf-8\").trim());\n process.kill(pid, 0); // test if alive\n return { running: true, pid };\n } catch {\n return { running: false };\n }\n}\n\nasync function startDaemon(opts: DaemonOptions): Promise<void> {\n assertCopilot();\n\n const { running, pid } = isDaemonRunning();\n if (running) {\n fail(`Watchdog already running (PID: ${pid}). Use 'copilot-agent daemon stop' first.`);\n process.exit(1);\n }\n\n // Clean stale PID file\n if (existsSync(PID_FILE)) {\n \n unlinkSync(PID_FILE);\n }\n\n log(`🐕 Starting watchdog daemon (poll: ${opts.poll}s, auto-resume: ${opts.resume})`);\n log(` Log: ${LOG_FILE}`);\n\n // Spawn detached child running this same CLI in _daemon-loop mode\n const child = spawn(\n process.execPath,\n [\n process.argv[1],\n \"daemon\",\n \"_loop\",\n \"--poll\",\n String(opts.poll),\n \"--idle\",\n String(opts.idle),\n \"--steps\",\n String(opts.steps),\n ...(opts.resume ? [\"--resume\"] : []),\n ],\n {\n detached: true,\n stdio: \"ignore\",\n },\n );\n\n child.unref();\n\n if (child.pid) {\n writeFileSync(PID_FILE, String(child.pid));\n ok(`Watchdog started (PID: ${child.pid})`);\n } else {\n fail(\"Failed to start watchdog\");\n }\n}\n\nasync function stopDaemon(): Promise<void> {\n const { running, pid } = isDaemonRunning();\n if (!running) {\n warn(\"Watchdog is not running.\");\n return;\n }\n try {\n process.kill(pid!, \"SIGTERM\");\n ok(`Watchdog stopped (PID: ${pid})`);\n } catch {\n fail(`Could not stop PID ${pid}`);\n }\n try {\n \n unlinkSync(PID_FILE);\n } catch { /* ignore */ }\n}\n\nasync function statusDaemon(): Promise<void> {\n const { running, pid } = isDaemonRunning();\n if (running) {\n ok(`Watchdog running (PID: ${pid})`);\n if (existsSync(LOG_FILE)) {\n const stat = statSync(LOG_FILE);\n log(`Log: ${LOG_FILE} (${(stat.size / 1024).toFixed(1)} KB)`);\n }\n } else {\n log(\"Watchdog is not running.\");\n }\n}\n\nasync function showLogs(): Promise<void> {\n if (!existsSync(LOG_FILE)) {\n log(\"No log file found.\");\n return;\n }\n const lines = readFileSync(LOG_FILE, \"utf-8\").trimEnd().split(\"\\n\");\n const tail = lines.slice(-30);\n for (const line of tail) console.log(line);\n}\n\n// Internal: the actual daemon loop (called by spawned child)\nexport async function daemonLoop(opts: DaemonOptions): Promise<void> {\n setLogFile(LOG_FILE);\n log(`🐕 Watchdog daemon loop started (PID: ${process.pid})`);\n\n let lastAlertedSid = \"\";\n\n const shutdown = () => {\n log(\"Watchdog shutting down\");\n try {\n \n unlinkSync(PID_FILE);\n } catch { /* ignore */ }\n process.exit(0);\n };\n process.on(\"SIGTERM\", shutdown);\n process.on(\"SIGINT\", shutdown);\n\n while (true) {\n await sleep(opts.poll * 1000);\n\n try {\n const sid = getLatestSessionId();\n if (!sid || !validateSession(sid)) continue;\n\n // Already handled this session\n if (sid === lastAlertedSid && hasTaskComplete(sid)) continue;\n\n // Check if copilot is actively running for this session\n const pid = await findPidForSession(sid);\n if (pid) continue; // still running, nothing to do\n\n // Session has no running process\n if (hasTaskComplete(sid)) {\n if (sid !== lastAlertedSid) {\n log(`✅ Session ${sid.slice(0, 8)} completed: ${getSessionSummary(sid).slice(0, 60)}`);\n notify(\"Task completed\", `Session ${sid.slice(0, 8)}`);\n lastAlertedSid = sid;\n }\n continue;\n }\n\n // Session interrupted — check idle time\n const eventsPath = join(SESSION_DIR, sid, \"events.jsonl\");\n const mtime = statSync(eventsPath).mtimeMs;\n const idleMinutes = (Date.now() - mtime) / 60_000;\n\n if (idleMinutes < opts.idle) continue;\n\n log(`⏸️ Session ${sid.slice(0, 8)} idle ${idleMinutes.toFixed(0)}m (last: ${getLastEvent(sid)})`);\n\n if (opts.resume) {\n log(`🔄 Auto-resuming session ${sid.slice(0, 8)}…`);\n lastAlertedSid = sid;\n\n try {\n await withLock(\"watchdog-resume\", async () => {\n const result = await runCopilotResume(sid, opts.steps);\n ok(`Resume done — exit ${result.exitCode}, premium: ${result.premium}`);\n });\n } catch (err) {\n fail(`Resume failed: ${err}`);\n }\n } else {\n if (sid !== lastAlertedSid) {\n warn(`Session ${sid.slice(0, 8)} needs attention (idle ${idleMinutes.toFixed(0)}m)`);\n notify(\"Session interrupted\", `${sid.slice(0, 8)} idle ${idleMinutes.toFixed(0)}m`);\n lastAlertedSid = sid;\n }\n }\n } catch (err) {\n fail(`Watchdog error: ${err}`);\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join, resolve, basename } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport chalk from \"chalk\";\nimport { detectProjectType, detectProjectName } from \"../lib/detect.js\";\nimport { getTasksForProject } from \"../lib/tasks.js\";\nimport { runCopilotTask, assertCopilot } from \"../lib/process.js\";\nimport { withLock } from \"../lib/lock.js\";\nimport { log, ok, warn, fail, notify, setLogFile } from \"../lib/logger.js\";\n\nconst PROJECTS_FILE = join(homedir(), \".copilot\", \"autonomous-projects.txt\");\nconst LOG_DIR = join(homedir(), \".copilot\", \"auto-resume-logs\");\n\nexport interface MultiOptions {\n mode: string;\n cooldown: number;\n steps: number;\n maxPremium: number;\n dryRun: boolean;\n}\n\nexport async function multiCommand(\n action: string,\n args: string[],\n opts: MultiOptions,\n): Promise<void> {\n ensureFiles();\n\n switch (action) {\n case \"add\":\n return addProject(args[0]);\n case \"remove\":\n return removeProject(args[0]);\n case \"list\":\n return listProjects();\n case \"health\":\n case \"research\":\n return runAll(action, opts);\n default:\n fail(`Unknown action: ${action}. Use: add, remove, list, health, research`);\n process.exit(1);\n }\n}\n\nfunction ensureFiles(): void {\n mkdirSync(LOG_DIR, { recursive: true });\n if (!existsSync(PROJECTS_FILE)) writeFileSync(PROJECTS_FILE, \"\");\n}\n\nfunction readProjects(): string[] {\n return readFileSync(PROJECTS_FILE, \"utf-8\")\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean);\n}\n\nfunction writeProjects(projects: string[]): void {\n writeFileSync(PROJECTS_FILE, projects.join(\"\\n\") + \"\\n\");\n}\n\nasync function addProject(path: string | undefined): Promise<void> {\n if (!path) {\n fail(\"Usage: copilot-agent multi add <path>\");\n process.exit(1);\n }\n\n const resolved = resolve(path);\n if (!existsSync(resolved)) {\n fail(`Not found: ${resolved}`);\n process.exit(1);\n }\n\n await withLock(\"projects-file\", async () => {\n const projects = readProjects();\n if (projects.includes(resolved)) {\n warn(`Already registered: ${resolved}`);\n return;\n }\n projects.push(resolved);\n writeProjects(projects);\n ok(`Added: ${resolved}`);\n });\n}\n\nasync function removeProject(path: string | undefined): Promise<void> {\n if (!path) {\n fail(\"Usage: copilot-agent multi remove <path>\");\n process.exit(1);\n }\n\n const resolved = resolve(path);\n\n await withLock(\"projects-file\", async () => {\n const projects = readProjects();\n const filtered = projects.filter((p) => p !== resolved);\n if (filtered.length === projects.length) {\n warn(`Not registered: ${resolved}`);\n return;\n }\n writeProjects(filtered);\n ok(`Removed: ${resolved}`);\n });\n}\n\nfunction listProjects(): void {\n const projects = readProjects();\n if (projects.length === 0) {\n log(\"No projects registered. Add: copilot-agent multi add <path>\");\n return;\n }\n\n console.log(chalk.bold(\"\\nRegistered projects:\"));\n for (let i = 0; i < projects.length; i++) {\n const exists = existsSync(projects[i]);\n const icon = exists ? chalk.green(\"✅\") : chalk.red(\"❌\");\n const type = exists ? detectProjectType(projects[i]) : \"?\";\n console.log(` ${i + 1}. ${icon} ${projects[i]} ${chalk.dim(`(${type})`)}`);\n }\n console.log();\n}\n\nasync function runAll(mode: string, opts: MultiOptions): Promise<void> {\n assertCopilot();\n\n const ts = new Date().toISOString().replace(/[:.]/g, \"\").slice(0, 15);\n setLogFile(join(LOG_DIR, `multi-${mode}-${ts}.log`));\n\n const projects = readProjects();\n if (projects.length === 0) {\n fail(\"No projects registered. Add: copilot-agent multi add <path>\");\n process.exit(1);\n }\n\n log(`🏭 Multi-project ${mode} — ${projects.length} projects`);\n\n if (opts.dryRun) {\n for (const p of projects) {\n const type = existsSync(p) ? detectProjectType(p) : \"unknown\";\n const tasks = getTasksForProject(type);\n console.log(`\\n${chalk.bold(basename(p))} (${type})`);\n for (const t of tasks.slice(0, 3)) {\n console.log(` ${chalk.dim(\"•\")} ${t.title}`);\n }\n }\n log(chalk.dim(\"\\n(dry-run — not executing)\"));\n return;\n }\n\n let total = 0;\n let success = 0;\n let failed = 0;\n let skipped = 0;\n const report: string[] = [];\n\n for (const project of projects) {\n total++;\n\n if (!existsSync(project)) {\n warn(`Skipping (not found): ${project}`);\n report.push(`⏭ ${basename(project)} (not found)`);\n skipped++;\n continue;\n }\n\n const name = detectProjectName(project);\n const type = detectProjectType(project);\n log(`\\n${\"═\".repeat(50)}`);\n log(`${chalk.bold(name)} (${type}) — ${total}/${projects.length}`);\n log(`${\"═\".repeat(50)}`);\n\n const tasks = mode === \"research\"\n ? [{ title: \"Research\", prompt: \"Research latest best practices, dependency updates, and architecture improvements. Create a report.\", priority: 1 }]\n : getTasksForProject(type).slice(0, 3);\n\n let projectSuccess = true;\n\n for (const task of tasks) {\n try {\n const result = await withLock(\"copilot-multi\", () =>\n runCopilotTask(\n `Project: ${project}\\n\\n${task.prompt}`,\n opts.steps,\n ),\n );\n ok(`${task.title} — exit ${result.exitCode}, premium: ${result.premium}`);\n } catch (err) {\n fail(`${task.title} failed: ${err}`);\n projectSuccess = false;\n }\n }\n\n if (projectSuccess) {\n success++;\n report.push(`✅ ${name}`);\n } else {\n failed++;\n report.push(`❌ ${name}`);\n }\n\n if (total < projects.length) {\n log(`Cooldown ${opts.cooldown}s…`);\n await new Promise((r) => setTimeout(r, opts.cooldown * 1000));\n }\n }\n\n console.log(`\\n${\"═\".repeat(50)}`);\n log(`📊 Summary: ${success}/${total} succeeded, ${failed} failed, ${skipped} skipped`);\n for (const line of report) console.log(` ${line}`);\n console.log();\n\n notify(`Multi-${mode}: ${success}/${total} succeeded`, \"copilot-agent\");\n}\n"],"mappings":"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","names":["execSync","execSync","resolve","chalk","chalk","sleep","chalk","ora","existsSync","readFileSync","readdirSync","join","resolve","execSync","mkdirSync","readFileSync","join","homedir","existsSync","join","execSync","chalk","ora","chalk","ora","join","homedir","chalk","tasks","ora","sleep","chalk","chalk","existsSync","readFileSync","writeFileSync","statSync","join","homedir","spawn","join","homedir","SESSION_DIR","existsSync","readFileSync","spawn","writeFileSync","statSync","sleep","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","basename","homedir","chalk","join","homedir","mkdirSync","existsSync","writeFileSync","readFileSync","resolve","chalk","basename"]}
|