agent-auto-resume 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -229,9 +229,115 @@ ${snippet}
229
229
  Restart your terminal or run: source ${rcPath}`;
230
230
  }
231
231
 
232
- // src/commands/setup.ts
232
+ // src/core/autostart.ts
233
+ import fs3 from "fs-extra";
234
+ import path3 from "path";
235
+ import os2 from "os";
233
236
  import { execSync } from "child_process";
237
+ function getAarPath() {
238
+ try {
239
+ const whichAar = execSync("which aar", { encoding: "utf8" }).trim();
240
+ if (whichAar) return whichAar;
241
+ } catch {
242
+ }
243
+ const home = os2.homedir();
244
+ const possiblePaths = [
245
+ path3.join(home, ".hermes/node/bin/aar"),
246
+ path3.join(home, ".npm-global/bin/aar"),
247
+ "/usr/local/bin/aar",
248
+ "/opt/homebrew/bin/aar"
249
+ ];
250
+ for (const p of possiblePaths) {
251
+ if (fs3.existsSync(p)) return p;
252
+ }
253
+ return "aar";
254
+ }
255
+ function generatePlistContent(aarPath) {
256
+ const logDir = path3.join(os2.homedir(), ".agent-auto-resume");
257
+ return `<?xml version="1.0" encoding="UTF-8"?>
258
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
259
+ <plist version="1.0">
260
+ <dict>
261
+ <key>Label</key>
262
+ <string>com.user.agent-auto-resume</string>
263
+ <key>ProgramArguments</key>
264
+ <array>
265
+ <string>${aarPath}</string>
266
+ <string>daemon</string>
267
+ <string>start</string>
268
+ </array>
269
+ <key>RunAtLoad</key>
270
+ <true/>
271
+ <key>KeepAlive</key>
272
+ <false/>
273
+ <key>StandardOutPath</key>
274
+ <string>${path3.join(logDir, "daemon-launchd.log")}</string>
275
+ <key>StandardErrorPath</key>
276
+ <string>${path3.join(logDir, "daemon-launchd.err")}</string>
277
+ </dict>
278
+ </plist>
279
+ `;
280
+ }
281
+ function generateServiceContent(aarPath) {
282
+ return `[Unit]
283
+ Description=Agent Auto Resume Daemon
284
+ After=network.target
285
+
286
+ [Service]
287
+ Type=simple
288
+ ExecStart=${aarPath} daemon run
289
+ Restart=on-failure
290
+
291
+ [Install]
292
+ WantedBy=default.target
293
+ `;
294
+ }
295
+ async function setupAutostart() {
296
+ const platform = os2.platform();
297
+ const aarPath = getAarPath();
298
+ if (platform === "darwin") {
299
+ const plistDir = path3.join(os2.homedir(), "Library/LaunchAgents");
300
+ const plistPath = path3.join(plistDir, "com.user.agent-auto-resume.plist");
301
+ await fs3.ensureDir(plistDir);
302
+ const content = generatePlistContent(aarPath);
303
+ try {
304
+ execSync(`launchctl unload ${plistPath}`, { stdio: "ignore" });
305
+ } catch {
306
+ }
307
+ await fs3.writeFile(plistPath, content, "utf-8");
308
+ execSync(`launchctl load ${plistPath}`);
309
+ return "Successfully configured and loaded LaunchAgent for macOS. aar daemon will autostart on login.";
310
+ } else if (platform === "linux") {
311
+ const serviceDir = path3.join(os2.homedir(), ".config/systemd/user");
312
+ const servicePath = path3.join(serviceDir, "aar.service");
313
+ await fs3.ensureDir(serviceDir);
314
+ const content = generateServiceContent(aarPath);
315
+ await fs3.writeFile(servicePath, content, "utf-8");
316
+ execSync("systemctl --user daemon-reload");
317
+ execSync("systemctl --user enable aar");
318
+ execSync("systemctl --user start aar");
319
+ return "Successfully configured and enabled Systemd user service for Linux. aar daemon will autostart on login.";
320
+ } else {
321
+ throw new Error(`Autostart is not supported on platform: ${platform}`);
322
+ }
323
+ }
324
+
325
+ // src/commands/setup.ts
326
+ import { execSync as execSync2 } from "child_process";
234
327
  import chalk from "chalk";
328
+ import readline from "readline";
329
+ function askQuestion(query) {
330
+ const rl = readline.createInterface({
331
+ input: process.stdin,
332
+ output: process.stdout
333
+ });
334
+ return new Promise((resolve) => {
335
+ rl.question(query, (answer) => {
336
+ rl.close();
337
+ resolve(answer);
338
+ });
339
+ });
340
+ }
235
341
  async function runSetup(options) {
236
342
  console.log(chalk.bold("Starting agent-auto-resume setup...\n"));
237
343
  await ensureDirs();
@@ -246,7 +352,7 @@ async function runSetup(options) {
246
352
  console.log("\nChecking provider CLI commands:");
247
353
  for (const p of providers) {
248
354
  try {
249
- execSync(`which ${p.cmd}`, { stdio: "ignore" });
355
+ execSync2(`which ${p.cmd}`, { stdio: "ignore" });
250
356
  console.log(chalk.green(` \u2713 ${p.name} (${p.cmd}) is installed.`));
251
357
  } catch {
252
358
  console.log(chalk.yellow(` \u26A0 ${p.name} (${p.cmd}) was not found in your PATH.`));
@@ -263,26 +369,41 @@ async function runSetup(options) {
263
369
  console.log("");
264
370
  const resultMessage = await setupShell(options.shell, options.noShellModify);
265
371
  console.log(resultMessage);
372
+ if (options.noShellModify) {
373
+ return;
374
+ }
375
+ console.log("");
376
+ const autostartAns = await askQuestion(chalk.cyan("? Do you want aar daemon to start automatically when you log in? (y/N): "));
377
+ if (autostartAns.toLowerCase().startsWith("y")) {
378
+ try {
379
+ const msg = await setupAutostart();
380
+ console.log(chalk.green(`\u2713 ${msg}`));
381
+ } catch (err) {
382
+ console.error(chalk.red(`\u2717 Failed to setup autostart: ${err?.message}`));
383
+ }
384
+ } else {
385
+ console.log(chalk.gray("Skipped automatic startup configuration. You can start the daemon manually using 'aar daemon start'."));
386
+ }
266
387
  }
267
388
 
268
389
  // src/core/daemon-client.ts
269
390
  import { spawn } from "child_process";
270
- import fs5 from "fs-extra";
391
+ import fs6 from "fs-extra";
271
392
 
272
393
  // src/core/daemon-ipc.ts
273
- import path3 from "path";
274
- import fs3 from "fs-extra";
275
- var PID_FILE = path3.join(BASE_DIR, "daemon.pid");
394
+ import path4 from "path";
395
+ import fs4 from "fs-extra";
396
+ var PID_FILE = path4.join(BASE_DIR, "daemon.pid");
276
397
  async function writePid(pid) {
277
398
  await ensureDirs();
278
- await fs3.writeFile(PID_FILE, pid.toString(), "utf-8");
399
+ await fs4.writeFile(PID_FILE, pid.toString(), "utf-8");
279
400
  }
280
401
  async function readPid() {
281
- if (!await fs3.pathExists(PID_FILE)) {
402
+ if (!await fs4.pathExists(PID_FILE)) {
282
403
  return void 0;
283
404
  }
284
405
  try {
285
- const content = await fs3.readFile(PID_FILE, "utf-8");
406
+ const content = await fs4.readFile(PID_FILE, "utf-8");
286
407
  const pid = parseInt(content.trim(), 10);
287
408
  return isNaN(pid) ? void 0 : pid;
288
409
  } catch {
@@ -290,8 +411,8 @@ async function readPid() {
290
411
  }
291
412
  }
292
413
  async function clearPid() {
293
- if (await fs3.pathExists(PID_FILE)) {
294
- await fs3.remove(PID_FILE);
414
+ if (await fs4.pathExists(PID_FILE)) {
415
+ await fs4.remove(PID_FILE);
295
416
  }
296
417
  }
297
418
  async function isDaemonRunning() {
@@ -312,17 +433,17 @@ async function isDaemonRunning() {
312
433
  }
313
434
 
314
435
  // src/core/logger.ts
315
- import path4 from "path";
316
- import fs4 from "fs-extra";
436
+ import path5 from "path";
437
+ import fs5 from "fs-extra";
317
438
  import chalk2 from "chalk";
318
- var LOG_FILE = path4.join(BASE_DIR, "daemon.log");
439
+ var LOG_FILE = path5.join(BASE_DIR, "daemon.log");
319
440
  var currentLogLevel = 1 /* INFO */;
320
441
  async function writeToFile(message) {
321
442
  try {
322
443
  await ensureDirs();
323
444
  const ts = (/* @__PURE__ */ new Date()).toISOString();
324
445
  const cleanMsg = message.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, "");
325
- await fs4.appendFile(LOG_FILE, `[${ts}] ${cleanMsg}
446
+ await fs5.appendFile(LOG_FILE, `[${ts}] ${cleanMsg}
326
447
  `, "utf-8");
327
448
  } catch {
328
449
  }
@@ -388,8 +509,8 @@ async function startDaemonProcess(options = {}) {
388
509
  cleanArgs.push("--tmux");
389
510
  }
390
511
  console.log("Starting agent-auto-resume daemon in background...");
391
- const outFd = fs5.openSync(LOG_FILE, "a");
392
- const errFd = fs5.openSync(LOG_FILE, "a");
512
+ const outFd = fs6.openSync(LOG_FILE, "a");
513
+ const errFd = fs6.openSync(LOG_FILE, "a");
393
514
  const child = spawn(nodeBin, cleanArgs, {
394
515
  detached: true,
395
516
  stdio: ["ignore", outFd, errFd],
@@ -435,8 +556,8 @@ async function stopDaemonProcess() {
435
556
 
436
557
  // src/core/transcript-watcher.ts
437
558
  import chokidar from "chokidar";
438
- import path5 from "path";
439
- import fs6 from "fs-extra";
559
+ import path6 from "path";
560
+ import fs7 from "fs-extra";
440
561
 
441
562
  // src/core/time-parser.ts
442
563
  function parseTimeString(str, referenceDate = /* @__PURE__ */ new Date()) {
@@ -534,7 +655,15 @@ var claudeProvider = {
534
655
  /5-hour limit reached/i,
535
656
  /usage limit reached/i,
536
657
  /rate limit reached/i,
537
- /limit will reset at/i
658
+ /limit will reset at/i,
659
+ /resource_exhausted/i,
660
+ /exhausted your capacity/i,
661
+ /code 429/i,
662
+ /rate_limit_error/i,
663
+ /rate limit exceeded/i,
664
+ /exceeded your/i,
665
+ /session limit/i,
666
+ /hit your session limit/i
538
667
  ];
539
668
  for (const line of lines) {
540
669
  const matched = patterns.some((p) => p.test(line));
@@ -675,7 +804,7 @@ var codexProvider = {
675
804
  };
676
805
 
677
806
  // src/providers/antigravity.ts
678
- import { execSync as execSync2 } from "child_process";
807
+ import { execSync as execSync3 } from "child_process";
679
808
  var antigravityProvider = {
680
809
  name: "antigravity",
681
810
  displayName: "Google Antigravity CLI",
@@ -696,7 +825,10 @@ var antigravityProvider = {
696
825
  /resets at/i,
697
826
  /resets_at/i,
698
827
  /retry after/i,
699
- /retry_after/i
828
+ /retry_after/i,
829
+ /resource_exhausted/i,
830
+ /exhausted your capacity/i,
831
+ /code 429/i
700
832
  ];
701
833
  for (const line of lines) {
702
834
  const matched = patterns.some((p) => p.test(line));
@@ -716,7 +848,7 @@ var antigravityProvider = {
716
848
  async getResumeCommand(state) {
717
849
  let helpOutput = "";
718
850
  try {
719
- helpOutput = execSync2("agy --help", {
851
+ helpOutput = execSync3("agy --help", {
720
852
  cwd: state.cwd,
721
853
  encoding: "utf-8",
722
854
  stdio: ["ignore", "pipe", "ignore"]
@@ -807,7 +939,7 @@ async function startTranscriptWatcher(abortSignal) {
807
939
  }
808
940
  const dirs = providerConfig.transcriptDirs.map(resolveHome);
809
941
  for (const dir of dirs) {
810
- if (!await fs6.pathExists(dir)) {
942
+ if (!await fs7.pathExists(dir)) {
811
943
  logger.debug(`Transcript watch directory does not exist: ${dir}, skipping`, "aar");
812
944
  continue;
813
945
  }
@@ -829,21 +961,21 @@ async function startTranscriptWatcher(abortSignal) {
829
961
  });
830
962
  }
831
963
  async function handleFileChange(filePath, providerName) {
832
- const ext = path5.extname(filePath).toLowerCase();
964
+ const ext = path6.extname(filePath).toLowerCase();
833
965
  if (ext !== ".json" && ext !== ".jsonl" && ext !== "") {
834
966
  return;
835
967
  }
836
968
  try {
837
- const stat = await fs6.stat(filePath);
969
+ const stat = await fs7.stat(filePath);
838
970
  const startCursor = fileCursors.get(filePath) || 0;
839
971
  if (stat.size <= startCursor) {
840
972
  fileCursors.set(filePath, stat.size);
841
973
  return;
842
974
  }
843
- const fd = await fs6.open(filePath, "r");
975
+ const fd = await fs7.open(filePath, "r");
844
976
  const buffer = Buffer.alloc(stat.size - startCursor);
845
- await fs6.read(fd, buffer, 0, buffer.length, startCursor);
846
- await fs6.close(fd);
977
+ await fs7.read(fd, buffer, 0, buffer.length, startCursor);
978
+ await fs7.close(fd);
847
979
  fileCursors.set(filePath, stat.size);
848
980
  const content = buffer.toString("utf-8");
849
981
  const lines = content.split(/\r?\n/);
@@ -900,7 +1032,7 @@ async function handleFileChange(filePath, providerName) {
900
1032
  }
901
1033
 
902
1034
  // src/core/tmux-watcher.ts
903
- import { execSync as execSync3 } from "child_process";
1035
+ import { execSync as execSync4 } from "child_process";
904
1036
  var tmuxTimer;
905
1037
  async function startTmuxWatcher(abortSignal) {
906
1038
  const config = await loadConfig();
@@ -908,7 +1040,7 @@ async function startTmuxWatcher(abortSignal) {
908
1040
  return;
909
1041
  }
910
1042
  try {
911
- execSync3("tmux -V", { stdio: "ignore" });
1043
+ execSync4("tmux -V", { stdio: "ignore" });
912
1044
  } catch {
913
1045
  logger.warn("tmux is enabled in config, but 'tmux' command was not found. tmux watcher is disabled.", "aar");
914
1046
  return;
@@ -932,7 +1064,7 @@ async function startTmuxWatcher(abortSignal) {
932
1064
  async function checkTmuxPanes() {
933
1065
  let listOutput = "";
934
1066
  try {
935
- listOutput = execSync3("tmux list-panes -a -F '#{pane_id}|#{pane_pid}|#{pane_current_path}|#{pane_current_command}'", {
1067
+ listOutput = execSync4("tmux list-panes -a -F '#{pane_id}|#{pane_pid}|#{pane_current_path}|#{pane_current_command}'", {
936
1068
  encoding: "utf-8",
937
1069
  stdio: ["ignore", "pipe", "ignore"]
938
1070
  });
@@ -957,7 +1089,7 @@ async function checkTmuxPanes() {
957
1089
  }
958
1090
  let paneOutput = "";
959
1091
  try {
960
- paneOutput = execSync3(`tmux capture-pane -p -t ${pane.paneId}`, {
1092
+ paneOutput = execSync4(`tmux capture-pane -p -t ${pane.paneId}`, {
961
1093
  encoding: "utf-8",
962
1094
  stdio: ["ignore", "pipe", "ignore"]
963
1095
  });
@@ -1006,7 +1138,7 @@ async function checkTmuxPanes() {
1006
1138
  }
1007
1139
  function sendKeysToTmux(paneId, keys) {
1008
1140
  try {
1009
- execSync3(`tmux send-keys -t ${paneId} "${keys.replace(/"/g, '\\"')}"`, { stdio: "ignore" });
1141
+ execSync4(`tmux send-keys -t ${paneId} "${keys.replace(/"/g, '\\"')}"`, { stdio: "ignore" });
1010
1142
  return true;
1011
1143
  } catch (err) {
1012
1144
  logger.error(`Failed to send keys to tmux pane ${paneId}: ${err.message}`, "aar");
@@ -1244,7 +1376,7 @@ var AarDaemon = class {
1244
1376
  };
1245
1377
 
1246
1378
  // src/commands/daemon.ts
1247
- import fs7 from "fs-extra";
1379
+ import fs8 from "fs-extra";
1248
1380
  import chalk3 from "chalk";
1249
1381
  async function handleDaemon(action, options) {
1250
1382
  const cleanAction = action.toLowerCase();
@@ -1265,8 +1397,8 @@ async function handleDaemon(action, options) {
1265
1397
  console.log(chalk3.red("Daemon is STOPPED"));
1266
1398
  }
1267
1399
  } else if (cleanAction === "logs") {
1268
- if (await fs7.pathExists(LOG_FILE)) {
1269
- const content = await fs7.readFile(LOG_FILE, "utf-8");
1400
+ if (await fs8.pathExists(LOG_FILE)) {
1401
+ const content = await fs8.readFile(LOG_FILE, "utf-8");
1270
1402
  console.log(content);
1271
1403
  } else {
1272
1404
  console.log("No log file found.");
@@ -1690,31 +1822,31 @@ async function runRetryNow(options) {
1690
1822
  }
1691
1823
 
1692
1824
  // src/commands/integrate.ts
1693
- import fs8 from "fs-extra";
1694
- import path6 from "path";
1695
- import os2 from "os";
1696
- import { execSync as execSync4 } from "child_process";
1825
+ import fs9 from "fs-extra";
1826
+ import path7 from "path";
1827
+ import os3 from "os";
1828
+ import { execSync as execSync5 } from "child_process";
1697
1829
  function resolveHome2(p) {
1698
1830
  if (p.startsWith("~")) {
1699
- return path6.join(os2.homedir(), p.slice(1));
1831
+ return path7.join(os3.homedir(), p.slice(1));
1700
1832
  }
1701
1833
  return p;
1702
1834
  }
1703
- function getAarPath() {
1835
+ function getAarPath2() {
1704
1836
  try {
1705
- const whichAar = execSync4("which aar", { encoding: "utf8" }).trim();
1837
+ const whichAar = execSync5("which aar", { encoding: "utf8" }).trim();
1706
1838
  if (whichAar) return whichAar;
1707
1839
  } catch {
1708
1840
  }
1709
- const home = os2.homedir();
1841
+ const home = os3.homedir();
1710
1842
  const possiblePaths = [
1711
- path6.join(home, ".hermes/node/bin/aar"),
1712
- path6.join(home, ".npm-global/bin/aar"),
1843
+ path7.join(home, ".hermes/node/bin/aar"),
1844
+ path7.join(home, ".npm-global/bin/aar"),
1713
1845
  "/usr/local/bin/aar",
1714
1846
  "/opt/homebrew/bin/aar"
1715
1847
  ];
1716
1848
  for (const p of possiblePaths) {
1717
- if (fs8.existsSync(p)) return p;
1849
+ if (fs9.existsSync(p)) return p;
1718
1850
  }
1719
1851
  return "aar";
1720
1852
  }
@@ -1776,7 +1908,7 @@ fi
1776
1908
  ]
1777
1909
  };
1778
1910
  async function runIntegrate(appName) {
1779
- const aarPath = getAarPath();
1911
+ const aarPath = getAarPath2();
1780
1912
  const keys = appName === "all" ? Object.keys(targets) : [appName];
1781
1913
  for (const key of keys) {
1782
1914
  const appTargets = targets[key];
@@ -1788,18 +1920,18 @@ async function runIntegrate(appName) {
1788
1920
  for (const t of appTargets) {
1789
1921
  const orig = resolveHome2(t.originalPath);
1790
1922
  const backup = resolveHome2(t.backupPath);
1791
- if (!fs8.existsSync(orig) && !fs8.existsSync(backup)) {
1923
+ if (!fs9.existsSync(orig) && !fs9.existsSync(backup)) {
1792
1924
  console.warn(` [Skip] ${t.name} not found at ${orig}`);
1793
1925
  continue;
1794
1926
  }
1795
1927
  try {
1796
- if (!fs8.existsSync(backup)) {
1797
- await fs8.move(orig, backup);
1928
+ if (!fs9.existsSync(backup)) {
1929
+ await fs9.move(orig, backup);
1798
1930
  console.log(` [Backuped] ${orig} -> ${backup}`);
1799
1931
  }
1800
1932
  const content = t.getWrapperContent(aarPath);
1801
- await fs8.writeFile(orig, content, "utf-8");
1802
- await fs8.chmod(orig, 493);
1933
+ await fs9.writeFile(orig, content, "utf-8");
1934
+ await fs9.chmod(orig, 493);
1803
1935
  console.log(` [Integrated] Created wrapper at ${orig}`);
1804
1936
  } catch (err) {
1805
1937
  console.error(` [Error] Failed to integrate ${t.name}: ${err?.message}`);
@@ -1820,15 +1952,15 @@ async function runUnintegrate(appName) {
1820
1952
  for (const t of appTargets) {
1821
1953
  const orig = resolveHome2(t.originalPath);
1822
1954
  const backup = resolveHome2(t.backupPath);
1823
- if (!fs8.existsSync(backup)) {
1955
+ if (!fs9.existsSync(backup)) {
1824
1956
  console.warn(` [Skip] Backup for ${t.name} not found at ${backup}`);
1825
1957
  continue;
1826
1958
  }
1827
1959
  try {
1828
- if (fs8.existsSync(orig)) {
1829
- await fs8.remove(orig);
1960
+ if (fs9.existsSync(orig)) {
1961
+ await fs9.remove(orig);
1830
1962
  }
1831
- await fs8.move(backup, orig);
1963
+ await fs9.move(backup, orig);
1832
1964
  console.log(` [Restored] Reverted ${backup} -> ${orig}`);
1833
1965
  } catch (err) {
1834
1966
  console.error(` [Error] Failed to unintegrate ${t.name}: ${err?.message}`);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/core/session-store.ts","../src/core/shell-setup.ts","../src/commands/setup.ts","../src/core/daemon-client.ts","../src/core/daemon-ipc.ts","../src/core/logger.ts","../src/core/transcript-watcher.ts","../src/core/time-parser.ts","../src/providers/claude.ts","../src/prompts/safe-resume.ts","../src/providers/codex.ts","../src/providers/antigravity.ts","../src/providers/index.ts","../src/core/detector.ts","../src/core/tmux-watcher.ts","../src/core/scheduler.ts","../src/core/process-manager.ts","../src/core/daemon.ts","../src/commands/daemon.ts","../src/core/pty-runner.ts","../src/commands/managed.ts","../src/commands/run.ts","../src/commands/status.ts","../src/commands/sessions.ts","../src/commands/recover.ts","../src/commands/retry-now.ts","../src/commands/integrate.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { runSetup } from \"./commands/setup.js\";\nimport { handleDaemon } from \"./commands/daemon.js\";\nimport { runManaged } from \"./commands/managed.js\";\nimport { runGeneric } from \"./commands/run.js\";\nimport { runStatus } from \"./commands/status.js\";\nimport { runSessions } from \"./commands/sessions.js\";\nimport { runRecover } from \"./commands/recover.js\";\nimport { runRetryNow } from \"./commands/retry-now.js\";\nimport { runIntegrate, runUnintegrate } from \"./commands/integrate.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"aar\")\n .description(\"Daemon-based auto-resume CLI tool for Claude Code, Codex, and Antigravity\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"setup\")\n .description(\"Setup state directories, configuration, and shell integration\")\n .option(\"--shell <type>\", \"Specify shell type (zsh, bash, fish)\")\n .option(\"--no-shell-modify\", \"Do not modify shell configuration files automatically\")\n .option(\"--print-shell-snippet\", \"Only print the shell snippet to stdout\")\n .action(runSetup);\n\nprogram\n .command(\"daemon <action>\")\n .description(\"Manage the agent-auto-resume daemon (actions: start, stop, restart, status, logs, run)\")\n .option(\"--tmux\", \"Enable experimental tmux watcher\")\n .action((action, options) => handleDaemon(action, options));\n\nprogram\n .command(\"managed <provider>\")\n .description(\"Run a CLI tool in managed mode under PTY\")\n .argument(\"[command...]\", \"Command to execute (e.g. claude, codex, agy)\")\n .action((provider, args) => runManaged(provider, args));\n\nprogram\n .command(\"run\")\n .description(\"Generic run command to wrap any agent CLI under a provider\")\n .option(\"--provider <provider>\", \"Specify provider (claude, codex, antigravity)\")\n .argument(\"[command...]\", \"Command to execute\")\n .action((args, options) => {\n // '--' の後の引数は args として渡される\n runGeneric(options, args);\n });\n\nprogram\n .command(\"status\")\n .description(\"Show daemon status, waiting sessions, and next resume schedules\")\n .option(\"--json\", \"Format output as JSON\")\n .action(runStatus);\n\nprogram\n .command(\"sessions\")\n .description(\"List all saved sessions and their statuses\")\n .option(\"--json\", \"Format output as JSON\")\n .action(runSessions);\n\nprogram\n .command(\"recover\")\n .description(\"Manually recover waiting, failed, or cancelled sessions\")\n .option(\"--last\", \"Recover the most recent session\")\n .option(\"--id <session-id>\", \"Recover session by ID\")\n .action(runRecover);\n\nprogram\n .command(\"retry-now\")\n .description(\"Retry waiting sessions immediately\")\n .option(\"--id <session-id>\", \"Session ID to retry\")\n .option(\"--last\", \"Retry the most recent waiting session\")\n .option(\"--force\", \"Force retry even if reset time has not passed\")\n .action(runRetryNow);\n\nprogram\n .command(\"integrate <app>\")\n .description(\"Integrate desktop application binary with aar (app: codex, antigravity, all)\")\n .action(runIntegrate);\n\nprogram\n .command(\"unintegrate <app>\")\n .description(\"Restore original application binary and remove wrapper (app: codex, antigravity, all)\")\n .action(runUnintegrate);\n\n\n// One-shot wrapper commands\n// これらはサブコマンド以下のすべてのオプションや引数をラップして managed mode に渡します。\nprogram\n .command(\"claude\")\n .description(\"One-shot wrapper to run Claude Code in managed mode\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"claude\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"claude\", [\"claude\", ...forwardedArgs]);\n });\n\nprogram\n .command(\"codex\")\n .description(\"One-shot wrapper to run Codex CLI in managed mode\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"codex\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"codex\", [\"codex\", ...forwardedArgs]);\n });\n\nprogram\n .command(\"antigravity\")\n .description(\"One-shot wrapper to run Antigravity CLI in managed mode\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"antigravity\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"antigravity\", [\"agy\", ...forwardedArgs]);\n });\n\nprogram\n .command(\"agy\")\n .description(\"Alias for antigravity command\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"agy\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"antigravity\", [\"agy\", ...forwardedArgs]);\n });\n\nprogram.parse(process.argv);\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { nanoid } from \"nanoid\";\nimport { SessionState, SessionStatus, AarConfig } from \"./types.js\";\n\nconst DEFAULT_BASE_DIR = path.join(os.homedir(), \".agent-auto-resume\");\nexport const BASE_DIR = process.env.AAR_BASE_DIR || DEFAULT_BASE_DIR;\nexport const SESSIONS_DIR = path.join(BASE_DIR, \"sessions\");\nexport const EVENTS_DIR = path.join(BASE_DIR, \"events\");\nexport const SHIMS_DIR = path.join(BASE_DIR, \"shims\");\nexport const CONFIG_FILE = path.join(BASE_DIR, \"config.json\");\n\nexport function resolveHome(filepath: string): string {\n if (filepath.startsWith(\"~\")) {\n return path.join(os.homedir(), filepath.slice(1));\n }\n return filepath;\n}\n\nexport async function ensureDirs() {\n await fs.ensureDir(BASE_DIR);\n await fs.ensureDir(SESSIONS_DIR);\n await fs.ensureDir(EVENTS_DIR);\n await fs.ensureDir(SHIMS_DIR);\n}\n\nexport const DEFAULT_CONFIG: AarConfig = {\n version: 1,\n bufferSeconds: 120,\n maxAttempts: 5,\n providers: {\n claude: {\n enabled: true,\n command: \"claude\",\n watchTranscripts: true,\n transcriptDirs: [\"~/.claude/projects\"],\n },\n codex: {\n enabled: true,\n command: \"codex\",\n watchTranscripts: true,\n transcriptDirs: [\"~/.codex/sessions\"],\n },\n antigravity: {\n enabled: true,\n command: \"agy\",\n experimental: true,\n watchTranscripts: false,\n transcriptDirs: [],\n },\n },\n tmux: {\n enabled: false,\n pollIntervalMs: 5000,\n },\n daemon: {\n pollIntervalMs: 5000,\n },\n};\n\nexport async function loadConfig(): Promise<AarConfig> {\n await ensureDirs();\n if (await fs.pathExists(CONFIG_FILE)) {\n try {\n const data = await fs.readJson(CONFIG_FILE);\n // 深いマージを簡易的に行う\n return {\n ...DEFAULT_CONFIG,\n ...data,\n providers: {\n claude: { ...DEFAULT_CONFIG.providers.claude, ...data.providers?.claude },\n codex: { ...DEFAULT_CONFIG.providers.codex, ...data.providers?.codex },\n antigravity: { ...DEFAULT_CONFIG.providers.antigravity, ...data.providers?.antigravity },\n },\n tmux: { ...DEFAULT_CONFIG.tmux, ...data.tmux },\n daemon: { ...DEFAULT_CONFIG.daemon, ...data.daemon },\n };\n } catch {\n return DEFAULT_CONFIG;\n }\n }\n await fs.writeJson(CONFIG_FILE, DEFAULT_CONFIG, { spaces: 2 });\n return DEFAULT_CONFIG;\n}\n\nexport async function saveConfig(config: AarConfig): Promise<void> {\n await ensureDirs();\n await fs.writeJson(CONFIG_FILE, config, { spaces: 2 });\n}\n\nexport async function createSession(\n state: Omit<SessionState, \"id\" | \"createdAt\" | \"updatedAt\"> & { id?: string }\n): Promise<SessionState> {\n await ensureDirs();\n const id = state.id || nanoid(10);\n const now = new Date().toISOString();\n const session: SessionState = {\n ...state,\n id,\n createdAt: now,\n updatedAt: now,\n };\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n await fs.writeJson(sessionPath, session, { spaces: 2 });\n return session;\n}\n\nexport async function updateSession(id: string, updates: Partial<SessionState>): Promise<SessionState> {\n await ensureDirs();\n const session = await getSession(id);\n if (!session) {\n throw new Error(`Session ${id} not found`);\n }\n const updated: SessionState = {\n ...session,\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n await fs.writeJson(sessionPath, updated, { spaces: 2 });\n return updated;\n}\n\nexport async function getSession(id: string): Promise<SessionState | undefined> {\n await ensureDirs();\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n if (!(await fs.pathExists(sessionPath))) {\n return undefined;\n }\n try {\n return await fs.readJson(sessionPath);\n } catch {\n return undefined;\n }\n}\n\nexport async function listSessions(): Promise<SessionState[]> {\n await ensureDirs();\n const files = await fs.readdir(SESSIONS_DIR);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\"));\n const sessions: SessionState[] = [];\n for (const file of jsonFiles) {\n try {\n const session = await fs.readJson(path.join(SESSIONS_DIR, file));\n sessions.push(session);\n } catch {\n // 破損ファイルは無視\n }\n }\n return sessions.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n}\n\nexport async function getLastSession(): Promise<SessionState | undefined> {\n const sessions = await listSessions();\n return sessions[0];\n}\n\nexport async function getRecoverableSessions(): Promise<SessionState[]> {\n const sessions = await listSessions();\n const recoverableStatuses: SessionStatus[] = [\"waiting_limit_reset\", \"ready_to_resume\", \"failed\", \"resuming\"];\n return sessions.filter((s) => recoverableStatuses.includes(s.status));\n}\n\nexport async function getWaitingSessions(): Promise<SessionState[]> {\n const sessions = await listSessions();\n return sessions.filter((s) => s.status === \"waiting_limit_reset\");\n}\n\nexport async function deleteSession(id: string): Promise<void> {\n await ensureDirs();\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n if (await fs.pathExists(sessionPath)) {\n await fs.remove(sessionPath);\n }\n}\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { resolveHome } from \"./session-store.js\";\n\nexport type ShellType = \"zsh\" | \"bash\" | \"fish\";\n\n/**\n * ユーザーの環境変数等から現在のシェルを自動検出する。\n */\nexport function detectShell(): ShellType {\n const shellEnv = process.env.SHELL || \"\";\n if (shellEnv.includes(\"zsh\")) {\n return \"zsh\";\n }\n if (shellEnv.includes(\"fish\")) {\n return \"fish\";\n }\n return \"bash\";\n}\n\n/**\n * 各シェルのrcファイルへのパスを取得する。\n */\nexport function getShellRcPath(shell: ShellType): string {\n if (shell === \"zsh\") {\n return resolveHome(\"~/.zshrc\");\n }\n if (shell === \"fish\") {\n return resolveHome(\"~/.config/fish/config.fish\");\n }\n return resolveHome(\"~/.bashrc\");\n}\n\nexport const ZSH_BASH_SNIPPET = `\n# agent-auto-resume\nif command -v aar >/dev/null 2>&1; then\n claude() { aar managed claude -- claude \"$@\"; }\n codex() { aar managed codex -- codex \"$@\"; }\n agy() { aar managed antigravity -- agy \"$@\"; }\nfi\n`;\n\nexport const FISH_SNIPPET = `\n# agent-auto-resume\nfunction claude\n aar managed claude -- claude $argv\nend\n\nfunction codex\n aar managed codex -- codex $argv\nend\n\nfunction agy\n aar managed antigravity -- agy $argv\nend\n`;\n\n/**\n * シェルに応じた設定スニペットを取得する。\n */\nexport function getSnippet(shell: ShellType): string {\n return shell === \"fish\" ? FISH_SNIPPET.trim() : ZSH_BASH_SNIPPET.trim();\n}\n\n/**\n * シェルのrcファイルに対して統合用関数のスニペットを追記・設定する。\n * @param shell 対象シェル。未指定の場合は自動検出する。\n * @param noModify 実際にrcファイルを変更せず、案内メッセージのみを取得する。\n */\nexport async function setupShell(shell?: ShellType, noModify = false): Promise<string> {\n const targetShell = shell || detectShell();\n const rcPath = getShellRcPath(targetShell);\n const snippet = getSnippet(targetShell);\n\n if (noModify) {\n return `Please manually append the following snippet to your shell config file (${rcPath}):\\n\\n${snippet}`;\n }\n\n await fs.ensureDir(path.dirname(rcPath));\n\n let exists = false;\n let content = \"\";\n if (await fs.pathExists(rcPath)) {\n content = await fs.readFile(rcPath, \"utf-8\");\n if (content.includes(\"agent-auto-resume\") || content.includes(\"aar managed\")) {\n exists = true;\n }\n }\n\n if (exists) {\n return `Shell integration snippet already exists in ${rcPath}. Skipping configuration.`;\n }\n\n const newContent = content ? `${content.trimEnd()}\\n\\n${snippet}\\n` : `${snippet}\\n`;\n await fs.writeFile(rcPath, newContent, \"utf-8\");\n return `Successfully updated shell configuration at ${rcPath}.\\nRestart your terminal or run: source ${rcPath}`;\n}\n","import { ensureDirs, loadConfig } from \"../core/session-store.js\";\nimport { setupShell, ShellType, getSnippet } from \"../core/shell-setup.js\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\nexport interface SetupOptions {\n shell?: ShellType;\n noShellModify?: boolean;\n printShellSnippet?: boolean;\n}\n\nexport async function runSetup(options: SetupOptions) {\n console.log(chalk.bold(\"Starting agent-auto-resume setup...\\n\"));\n\n await ensureDirs();\n console.log(chalk.green(\"✓ Initialized state directory at ~/.agent-auto-resume/\"));\n\n await loadConfig();\n console.log(chalk.green(\"✓ Created configuration file config.json\"));\n\n const providers = [\n { name: \"Claude Code\", cmd: \"claude\" },\n { name: \"OpenAI Codex CLI\", cmd: \"codex\" },\n { name: \"Google Antigravity CLI\", cmd: \"agy\" },\n ];\n\n console.log(\"\\nChecking provider CLI commands:\");\n for (const p of providers) {\n try {\n execSync(`which ${p.cmd}`, { stdio: \"ignore\" });\n console.log(chalk.green(` ✓ ${p.name} (${p.cmd}) is installed.`));\n } catch {\n console.log(chalk.yellow(` ⚠ ${p.name} (${p.cmd}) was not found in your PATH.`));\n }\n }\n\n if (options.printShellSnippet) {\n const shell = options.shell || \"zsh\";\n console.log(`\\n--- Shell Snippet for ${shell} ---`);\n console.log(getSnippet(shell));\n console.log(\"---------------------------------\");\n return;\n }\n\n console.log(\"\");\n const resultMessage = await setupShell(options.shell, options.noShellModify);\n console.log(resultMessage);\n}\n","import { spawn } from \"child_process\";\nimport fs from \"fs-extra\";\nimport { isDaemonRunning, readPid } from \"./daemon-ipc.js\";\nimport { LOG_FILE } from \"./logger.js\";\nimport { ensureDirs } from \"./session-store.js\";\n\n/**\n * デーモンをバックグラウンドプロセスとして起動する。\n */\nexport async function startDaemonProcess(options: { tmux?: boolean } = {}): Promise<void> {\n if (await isDaemonRunning()) {\n const pid = await readPid();\n console.log(`Daemon is already running (PID: ${pid}).`);\n return;\n }\n\n await ensureDirs();\n\n const nodeBin = process.argv[0];\n const originalArgs = process.argv.slice(1);\n \n // 'start' 引数を 'run' に置換\n const args = originalArgs.map((arg) => {\n if (arg === \"start\") return \"run\";\n return arg;\n });\n\n // 'run' サブコマンドが含まれていない場合は追加\n if (!args.includes(\"run\")) {\n const daemonIdx = args.indexOf(\"daemon\");\n if (daemonIdx !== -1) {\n args.splice(daemonIdx + 1, 0, \"run\");\n }\n }\n\n // 重複フラグなどのクリーンアップ\n // '--tmux' が重複して指定されないように調整\n const cleanArgs = args.filter((a) => a !== \"start\" && a !== \"restart\");\n if (options.tmux && !cleanArgs.includes(\"--tmux\")) {\n cleanArgs.push(\"--tmux\");\n }\n\n console.log(\"Starting agent-auto-resume daemon in background...\");\n\n const outFd = fs.openSync(LOG_FILE, \"a\");\n const errFd = fs.openSync(LOG_FILE, \"a\");\n\n const child = spawn(nodeBin, cleanArgs, {\n detached: true,\n stdio: [\"ignore\", outFd, errFd],\n env: {\n ...process.env,\n },\n });\n\n child.unref();\n\n // 起動完了を最大2秒待つ\n for (let i = 0; i < 4; i++) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (await isDaemonRunning()) {\n const pid = await readPid();\n console.log(`Daemon started successfully (PID: ${pid}). Log file: ${LOG_FILE}`);\n return;\n }\n }\n\n console.error(\"Failed to start daemon. Please check the log file for errors:\");\n console.error(LOG_FILE);\n}\n\n/**\n * デーモンプロセスを停止する。\n */\nexport async function stopDaemonProcess(): Promise<void> {\n const pid = await readPid();\n if (!pid || !(await isDaemonRunning())) {\n console.log(\"Daemon is not running.\");\n return;\n }\n\n console.log(`Stopping daemon (PID: ${pid})...`);\n try {\n process.kill(pid, \"SIGTERM\");\n \n // 停止するまでポーリングで待つ (最大5秒)\n for (let i = 0; i < 10; i++) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (!(await isDaemonRunning())) {\n console.log(\"Daemon stopped successfully.\");\n return;\n }\n }\n \n console.warn(\"Daemon did not respond to SIGTERM. Force killing...\");\n process.kill(pid, \"SIGKILL\");\n console.log(\"Daemon force killed.\");\n } catch (err: any) {\n console.error(`Failed to stop daemon: ${err.message}`);\n }\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport { BASE_DIR, ensureDirs } from \"./session-store.js\";\n\nexport const PID_FILE = path.join(BASE_DIR, \"daemon.pid\");\n\nexport async function writePid(pid: number): Promise<void> {\n await ensureDirs();\n await fs.writeFile(PID_FILE, pid.toString(), \"utf-8\");\n}\n\nexport async function readPid(): Promise<number | undefined> {\n if (!(await fs.pathExists(PID_FILE))) {\n return undefined;\n }\n try {\n const content = await fs.readFile(PID_FILE, \"utf-8\");\n const pid = parseInt(content.trim(), 10);\n return isNaN(pid) ? undefined : pid;\n } catch {\n return undefined;\n }\n}\n\nexport async function clearPid(): Promise<void> {\n if (await fs.pathExists(PID_FILE)) {\n await fs.remove(PID_FILE);\n }\n}\n\nexport async function isDaemonRunning(): Promise<boolean> {\n const pid = await readPid();\n if (!pid) {\n return false;\n }\n try {\n // pid にシグナル 0 を送って生存確認\n process.kill(pid, 0);\n return true;\n } catch (err: any) {\n if (err.code === \"ESRCH\") {\n // 存在しないプロセスなのでPIDファイルをクリーンアップ\n await clearPid();\n return false;\n }\n // EPERM の場合は権限不足だがプロセスは存在している\n return err.code === \"EPERM\";\n }\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport { BASE_DIR, ensureDirs } from \"./session-store.js\";\n\nexport const LOG_FILE = path.join(BASE_DIR, \"daemon.log\");\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nlet currentLogLevel = LogLevel.INFO;\n\nexport function setLogLevel(level: LogLevel) {\n currentLogLevel = level;\n}\n\nasync function writeToFile(message: string) {\n try {\n await ensureDirs();\n const ts = new Date().toISOString();\n // 制御文字 (chalkのカラーコードなど) を削除してログファイルに保存\n const cleanMsg = message.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, \"\");\n await fs.appendFile(LOG_FILE, `[${ts}] ${cleanMsg}\\n`, \"utf-8\");\n } catch {\n // ログ書き込み失敗は静かに無視\n }\n}\n\nfunction formatMessage(prefix: string, message: string, colorFn?: (s: string) => string): string {\n const cleanPrefix = prefix ? `[${prefix}] ` : \"\";\n const formatted = `${cleanPrefix}${message}`;\n return colorFn ? colorFn(formatted) : formatted;\n}\n\nexport const logger = {\n debug(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.DEBUG) {\n const msg = formatMessage(prefix, message, chalk.gray);\n console.log(msg);\n writeToFile(msg);\n }\n },\n\n info(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.INFO) {\n const msg = formatMessage(prefix, message, chalk.blue);\n console.log(msg);\n writeToFile(msg);\n }\n },\n\n warn(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.WARN) {\n const msg = formatMessage(prefix, message, chalk.yellow);\n console.warn(msg);\n writeToFile(msg);\n }\n },\n\n error(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.ERROR) {\n const msg = formatMessage(prefix, message, chalk.red);\n console.error(msg);\n writeToFile(msg);\n }\n },\n};\n","import chokidar from \"chokidar\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { loadConfig, resolveHome, createSession, listSessions, updateSession } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { getProvider } from \"../providers/index.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { ProviderName } from \"./types.js\";\n\nconst fileCursors = new Map<string, number>();\n\nexport async function startTranscriptWatcher(abortSignal?: AbortSignal) {\n const config = await loadConfig();\n const watchers: chokidar.FSWatcher[] = [];\n\n const providersToWatch: ProviderName[] = [\"claude\", \"codex\"];\n\n for (const providerName of providersToWatch) {\n const providerConfig = config.providers[providerName];\n if (!providerConfig || !providerConfig.enabled || !providerConfig.watchTranscripts) {\n continue;\n }\n\n const provider = getProvider(providerName);\n if (!provider.parseTranscriptEvent || !provider.getTranscriptDirs) {\n continue;\n }\n\n const dirs = providerConfig.transcriptDirs.map(resolveHome);\n\n for (const dir of dirs) {\n if (!(await fs.pathExists(dir))) {\n logger.debug(`Transcript watch directory does not exist: ${dir}, skipping`, \"aar\");\n continue;\n }\n\n logger.info(`Starting transcript watcher for ${provider.displayName} at ${dir}`, \"aar\");\n const watcher = chokidar.watch(dir, {\n persistent: true,\n ignoreInitial: false,\n });\n\n watcher.on(\"add\", (filePath) => handleFileChange(filePath, providerName));\n watcher.on(\"change\", (filePath) => handleFileChange(filePath, providerName));\n watchers.push(watcher);\n }\n }\n\n abortSignal?.addEventListener(\"abort\", () => {\n for (const w of watchers) {\n w.close();\n }\n logger.info(\"Transcript watchers stopped.\", \"aar\");\n });\n}\n\nasync function handleFileChange(filePath: string, providerName: ProviderName) {\n const ext = path.extname(filePath).toLowerCase();\n if (ext !== \".json\" && ext !== \".jsonl\" && ext !== \"\") {\n return;\n }\n\n try {\n const stat = await fs.stat(filePath);\n const startCursor = fileCursors.get(filePath) || 0;\n \n if (stat.size <= startCursor) {\n fileCursors.set(filePath, stat.size);\n return;\n }\n\n const fd = await fs.open(filePath, \"r\");\n const buffer = Buffer.alloc(stat.size - startCursor);\n await fs.read(fd, buffer, 0, buffer.length, startCursor);\n await fs.close(fd);\n\n fileCursors.set(filePath, stat.size);\n\n const content = buffer.toString(\"utf-8\");\n const lines = content.split(/\\r?\\n/);\n const provider = getProvider(providerName);\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n const event = provider.parseTranscriptEvent!(line);\n if (event && event.text) {\n const detection = detectLimit(event.text, providerName);\n if (detection.matched) {\n logger.warn(`Limit detected via transcript watcher in file ${filePath}: ${detection.reason}`, \"aar\");\n\n const sessions = await listSessions();\n const matchedSession = sessions.find(\n (s) =>\n s.status === \"running\" &&\n s.provider === providerName &&\n (event.cwd ? s.cwd === event.cwd : true)\n );\n\n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n\n if (matchedSession) {\n if (matchedSession.status !== \"waiting_limit_reset\") {\n await updateSession(matchedSession.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: event.text.slice(-1000),\n transcriptPath: filePath,\n });\n logger.info(`Updated existing session ${matchedSession.id} to waiting_limit_reset`, \"aar\");\n }\n } else {\n const config = await loadConfig();\n const newSession = await createSession({\n provider: providerName,\n cwd: event.cwd || process.cwd(),\n originalCommand: provider.defaultCommand,\n resumeStrategy: providerName === \"claude\" ? \"pty-input\" : \"command\",\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n attempts: 0,\n maxAttempts: config.maxAttempts,\n bufferSeconds: config.bufferSeconds,\n lastOutputSnippet: event.text.slice(-1000),\n managedByAar: false,\n source: \"transcript-watcher\",\n transcriptPath: filePath,\n });\n logger.info(`Created new session ${newSession.id} via transcript-watcher`, \"aar\");\n }\n }\n }\n }\n } catch (err: any) {\n logger.debug(`Error reading transcript file ${filePath}: ${err.message}`, \"aar\");\n }\n}\n","export function parseTimeString(str: string, referenceDate: Date = new Date()): Date | undefined {\n // 1. retry_after (秒数)\n // \"retry_after\": 3600, retry_after: 3600, retry after 3600 seconds など\n const retryAfterRegex = /(?:retry_after|retry after)[\"'\\s]*:?\\s*(\\d+)/i;\n const retryAfterMatch = str.match(retryAfterRegex);\n if (retryAfterMatch) {\n const seconds = parseInt(retryAfterMatch[1], 10);\n if (!isNaN(seconds)) {\n return new Date(referenceDate.getTime() + seconds * 1000);\n }\n }\n\n // 2. ISO8601\n // 2026-06-06T15:00:00+09:00, 2026-06-06T15:00:00Z など\n const isoRegex = /(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?)/i;\n const isoMatch = str.match(isoRegex);\n if (isoMatch) {\n const parsed = Date.parse(isoMatch[1]);\n if (!isNaN(parsed)) {\n return new Date(parsed);\n }\n }\n\n // 3. YYYY-MM-DD HH:mm(:ss)?\n // 2026-06-06 15:00\n const dateStrRegex = /(\\d{4})-(\\d{2})-(\\d{2})\\s+(\\d{1,2}):(\\d{2})(?::(\\d{2}))?/;\n const dateStrMatch = str.match(dateStrRegex);\n if (dateStrMatch) {\n const year = parseInt(dateStrMatch[1], 10);\n const month = parseInt(dateStrMatch[2], 10) - 1; // 0-indexed\n const day = parseInt(dateStrMatch[3], 10);\n const hour = parseInt(dateStrMatch[4], 10);\n const minute = parseInt(dateStrMatch[5], 10);\n const second = dateStrMatch[6] ? parseInt(dateStrMatch[6], 10) : 0;\n const date = new Date(year, month, day, hour, minute, second);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n\n // 4. 時刻のみの表現 (3pm, 3 PM, 15:00, 6:34 AM, resets at 3pm, try again at 6:34 AM など)\n // まず、リセット指示のキーワードに続く時刻表記を探す\n const keywordTimeRegex = /(?:reset|resets|resets_at|try again|try\\s+again\\s+at|at|resets\\s+at|will\\s+reset\\s+at)\\s+(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)?/i;\n const keywordTimeMatch = str.match(keywordTimeRegex);\n\n let hourStr = \"\";\n let minStr = \"\";\n let ampmStr = \"\";\n\n if (keywordTimeMatch) {\n hourStr = keywordTimeMatch[1];\n minStr = keywordTimeMatch[2] || \"0\";\n ampmStr = keywordTimeMatch[3] || \"\";\n } else {\n // 単体での時刻表現に完全一致するか試す\n const exactTimeRegex = /^\\s*(?:at\\s+)?(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)?\\s*$/i;\n const exactMatch = str.match(exactTimeRegex);\n if (exactMatch) {\n hourStr = exactMatch[1];\n minStr = exactMatch[2] || \"0\";\n ampmStr = exactMatch[3] || \"\";\n } else {\n // 部分一致で時刻表現を探す (例: 15:00 や 3pm, 6:34 AM)\n // \"5-hour\" や \"3600\" などの数値単体を誤検知しないよう、コロン(:)を含むか am/pm を伴うものに限定\n const partialTimeRegex = /\\b(\\d{1,2}):(\\d{2})\\s*(am|pm)?\\b|\\b(\\d{1,2})\\s*(am|pm)\\b/i;\n const partialMatch = str.match(partialTimeRegex);\n if (partialMatch) {\n if (partialMatch[1] !== undefined) {\n hourStr = partialMatch[1];\n minStr = partialMatch[2];\n ampmStr = partialMatch[3] || \"\";\n } else {\n hourStr = partialMatch[4];\n minStr = \"0\";\n ampmStr = partialMatch[5];\n }\n }\n }\n }\n\n if (hourStr) {\n let hour = parseInt(hourStr, 10);\n const minute = parseInt(minStr, 10);\n const ampm = ampmStr.toLowerCase();\n\n if (ampm === \"pm\" && hour < 12) {\n hour += 12;\n } else if (ampm === \"am\" && hour === 12) {\n hour = 0;\n }\n\n if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60) {\n const date = new Date(referenceDate);\n date.setHours(hour, minute, 0, 0);\n\n // 設定された時刻が referenceDate (現在時刻) よりも過去であれば翌日とする\n if (date.getTime() <= referenceDate.getTime()) {\n date.setDate(date.getDate() + 1);\n }\n return date;\n }\n }\n\n return undefined;\n}\n","import { AgentProvider, LimitDetection, SessionState } from \"../core/types.js\";\nimport { parseTimeString } from \"../core/time-parser.js\";\n\nexport const claudeProvider: AgentProvider = {\n name: \"claude\",\n displayName: \"Claude Code\",\n defaultCommand: [\"claude\"],\n\n detectLimit(output: string): LimitDetection {\n const lines = output.split(/\\r?\\n/);\n const patterns = [\n /5-hour limit reached/i,\n /usage limit reached/i,\n /rate limit reached/i,\n /limit will reset at/i,\n ];\n\n for (const line of lines) {\n const matched = patterns.some((p) => p.test(line));\n if (matched) {\n const resetAt = parseTimeString(line);\n return {\n matched: true,\n provider: \"claude\",\n reason: line.trim(),\n resetAt,\n raw: line,\n };\n }\n }\n\n return { matched: false, provider: \"claude\" };\n },\n\n getResumeCommand(state: SessionState): string[] {\n return [\"claude\", \"--continue\"];\n },\n\n getResumeInput(state: SessionState): string {\n return \"continue\\n\";\n },\n\n getTranscriptDirs(): string[] {\n return [\"~/.claude/projects\"];\n },\n\n parseTranscriptEvent(line: string) {\n try {\n const data = JSON.parse(line);\n if (data && typeof data === \"object\") {\n // text フィールドは data.text や data.message, または data.input.text など\n let text = data.text || data.message || data.content;\n if (!text && data.input && typeof data.input === \"object\") {\n text = data.input.text;\n }\n if (!text && data.output && typeof data.output === \"object\") {\n text = data.output.text;\n }\n return {\n text: typeof text === \"string\" ? text : undefined,\n cwd: typeof data.cwd === \"string\" ? data.cwd : undefined,\n sessionId: typeof data.sessionId === \"string\" ? data.sessionId : (typeof data.uuid === \"string\" ? data.uuid : undefined),\n timestamp: typeof data.timestamp === \"string\" ? data.timestamp : (typeof data.createdAt === \"string\" ? data.createdAt : undefined),\n };\n }\n } catch {\n // JSONパースエラーは無視\n }\n return undefined;\n },\n};\n","export const CODEX_SAFE_RESUME_PROMPT = `\nContinue the previous task from where it stopped.\n\nBefore making changes:\n1. Inspect the current repository state.\n2. Run git status.\n3. Inspect git diff.\n4. Read AGENT_PROGRESS.md if it exists.\n5. Identify what was already completed and what remains.\n6. Do not overwrite user changes.\n7. Continue only the remaining work.\n8. Run relevant tests if available.\n9. Summarize what changed and what remains.\n`;\n\nexport const ANTIGRAVITY_SAFE_RESUME_PROMPT = `\nContinue the previous task from where it stopped.\n\nBefore making changes:\n1. Inspect the current workspace state.\n2. Run git status.\n3. Inspect git diff.\n4. Read AGENT_PROGRESS.md if it exists.\n5. Identify what was already completed and what remains.\n6. Do not overwrite user changes.\n7. Continue only the remaining work.\n8. Ask for confirmation before destructive operations.\n9. Run relevant tests if available.\n10. Summarize what changed and what remains.\n`;\n\nexport const CLAUDE_SAFE_RESUME_PROMPT = `\nContinue the previous task from where it stopped.\n\nBefore making changes:\n1. Inspect the current repository state.\n2. Run git status.\n3. Inspect git diff.\n4. Read AGENT_PROGRESS.md if it exists.\n5. Continue only the remaining work.\n6. Do not overwrite user changes.\n7. Summarize what changed and what remains.\n`;\n","import { AgentProvider, LimitDetection, SessionState } from \"../core/types.js\";\nimport { parseTimeString } from \"../core/time-parser.js\";\nimport { CODEX_SAFE_RESUME_PROMPT } from \"../prompts/safe-resume.js\";\n\nexport const codexProvider: AgentProvider = {\n name: \"codex\",\n displayName: \"OpenAI Codex CLI\",\n defaultCommand: [\"codex\"],\n\n detectLimit(output: string): LimitDetection {\n const lines = output.split(/\\r?\\n/);\n const patterns = [\n /usage limit reached/i,\n /rate limit reached/i,\n /try again at/i,\n /resets_at/i,\n /usage_limit_reached/i,\n ];\n\n for (const line of lines) {\n const matched = patterns.some((p) => p.test(line));\n if (matched) {\n const resetAt = parseTimeString(line);\n return {\n matched: true,\n provider: \"codex\",\n reason: line.trim(),\n resetAt,\n raw: line,\n };\n }\n }\n\n return { matched: false, provider: \"codex\" };\n },\n\n getResumeCommand(state: SessionState): string[] {\n return [\n \"codex\",\n \"exec\",\n \"resume\",\n \"--last\",\n CODEX_SAFE_RESUME_PROMPT.trim(),\n ];\n },\n\n getTranscriptDirs(): string[] {\n return [\"~/.codex/sessions\"];\n },\n\n parseTranscriptEvent(line: string) {\n try {\n const data = JSON.parse(line);\n if (data && typeof data === \"object\") {\n const text = data.text || data.message || data.content;\n return {\n text: typeof text === \"string\" ? text : undefined,\n cwd: typeof data.cwd === \"string\" ? data.cwd : undefined,\n sessionId: typeof data.sessionId === \"string\" ? data.sessionId : undefined,\n timestamp: typeof data.timestamp === \"string\" ? data.timestamp : undefined,\n };\n }\n } catch {\n // ignore\n }\n return undefined;\n },\n};\n","import { execSync } from \"child_process\";\nimport { AgentProvider, LimitDetection, SessionState } from \"../core/types.js\";\nimport { parseTimeString } from \"../core/time-parser.js\";\nimport { ANTIGRAVITY_SAFE_RESUME_PROMPT } from \"../prompts/safe-resume.js\";\n\nexport const antigravityProvider: AgentProvider = {\n name: \"antigravity\",\n displayName: \"Google Antigravity CLI\",\n defaultCommand: [\"agy\"],\n\n detectLimit(output: string): LimitDetection {\n const lines = output.split(/\\r?\\n/);\n const patterns = [\n /usage limit reached/i,\n /rate limit reached/i,\n /quota exceeded/i,\n /quota exhausted/i,\n /daily limit reached/i,\n /5-hour limit reached/i,\n /reached your Antigravity limit/i,\n /Antigravity usage limit reached/i,\n /try again at/i,\n /reset at/i,\n /resets at/i,\n /resets_at/i,\n /retry after/i,\n /retry_after/i,\n ];\n\n for (const line of lines) {\n const matched = patterns.some((p) => p.test(line));\n if (matched) {\n const resetAt = parseTimeString(line);\n return {\n matched: true,\n provider: \"antigravity\",\n reason: line.trim(),\n resetAt,\n raw: line,\n };\n }\n }\n\n return { matched: false, provider: \"antigravity\" };\n },\n\n async getResumeCommand(state: SessionState): Promise<string[]> {\n let helpOutput = \"\";\n try {\n helpOutput = execSync(\"agy --help\", {\n cwd: state.cwd,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n // agyコマンドが使えない、またはエラーの場合は helpOutput が空になる\n }\n\n if (helpOutput) {\n // 優先順位: agy resume --last -> agy continue -> agy c -> agy conversation --last -> fallback: agy\n if (helpOutput.includes(\"resume\") && helpOutput.includes(\"--last\")) {\n return [\"agy\", \"resume\", \"--last\"];\n }\n if (helpOutput.includes(\"continue\")) {\n return [\"agy\", \"continue\"];\n }\n \n const lines = helpOutput.split(\"\\n\");\n const hasC = lines.some((line) => {\n const trimmed = line.trim();\n return trimmed.startsWith(\"c \") || trimmed.startsWith(\"c\\t\");\n });\n if (hasC) {\n return [\"agy\", \"c\"];\n }\n\n if (helpOutput.includes(\"conversation\") && helpOutput.includes(\"--last\")) {\n return [\"agy\", \"conversation\", \"--last\"];\n }\n }\n\n return [\"agy\"];\n },\n\n getResumeInput(state: SessionState): string | undefined {\n if (state.resumeCommand && state.resumeCommand.length === 1 && state.resumeCommand[0] === \"agy\") {\n return ANTIGRAVITY_SAFE_RESUME_PROMPT.trim() + \"\\n\";\n }\n return undefined;\n },\n\n getTranscriptDirs(): string[] {\n return [];\n },\n};\n","import { claudeProvider } from \"./claude.js\";\nimport { codexProvider } from \"./codex.js\";\nimport { antigravityProvider } from \"./antigravity.js\";\n\nexport const providers = {\n claude: claudeProvider,\n codex: codexProvider,\n antigravity: antigravityProvider,\n} as const;\n\nexport function getProvider(name: string) {\n const normalized = name.toLowerCase();\n if (normalized === \"agy\" || normalized === \"antigravity\") {\n return antigravityProvider;\n }\n if (normalized === \"claude\") {\n return claudeProvider;\n }\n if (normalized === \"codex\") {\n return codexProvider;\n }\n\n throw new Error(`Unsupported provider: ${name}`);\n}\n","import { getProvider } from \"../providers/index.js\";\nimport { ProviderName, LimitDetection } from \"./types.js\";\n\nexport function detectLimit(output: string, providerName?: ProviderName): LimitDetection {\n if (providerName) {\n try {\n const provider = getProvider(providerName);\n return provider.detectLimit(output);\n } catch {\n // ignore and fallback to checking all\n }\n }\n\n const allProviders: ProviderName[] = [\"claude\", \"codex\", \"antigravity\"];\n for (const name of allProviders) {\n const provider = getProvider(name);\n const detection = provider.detectLimit(output);\n if (detection.matched) {\n return detection;\n }\n }\n\n return { matched: false, provider: providerName || \"claude\" };\n}\n","import { execSync } from \"child_process\";\nimport { loadConfig, createSession, listSessions, updateSession } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { ProviderName } from \"./types.js\";\nimport { getProvider } from \"../providers/index.js\";\n\nlet tmuxTimer: NodeJS.Timeout | undefined;\n\nexport async function startTmuxWatcher(abortSignal?: AbortSignal) {\n const config = await loadConfig();\n if (!config.tmux.enabled) {\n return;\n }\n\n try {\n execSync(\"tmux -V\", { stdio: \"ignore\" });\n } catch {\n logger.warn(\"tmux is enabled in config, but 'tmux' command was not found. tmux watcher is disabled.\", \"aar\");\n return;\n }\n\n logger.info(\"Starting tmux watcher (experimental)...\", \"aar\");\n\n const poll = async () => {\n if (abortSignal?.aborted) return;\n try {\n await checkTmuxPanes();\n } catch (err: any) {\n logger.debug(`Error checking tmux panes: ${err.message}`, \"aar\");\n }\n tmuxTimer = setTimeout(poll, config.tmux.pollIntervalMs || 5000);\n };\n\n poll();\n\n abortSignal?.addEventListener(\"abort\", () => {\n if (tmuxTimer) clearTimeout(tmuxTimer);\n logger.info(\"Tmux watcher stopped.\", \"aar\");\n });\n}\n\nasync function checkTmuxPanes() {\n let listOutput = \"\";\n try {\n listOutput = execSync(\"tmux list-panes -a -F '#{pane_id}|#{pane_pid}|#{pane_current_path}|#{pane_current_command}'\", {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n return;\n }\n\n const panes = listOutput.split(\"\\n\").filter(Boolean).map((line) => {\n const [paneId, panePid, paneCwd, paneCmd] = line.split(\"|\");\n return { paneId, panePid, paneCwd, paneCmd };\n });\n\n const providers: { name: ProviderName; cmdKeywords: string[] }[] = [\n { name: \"claude\", cmdKeywords: [\"claude\", \"claude-code\"] },\n { name: \"codex\", cmdKeywords: [\"codex\"] },\n { name: \"antigravity\", cmdKeywords: [\"agy\", \"antigravity\"] },\n ];\n\n for (const pane of panes) {\n const matchedProvider = providers.find((p) =>\n p.cmdKeywords.some((keyword) => pane.paneCmd.toLowerCase().includes(keyword))\n );\n\n if (!matchedProvider) {\n continue;\n }\n\n let paneOutput = \"\";\n try {\n paneOutput = execSync(`tmux capture-pane -p -t ${pane.paneId}`, {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n continue;\n }\n\n const detection = detectLimit(paneOutput, matchedProvider.name);\n if (detection.matched) {\n const sessions = await listSessions();\n let matchedSession = sessions.find((s) => s.tmuxPaneId === pane.paneId && s.status === \"waiting_limit_reset\");\n\n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n\n if (!matchedSession) {\n matchedSession = sessions.find((s) => s.tmuxPaneId === pane.paneId && s.status === \"running\");\n \n if (matchedSession) {\n await updateSession(matchedSession.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: paneOutput.slice(-1000),\n });\n logger.info(`Updated tmux session ${matchedSession.id} to waiting_limit_reset`, \"aar\");\n } else {\n const config = await loadConfig();\n const provider = getProvider(matchedProvider.name);\n const newSession = await createSession({\n provider: matchedProvider.name,\n cwd: pane.paneCwd || process.cwd(),\n originalCommand: provider.defaultCommand,\n resumeStrategy: \"pty-input\",\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n attempts: 0,\n maxAttempts: config.maxAttempts,\n bufferSeconds: config.bufferSeconds,\n lastOutputSnippet: paneOutput.slice(-1000),\n managedByAar: false,\n source: \"tmux-watcher\",\n tmuxPaneId: pane.paneId,\n });\n logger.info(`Created new session ${newSession.id} via tmux-watcher (pane: ${pane.paneId})`, \"aar\");\n }\n }\n }\n }\n}\n\n/**\n * tmux pane に対してキー入力を送信する。\n */\nexport function sendKeysToTmux(paneId: string, keys: string): boolean {\n try {\n // 改行コードなどを適切に解釈して送信\n execSync(`tmux send-keys -t ${paneId} \"${keys.replace(/\"/g, '\\\\\"')}\"`, { stdio: \"ignore\" });\n return true;\n } catch (err: any) {\n logger.error(`Failed to send keys to tmux pane ${paneId}: ${err.message}`, \"aar\");\n return false;\n }\n}\n","import { SessionState } from \"./types.js\";\n\n/**\n * セッション再開までの待機時間(ミリ秒)を計算する。\n * @param state セッション状態\n * @returns 待機時間(ミリ秒)。既に経過している場合は 0 以下の数値。\n */\nexport function getWaitMs(state: SessionState): number {\n if (!state.resetAt) {\n return 0;\n }\n const resetTime = new Date(state.resetAt).getTime();\n const bufferMs = (state.bufferSeconds ?? 120) * 1000;\n const targetTime = resetTime + bufferMs;\n const now = Date.now();\n return targetTime - now;\n}\n\n/**\n * 指定時間、ポーリングを挟みながら非同期に待機する。\n * AbortSignalが渡された場合は、途中で中断可能。\n * @param ms 待機時間(ミリ秒)\n * @param abortSignal 中断シグナル\n */\nexport async function waitMs(ms: number, abortSignal?: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n\n const start = Date.now();\n // 60秒以下でも、より細かく1秒毎にポーリングして中断を確認する\n const checkInterval = 1000;\n\n while (Date.now() - start < ms) {\n if (abortSignal?.aborted) {\n break;\n }\n const remaining = ms - (Date.now() - start);\n const sleepTime = Math.min(remaining, checkInterval);\n await new Promise((resolve) => setTimeout(resolve, sleepTime));\n }\n}\n","import pty from \"node-pty\";\nimport { SessionState } from \"./types.js\";\nimport { updateSession, getSession } from \"./session-store.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { getProvider } from \"../providers/index.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * セッションをバックグラウンド(PTY)で再開し、結果を監視する。\n * @param state セッション情報\n * @returns 再開および実行が成功した場合は true、失敗した、または再度リミットに達した場合は false\n */\nexport async function resumeSessionInBackground(state: SessionState): Promise<boolean> {\n const provider = getProvider(state.provider);\n\n const resumeCommand = await provider.getResumeCommand(state);\n const resumeInput = provider.getResumeInput ? await provider.getResumeInput(state) : undefined;\n\n logger.info(`Resuming session ${state.id} with command: ${resumeCommand.join(\" \")}`, \"aar\");\n\n await updateSession(state.id, {\n status: \"resuming\",\n resumeCommand,\n resumeInput,\n attempts: state.attempts + 1,\n });\n\n const cmd = resumeCommand[0];\n const args = resumeCommand.slice(1);\n\n let ptyProcess: pty.IPty;\n try {\n ptyProcess = pty.spawn(cmd, args, {\n name: \"xterm-color\",\n cols: 80,\n rows: 24,\n cwd: state.cwd,\n env: {\n ...process.env,\n AAR_SESSION_ID: state.id,\n },\n });\n } catch (err: any) {\n logger.error(`Failed to spawn resume command: ${err.message}`, \"aar\");\n await updateSession(state.id, { status: \"failed\" });\n return false;\n }\n\n return new Promise<boolean>((resolve) => {\n\n let limitDetected = false;\n let accumulatedOutput = \"\";\n\n // PTYへの自動プロンプト入力がある場合、プロセス起動を少し待ってから送信する\n if (resumeInput) {\n setTimeout(() => {\n try {\n ptyProcess.write(resumeInput);\n logger.info(`Sent resume input to session ${state.id}: ${JSON.stringify(resumeInput)}`, \"aar\");\n } catch (err: any) {\n logger.error(`Failed to write resume input to PTY: ${err.message}`, \"aar\");\n }\n }, 2000);\n }\n\n ptyProcess.onData(async (data: string) => {\n accumulatedOutput += data;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n logger.debug(`[PTY Output ${state.id}] ${data.trim()}`, \"aar\");\n\n if (!limitDetected) {\n const detection = detectLimit(accumulatedOutput, state.provider);\n if (detection.matched) {\n limitDetected = true;\n logger.warn(`Limit re-detected during resume for session ${state.id}`, \"aar\");\n\n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n await updateSession(state.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: accumulatedOutput.slice(-1000),\n });\n\n try {\n ptyProcess.kill();\n } catch {\n // ignore\n }\n }\n }\n });\n\n ptyProcess.onExit(async (res) => {\n const current = await getSession(state.id);\n if (!current) {\n return resolve(false);\n }\n\n if (current.status === \"resuming\") {\n if (res.exitCode === 0) {\n logger.info(`Session ${state.id} completed successfully.`, \"aar\");\n await updateSession(state.id, { status: \"completed\" });\n resolve(true);\n } else {\n logger.info(`Session ${state.id} exited with code ${res.exitCode}.`, \"aar\");\n await updateSession(state.id, { status: \"failed\" });\n resolve(false);\n }\n } else if (current.status === \"waiting_limit_reset\") {\n resolve(false);\n } else {\n resolve(false);\n }\n });\n });\n}\n","import { loadConfig, getWaitingSessions, updateSession, ensureDirs } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { writePid, clearPid, isDaemonRunning } from \"./daemon-ipc.js\";\nimport { startTranscriptWatcher } from \"./transcript-watcher.js\";\nimport { startTmuxWatcher, sendKeysToTmux } from \"./tmux-watcher.js\";\nimport { getWaitMs } from \"./scheduler.js\";\nimport { resumeSessionInBackground } from \"./process-manager.js\";\nimport { getProvider } from \"../providers/index.js\";\n\nexport interface DaemonOptions {\n tmux?: boolean;\n}\n\nexport class AarDaemon {\n private abortController: AbortController | null = null;\n private timer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n\n async start(options: DaemonOptions = {}) {\n if (await isDaemonRunning()) {\n logger.error(\"Daemon is already running.\", \"aar\");\n process.exit(1);\n }\n\n await ensureDirs();\n await writePid(process.pid);\n logger.info(`Daemon started with PID ${process.pid}`, \"aar\");\n\n this.abortController = new AbortController();\n const config = await loadConfig();\n\n if (options.tmux !== undefined) {\n config.tmux.enabled = options.tmux;\n }\n\n await startTranscriptWatcher(this.abortController.signal);\n if (config.tmux.enabled) {\n await startTmuxWatcher(this.abortController.signal);\n }\n\n const shutdown = async () => {\n logger.info(\"Daemon shutting down...\", \"aar\");\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.abortController?.abort();\n await clearPid();\n logger.info(\"Daemon stopped.\", \"aar\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n const loop = async () => {\n if (this.abortController?.signal.aborted) {\n return;\n }\n if (!this.isProcessing) {\n this.isProcessing = true;\n try {\n await this.processWaitingSessions();\n } catch (err: any) {\n logger.error(`Error in daemon loop: ${err.message}`, \"aar\");\n } finally {\n this.isProcessing = false;\n }\n }\n this.timer = setTimeout(loop, config.daemon.pollIntervalMs || 5000);\n };\n\n loop();\n }\n\n private async processWaitingSessions() {\n const waiting = await getWaitingSessions();\n\n for (const session of waiting) {\n if (!session.resetAt) {\n logger.warn(`Session ${session.id} reset time is unknown. Mark as failed.`, \"aar\");\n await updateSession(session.id, {\n status: \"failed\",\n });\n continue;\n }\n\n const waitMsLeft = getWaitMs(session);\n if (waitMsLeft <= 0) {\n logger.info(`Session ${session.id} is ready to resume (Wait completed).`, \"aar\");\n \n await updateSession(session.id, {\n status: \"ready_to_resume\",\n });\n\n if (session.attempts >= session.maxAttempts) {\n logger.warn(`Session ${session.id} exceeded max resume attempts (${session.maxAttempts}). Mark as failed.`, \"aar\");\n await updateSession(session.id, {\n status: \"failed\",\n });\n continue;\n }\n\n if (session.source === \"tmux-watcher\" && session.tmuxPaneId) {\n const provider = getProvider(session.provider);\n const resumeInput = provider.getResumeInput ? await provider.getResumeInput(session) : undefined;\n \n if (resumeInput) {\n logger.info(`Resuming tmux session ${session.id} in pane ${session.tmuxPaneId}`, \"aar\");\n await updateSession(session.id, {\n status: \"resuming\",\n attempts: session.attempts + 1,\n });\n\n const sent = sendKeysToTmux(session.tmuxPaneId, resumeInput);\n if (sent) {\n await updateSession(session.id, {\n status: \"running\",\n });\n logger.info(`Sent resume input to tmux pane successfully.`, \"aar\");\n } else {\n await updateSession(session.id, {\n status: \"failed\",\n });\n }\n } else {\n await updateSession(session.id, {\n status: \"failed\",\n });\n }\n } else {\n try {\n const success = await resumeSessionInBackground(session);\n if (success) {\n logger.info(`Session ${session.id} resumed and completed successfully.`, \"aar\");\n } else {\n logger.warn(`Session ${session.id} resume failed or hit limit again.`, \"aar\");\n }\n } catch (err: any) {\n logger.error(`Failed to resume session ${session.id}: ${err.message}`, \"aar\");\n await updateSession(session.id, {\n status: \"failed\",\n });\n }\n }\n } else {\n const secondsLeft = Math.ceil(waitMsLeft / 1000);\n logger.debug(`Session ${session.id} waiting... ${secondsLeft}s left`, \"aar\");\n }\n }\n }\n}\n","import { startDaemonProcess, stopDaemonProcess } from \"../core/daemon-client.js\";\nimport { isDaemonRunning, readPid } from \"../core/daemon-ipc.js\";\nimport { LOG_FILE } from \"../core/logger.js\";\nimport { AarDaemon } from \"../core/daemon.js\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\n\nexport async function handleDaemon(action: string, options: { tmux?: boolean }) {\n const cleanAction = action.toLowerCase();\n \n if (cleanAction === \"start\") {\n await startDaemonProcess(options);\n } else if (cleanAction === \"stop\") {\n await stopDaemonProcess();\n } else if (cleanAction === \"restart\") {\n console.log(\"Restarting daemon...\");\n await stopDaemonProcess();\n await startDaemonProcess(options);\n } else if (cleanAction === \"status\") {\n const running = await isDaemonRunning();\n if (running) {\n const pid = await readPid();\n console.log(chalk.green(`Daemon is RUNNING (PID: ${pid})`));\n } else {\n console.log(chalk.red(\"Daemon is STOPPED\"));\n }\n } else if (cleanAction === \"logs\") {\n if (await fs.pathExists(LOG_FILE)) {\n const content = await fs.readFile(LOG_FILE, \"utf-8\");\n console.log(content);\n } else {\n console.log(\"No log file found.\");\n }\n } else if (cleanAction === \"run\") {\n const daemon = new AarDaemon();\n await daemon.start(options);\n } else {\n console.error(`Unknown daemon action: ${action}`);\n process.exit(1);\n }\n}\n","import pty from \"node-pty\";\nimport { spawn, ChildProcess } from \"child_process\";\nimport { SessionState, ProviderName } from \"./types.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { createSession, updateSession, loadConfig, getSession } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { getProvider } from \"../providers/index.js\";\n\n\nexport interface PtyRunnerOptions {\n providerName: ProviderName;\n command: string;\n args: string[];\n cwd?: string;\n sessionId?: string;\n}\n\nexport async function runInPty(options: PtyRunnerOptions): Promise<void> {\n const { providerName, command, args, cwd = process.cwd(), sessionId } = options;\n\n const config = await loadConfig();\n const provider = getProvider(providerName);\n\n let session: SessionState;\n if (sessionId) {\n const existing = await getSession(sessionId);\n if (existing) {\n session = existing;\n } else {\n throw new Error(`Session ${sessionId} not found`);\n }\n } else {\n session = await createSession({\n provider: providerName,\n cwd,\n originalCommand: [command, ...args],\n resumeStrategy: providerName === \"claude\" ? \"pty-input\" : \"command\",\n status: \"running\",\n attempts: 0,\n maxAttempts: config.maxAttempts,\n bufferSeconds: config.bufferSeconds,\n managedByAar: true,\n source: \"managed-pty\",\n });\n }\n\n logger.info(`Managed session started: ${session.id}`, \"aar\");\n\n const isInteractive = !!process.stdout.isTTY;\n const isServerMode = args.some((arg) =>\n arg.includes(\"app-server\") ||\n arg.includes(\"--listen\") ||\n arg.includes(\"stdio\") ||\n arg.includes(\"mcp\")\n );\n\n if (isServerMode || !isInteractive) {\n await runInPipe(session, command, args, cwd);\n return;\n }\n\n const ptyProcess = pty.spawn(command, args, {\n name: \"xterm-color\",\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n cwd,\n env: {\n ...process.env,\n AAR_SESSION_ID: session.id,\n },\n });\n\n await updateSession(session.id, { pid: ptyProcess.pid, status: \"running\" });\n\n\n let limitDetected = false;\n let accumulatedOutput = \"\";\n\n const resizeHandler = () => {\n try {\n ptyProcess.resize(process.stdout.columns || 80, process.stdout.rows || 24);\n } catch {\n // ignore\n }\n };\n process.stdout.on(\"resize\", resizeHandler);\n\n const stdinHandler = (data: Buffer) => {\n ptyProcess.write(data.toString());\n };\n \n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n process.stdin.on(\"data\", stdinHandler);\n\n ptyProcess.onData(async (data: string) => {\n process.stdout.write(data);\n \n accumulatedOutput += data;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n if (!limitDetected) {\n const detection = detectLimit(accumulatedOutput, providerName);\n if (detection.matched) {\n limitDetected = true;\n \n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n \n logger.warn(`Usage limit detected for ${provider.displayName}!`, \"aar\");\n if (resetAtStr) {\n logger.warn(`Resets at: ${detection.resetAt?.toLocaleString()}`, \"aar\");\n } else {\n logger.warn(\"Reset time not specified. Auto-resume will fail without manual intervention or retry-now.\", \"aar\");\n }\n\n await updateSession(session.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: accumulatedOutput.slice(-1000),\n });\n\n console.log(`\\n\\n\\x1b[33m[aar] Usage limit detected. Setting session to waiting state...\\x1b[0m`);\n console.log(`\\x1b[33m[aar] Session ID: ${session.id}\\x1b[0m`);\n if (resetAtStr) {\n console.log(`\\x1b[33m[aar] Scheduled to resume after reset time + buffer seconds.\\x1b[0m`);\n } else {\n console.log(`\\x1b[31m[aar] Warning: Reset time unknown. Run 'aar retry-now --id ${session.id}' manually if needed.\\x1b[0m`);\n }\n\n try {\n ptyProcess.kill();\n } catch {\n // ignore\n }\n }\n }\n });\n\n ptyProcess.onExit(async (res) => {\n process.stdout.off(\"resize\", resizeHandler);\n process.stdin.off(\"data\", stdinHandler);\n try {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n process.stdin.pause();\n } catch {\n // ignore\n }\n\n const currentSession = await getSession(session.id);\n if (currentSession) {\n if (currentSession.status === \"running\") {\n await updateSession(session.id, {\n status: res.exitCode === 0 ? \"completed\" : \"failed\",\n pid: undefined,\n });\n } else if (currentSession.status === \"waiting_limit_reset\") {\n await updateSession(session.id, {\n pid: undefined,\n });\n }\n }\n\n process.exit(res.exitCode);\n });\n}\n\nasync function runInPipe(\n session: SessionState,\n command: string,\n args: string[],\n cwd: string\n): Promise<void> {\n let child: ChildProcess;\n child = spawn(command, args, {\n cwd,\n env: {\n ...process.env,\n AAR_SESSION_ID: session.id,\n },\n });\n\n await updateSession(session.id, { pid: child.pid, status: \"running\" });\n\n\n let limitDetected = false;\n let accumulatedOutput = \"\";\n\n if (child.stdin) {\n process.stdin.pipe(child.stdin);\n }\n\n if (child.stdout) {\n child.stdout.on(\"data\", (data: Buffer) => {\n process.stdout.write(data);\n\n const str = data.toString(\"utf-8\");\n accumulatedOutput += str;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n checkLimit(str);\n });\n }\n\n if (child.stderr) {\n child.stderr.on(\"data\", (data: Buffer) => {\n process.stderr.write(data);\n\n const str = data.toString(\"utf-8\");\n accumulatedOutput += str;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n checkLimit(str);\n });\n }\n\n async function checkLimit(str: string) {\n if (!limitDetected) {\n const detection = detectLimit(accumulatedOutput, session.provider);\n if (detection.matched) {\n limitDetected = true;\n \n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n \n logger.warn(`Usage limit detected for ${session.provider}!`, \"aar\");\n\n await updateSession(session.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: accumulatedOutput.slice(-1000),\n });\n\n try {\n child.kill();\n } catch {\n // ignore\n }\n }\n }\n }\n\n return new Promise<void>((resolve) => {\n child.on(\"exit\", async (code) => {\n const currentSession = await getSession(session.id);\n if (currentSession) {\n if (currentSession.status === \"running\") {\n await updateSession(session.id, {\n status: code === 0 ? \"completed\" : \"failed\",\n pid: undefined,\n });\n } else if (currentSession.status === \"waiting_limit_reset\") {\n await updateSession(session.id, {\n pid: undefined,\n });\n }\n }\n process.exit(code || 0);\n });\n });\n}\n","import { runInPty } from \"../core/pty-runner.js\";\nimport { ProviderName } from \"../core/types.js\";\nimport { getProvider } from \"../providers/index.js\";\n\nexport async function runManaged(providerNameStr: string, args: string[]) {\n let providerName: ProviderName;\n try {\n const prov = getProvider(providerNameStr);\n providerName = prov.name;\n } catch (err: any) {\n console.error(err.message);\n process.exit(1);\n }\n\n if (args.length === 0) {\n console.error(\"No command specified. Usage: aar managed <provider> -- <command...>\");\n process.exit(1);\n }\n\n const command = args[0];\n const cmdArgs = args.slice(1);\n\n await runInPty({\n providerName,\n command,\n args: cmdArgs,\n cwd: process.cwd(),\n });\n}\n","import { runManaged } from \"./managed.js\";\n\nexport async function runGeneric(options: { provider?: string }, args: string[]) {\n if (!options.provider) {\n console.error(\"Provider must be specified via --provider <provider>\");\n process.exit(1);\n }\n await runManaged(options.provider, args);\n}\n","import { isDaemonRunning, readPid } from \"../core/daemon-ipc.js\";\nimport { getWaitingSessions } from \"../core/session-store.js\";\nimport { getWaitMs } from \"../core/scheduler.js\";\nimport chalk from \"chalk\";\n\nexport async function runStatus(options: { json?: boolean }) {\n const daemonRunning = await isDaemonRunning();\n const daemonPid = await readPid();\n const waitingSessions = await getWaitingSessions();\n\n const statusData = {\n daemon: {\n running: daemonRunning,\n pid: daemonPid,\n },\n waitingSessions: waitingSessions.map((s) => {\n const waitMs = getWaitMs(s);\n const nextResume = s.resetAt\n ? new Date(new Date(s.resetAt).getTime() + (s.bufferSeconds ?? 120) * 1000)\n : null;\n return {\n id: s.id,\n provider: s.provider,\n cwd: s.cwd,\n attempts: s.attempts,\n resetAt: s.resetAt,\n nextResumeAt: nextResume ? nextResume.toISOString() : null,\n secondsLeft: waitMs > 0 ? Math.ceil(waitMs / 1000) : 0,\n };\n }),\n };\n\n if (options.json) {\n console.log(JSON.stringify(statusData, null, 2));\n return;\n }\n\n console.log(chalk.bold(\"--- agent-auto-resume status ---\"));\n if (daemonRunning) {\n console.log(`Daemon Status: ${chalk.green(\"RUNNING\")} (PID: ${daemonPid})`);\n } else {\n console.log(`Daemon Status: ${chalk.red(\"STOPPED\")}`);\n }\n\n console.log(`\\nWaiting Sessions (${waitingSessions.length}):`);\n if (waitingSessions.length === 0) {\n console.log(\" No waiting sessions.\");\n } else {\n for (const s of statusData.waitingSessions) {\n console.log(`\\n Session ID: ${chalk.cyan(s.id)} [${s.provider}]`);\n console.log(` CWD: ${s.cwd}`);\n console.log(` Attempts: ${s.attempts}`);\n if (s.resetAt) {\n console.log(` Limit reset time: ${new Date(s.resetAt).toLocaleString()}`);\n console.log(` Auto-resume scheduled: ${s.nextResumeAt ? new Date(s.nextResumeAt).toLocaleString() : \"Unknown\"}`);\n console.log(` Time remaining: ${s.secondsLeft > 0 ? `${s.secondsLeft}s` : \"Ready to resume\"}`);\n } else {\n console.log(` ${chalk.yellow(\"Warning: Reset time unknown. Auto-resume will not happen automatically.\")}`);\n }\n }\n }\n}\n","import { listSessions } from \"../core/session-store.js\";\nimport chalk from \"chalk\";\n\nexport async function runSessions(options: { json?: boolean }) {\n const sessions = await listSessions();\n\n if (options.json) {\n console.log(JSON.stringify(sessions, null, 2));\n return;\n }\n\n console.log(chalk.bold(`--- agent-auto-resume sessions (${sessions.length}) ---`));\n if (sessions.length === 0) {\n console.log(\"No sessions found.\");\n return;\n }\n\n for (const s of sessions) {\n const statusColor =\n s.status === \"completed\"\n ? chalk.green\n : s.status === \"waiting_limit_reset\"\n ? chalk.yellow\n : s.status === \"failed\"\n ? chalk.red\n : s.status === \"running\"\n ? chalk.blue\n : chalk.gray;\n\n console.log(`\\nSession ID: ${chalk.cyan(s.id)} [${s.provider}]`);\n console.log(` Status: ${statusColor(s.status)}`);\n console.log(` CWD: ${s.cwd}`);\n console.log(` Created: ${new Date(s.createdAt).toLocaleString()}`);\n console.log(` Command: ${s.originalCommand.join(\" \")}`);\n if (s.resetAt) {\n console.log(` Reset time: ${new Date(s.resetAt).toLocaleString()}`);\n }\n }\n}\n","import { getSession, getLastSession, getRecoverableSessions, updateSession } from \"../core/session-store.js\";\nimport { resumeSessionInBackground } from \"../core/process-manager.js\";\nimport chalk from \"chalk\";\n\nexport async function runRecover(options: { last?: boolean; id?: string }) {\n let session;\n\n if (options.id) {\n session = await getSession(options.id);\n if (!session) {\n console.error(chalk.red(`Error: Session with ID ${options.id} not found.`));\n process.exit(1);\n }\n } else if (options.last) {\n session = await getLastSession();\n if (!session) {\n console.error(chalk.red(\"Error: No sessions found.\"));\n process.exit(1);\n }\n } else {\n const recoverable = await getRecoverableSessions();\n if (recoverable.length === 0) {\n console.log(\"No recoverable sessions found.\");\n return;\n }\n console.log(chalk.bold(\"Recoverable sessions:\"));\n for (const r of recoverable) {\n console.log(` - ID: ${chalk.cyan(r.id)} [${r.provider}] Status: ${r.status} (${r.originalCommand.join(\" \")})`);\n }\n console.log(\"\\nUse 'aar recover --id <session-id>' or 'aar recover --last' to recover.\");\n return;\n }\n\n const recoverableStatuses = [\"waiting_limit_reset\", \"ready_to_resume\", \"failed\", \"resuming\", \"cancelled\"];\n if (!recoverableStatuses.includes(session.status)) {\n console.warn(chalk.yellow(`Warning: Session ${session.id} status is '${session.status}', which might not need recovery.`));\n }\n\n console.log(`Attempting to recover session ${chalk.cyan(session.id)}...`);\n await updateSession(session.id, {\n source: \"manual-recover\",\n });\n\n const success = await resumeSessionInBackground(session);\n if (success) {\n console.log(chalk.green(`✓ Session ${session.id} recovered and completed successfully.`));\n } else {\n console.log(chalk.red(`✗ Recovery failed or session hit limit again. Status is currently saved.`));\n }\n}\n","import { getSession, getLastSession, updateSession } from \"../core/session-store.js\";\nimport { getWaitMs } from \"../core/scheduler.js\";\nimport { resumeSessionInBackground } from \"../core/process-manager.js\";\nimport chalk from \"chalk\";\n\nexport async function runRetryNow(options: { id?: string; last?: boolean; force?: boolean }) {\n let session;\n\n if (options.id) {\n session = await getSession(options.id);\n if (!session) {\n console.error(chalk.red(`Error: Session with ID ${options.id} not found.`));\n process.exit(1);\n }\n } else if (options.last) {\n session = await getLastSession();\n if (!session) {\n console.error(chalk.red(\"Error: No sessions found.\"));\n process.exit(1);\n }\n } else {\n console.error(chalk.red(\"Error: Must specify either --id <session-id> or --last.\"));\n process.exit(1);\n }\n\n const waitMs = getWaitMs(session);\n if (waitMs > 0 && !options.force) {\n const secondsLeft = Math.ceil(waitMs / 1000);\n console.log(chalk.yellow(`Warning: Limit reset time has not yet passed for session ${session.id}.`));\n console.log(`Time remaining: ${secondsLeft} seconds.`);\n console.log(\"Run with '--force' to retry immediately (not recommended).\");\n return;\n }\n\n console.log(`Starting immediate retry for session ${chalk.cyan(session.id)}...`);\n await updateSession(session.id, {\n status: \"ready_to_resume\",\n });\n\n const success = await resumeSessionInBackground(session);\n if (success) {\n console.log(chalk.green(`✓ Session ${session.id} resumed and completed successfully.`));\n } else {\n console.log(chalk.red(`✗ Retry failed or hit limit again.`));\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport os from \"os\";\nimport { execSync } from \"child_process\";\n\n// ホームディレクトリ解決用の補助関数\nfunction resolveHome(p: string): string {\n if (p.startsWith(\"~\")) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\n// aarの絶対パスを取得する\nfunction getAarPath(): string {\n try {\n const whichAar = execSync(\"which aar\", { encoding: \"utf8\" }).trim();\n if (whichAar) return whichAar;\n } catch {\n // ignore\n }\n // フォールバック(典型的なグローバルインストール先)\n const home = os.homedir();\n const possiblePaths = [\n path.join(home, \".hermes/node/bin/aar\"),\n path.join(home, \".npm-global/bin/aar\"),\n \"/usr/local/bin/aar\",\n \"/opt/homebrew/bin/aar\",\n ];\n for (const p of possiblePaths) {\n if (fs.existsSync(p)) return p;\n }\n return \"aar\"; // 最悪フォールバック\n}\n\ninterface IntegrationTarget {\n name: string;\n originalPath: string;\n backupPath: string;\n provider: string;\n getWrapperContent: (aarPath: string) => string;\n}\n\nconst targets: Record<string, IntegrationTarget[]> = {\n codex: [\n {\n name: \"Codex Mac App\",\n originalPath: \"/Applications/Codex.app/Contents/Resources/codex\",\n backupPath: \"/Applications/Codex.app/Contents/Resources/codex.orig\",\n provider: \"codex\",\n getWrapperContent: (aarPath) => `#!/bin/bash\n# original internal binary: /Applications/Codex.app/Contents/Resources/codex.orig\n\nif [ -x \"${aarPath}\" ]; then\n exec \"${aarPath}\" managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig \"$@\"\nelif command -v aar >/dev/null 2>&1; then\n exec aar managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig \"$@\"\nelse\n exec /Applications/Codex.app/Contents/Resources/codex.orig \"$@\"\nfi\n`,\n },\n ],\n antigravity: [\n {\n name: \"Antigravity Mac App Server\",\n originalPath: \"/Applications/Antigravity.app/Contents/Resources/bin/language_server\",\n backupPath: \"/Applications/Antigravity.app/Contents/Resources/bin/language_server.orig\",\n provider: \"antigravity\",\n getWrapperContent: (aarPath) => `#!/bin/bash\n# original internal binary: /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig\n\nif [ -x \"${aarPath}\" ]; then\n exec \"${aarPath}\" managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig \"$@\"\nelif command -v aar >/dev/null 2>&1; then\n exec aar managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig \"$@\"\nelse\n exec /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig \"$@\"\nfi\n`,\n },\n {\n name: \"Antigravity CLI (agy)\",\n originalPath: \"~/.local/bin/agy\",\n backupPath: \"~/.local/bin/agy.orig\",\n provider: \"antigravity\",\n getWrapperContent: (aarPath) => `#!/bin/bash\n# original system binary: \\$HOME/.local/bin/agy.orig\n\nif [ -x \"${aarPath}\" ]; then\n exec \"${aarPath}\" managed antigravity -- \"\\$HOME/.local/bin/agy.orig\" \"$@\"\nelif command -v aar >/dev/null 2>&1; then\n exec aar managed antigravity -- \"\\$HOME/.local/bin/agy.orig\" \"$@\"\nelse\n exec \"\\$HOME/.local/bin/agy.orig\" \"$@\"\nfi\n`,\n },\n ],\n};\n\nexport async function runIntegrate(appName: string) {\n const aarPath = getAarPath();\n const keys = appName === \"all\" ? Object.keys(targets) : [appName];\n\n for (const key of keys) {\n const appTargets = targets[key];\n if (!appTargets) {\n console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);\n process.exit(1);\n }\n\n console.log(`Setting up integration for ${key}...`);\n for (const t of appTargets) {\n const orig = resolveHome(t.originalPath);\n const backup = resolveHome(t.backupPath);\n\n if (!fs.existsSync(orig) && !fs.existsSync(backup)) {\n console.warn(` [Skip] ${t.name} not found at ${orig}`);\n continue;\n }\n\n try {\n // 1. すでに退避済みの場合はスキップ、または退避\n if (!fs.existsSync(backup)) {\n await fs.move(orig, backup);\n console.log(` [Backuped] ${orig} -> ${backup}`);\n }\n\n // 2. ラッパースクリプトの書き出し\n const content = t.getWrapperContent(aarPath);\n await fs.writeFile(orig, content, \"utf-8\");\n await fs.chmod(orig, 0o755);\n console.log(` [Integrated] Created wrapper at ${orig}`);\n } catch (err: any) {\n console.error(` [Error] Failed to integrate ${t.name}: ${err?.message}`);\n }\n }\n }\n console.log(\"Integration setup completed.\");\n}\n\nexport async function runUnintegrate(appName: string) {\n const keys = appName === \"all\" ? Object.keys(targets) : [appName];\n\n for (const key of keys) {\n const appTargets = targets[key];\n if (!appTargets) {\n console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);\n process.exit(1);\n }\n\n console.log(`Reverting integration for ${key}...`);\n for (const t of appTargets) {\n const orig = resolveHome(t.originalPath);\n const backup = resolveHome(t.backupPath);\n\n if (!fs.existsSync(backup)) {\n console.warn(` [Skip] Backup for ${t.name} not found at ${backup}`);\n continue;\n }\n\n try {\n // 1. ラッパーを削除(あれば)\n if (fs.existsSync(orig)) {\n await fs.remove(orig);\n }\n // 2. バックアップを元の位置に復元\n await fs.move(backup, orig);\n console.log(` [Restored] Reverted ${backup} -> ${orig}`);\n } catch (err: any) {\n console.error(` [Error] Failed to unintegrate ${t.name}: ${err?.message}`);\n }\n }\n }\n console.log(\"Unintegration completed.\");\n}\n"],"mappings":"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","names":["path","fs","fs","path","fs","path","fs","path","fs","path","fs","chalk","path","fs","chalk","fs","path","fs","execSync","execSync","fs","path","execSync","execSync","fs","chalk","pty","spawn","pty","spawn","chalk","chalk","chalk","chalk","fs","path","os","execSync","resolveHome"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/core/session-store.ts","../src/core/shell-setup.ts","../src/core/autostart.ts","../src/commands/setup.ts","../src/core/daemon-client.ts","../src/core/daemon-ipc.ts","../src/core/logger.ts","../src/core/transcript-watcher.ts","../src/core/time-parser.ts","../src/providers/claude.ts","../src/prompts/safe-resume.ts","../src/providers/codex.ts","../src/providers/antigravity.ts","../src/providers/index.ts","../src/core/detector.ts","../src/core/tmux-watcher.ts","../src/core/scheduler.ts","../src/core/process-manager.ts","../src/core/daemon.ts","../src/commands/daemon.ts","../src/core/pty-runner.ts","../src/commands/managed.ts","../src/commands/run.ts","../src/commands/status.ts","../src/commands/sessions.ts","../src/commands/recover.ts","../src/commands/retry-now.ts","../src/commands/integrate.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { runSetup } from \"./commands/setup.js\";\nimport { handleDaemon } from \"./commands/daemon.js\";\nimport { runManaged } from \"./commands/managed.js\";\nimport { runGeneric } from \"./commands/run.js\";\nimport { runStatus } from \"./commands/status.js\";\nimport { runSessions } from \"./commands/sessions.js\";\nimport { runRecover } from \"./commands/recover.js\";\nimport { runRetryNow } from \"./commands/retry-now.js\";\nimport { runIntegrate, runUnintegrate } from \"./commands/integrate.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"aar\")\n .description(\"Daemon-based auto-resume CLI tool for Claude Code, Codex, and Antigravity\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"setup\")\n .description(\"Setup state directories, configuration, and shell integration\")\n .option(\"--shell <type>\", \"Specify shell type (zsh, bash, fish)\")\n .option(\"--no-shell-modify\", \"Do not modify shell configuration files automatically\")\n .option(\"--print-shell-snippet\", \"Only print the shell snippet to stdout\")\n .action(runSetup);\n\nprogram\n .command(\"daemon <action>\")\n .description(\"Manage the agent-auto-resume daemon (actions: start, stop, restart, status, logs, run)\")\n .option(\"--tmux\", \"Enable experimental tmux watcher\")\n .action((action, options) => handleDaemon(action, options));\n\nprogram\n .command(\"managed <provider>\")\n .description(\"Run a CLI tool in managed mode under PTY\")\n .argument(\"[command...]\", \"Command to execute (e.g. claude, codex, agy)\")\n .action((provider, args) => runManaged(provider, args));\n\nprogram\n .command(\"run\")\n .description(\"Generic run command to wrap any agent CLI under a provider\")\n .option(\"--provider <provider>\", \"Specify provider (claude, codex, antigravity)\")\n .argument(\"[command...]\", \"Command to execute\")\n .action((args, options) => {\n // '--' の後の引数は args として渡される\n runGeneric(options, args);\n });\n\nprogram\n .command(\"status\")\n .description(\"Show daemon status, waiting sessions, and next resume schedules\")\n .option(\"--json\", \"Format output as JSON\")\n .action(runStatus);\n\nprogram\n .command(\"sessions\")\n .description(\"List all saved sessions and their statuses\")\n .option(\"--json\", \"Format output as JSON\")\n .action(runSessions);\n\nprogram\n .command(\"recover\")\n .description(\"Manually recover waiting, failed, or cancelled sessions\")\n .option(\"--last\", \"Recover the most recent session\")\n .option(\"--id <session-id>\", \"Recover session by ID\")\n .action(runRecover);\n\nprogram\n .command(\"retry-now\")\n .description(\"Retry waiting sessions immediately\")\n .option(\"--id <session-id>\", \"Session ID to retry\")\n .option(\"--last\", \"Retry the most recent waiting session\")\n .option(\"--force\", \"Force retry even if reset time has not passed\")\n .action(runRetryNow);\n\nprogram\n .command(\"integrate <app>\")\n .description(\"Integrate desktop application binary with aar (app: codex, antigravity, all)\")\n .action(runIntegrate);\n\nprogram\n .command(\"unintegrate <app>\")\n .description(\"Restore original application binary and remove wrapper (app: codex, antigravity, all)\")\n .action(runUnintegrate);\n\n\n// One-shot wrapper commands\n// これらはサブコマンド以下のすべてのオプションや引数をラップして managed mode に渡します。\nprogram\n .command(\"claude\")\n .description(\"One-shot wrapper to run Claude Code in managed mode\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"claude\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"claude\", [\"claude\", ...forwardedArgs]);\n });\n\nprogram\n .command(\"codex\")\n .description(\"One-shot wrapper to run Codex CLI in managed mode\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"codex\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"codex\", [\"codex\", ...forwardedArgs]);\n });\n\nprogram\n .command(\"antigravity\")\n .description(\"One-shot wrapper to run Antigravity CLI in managed mode\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"antigravity\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"antigravity\", [\"agy\", ...forwardedArgs]);\n });\n\nprogram\n .command(\"agy\")\n .description(\"Alias for antigravity command\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"agy\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"antigravity\", [\"agy\", ...forwardedArgs]);\n });\n\nprogram.parse(process.argv);\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { nanoid } from \"nanoid\";\nimport { SessionState, SessionStatus, AarConfig } from \"./types.js\";\n\nconst DEFAULT_BASE_DIR = path.join(os.homedir(), \".agent-auto-resume\");\nexport const BASE_DIR = process.env.AAR_BASE_DIR || DEFAULT_BASE_DIR;\nexport const SESSIONS_DIR = path.join(BASE_DIR, \"sessions\");\nexport const EVENTS_DIR = path.join(BASE_DIR, \"events\");\nexport const SHIMS_DIR = path.join(BASE_DIR, \"shims\");\nexport const CONFIG_FILE = path.join(BASE_DIR, \"config.json\");\n\nexport function resolveHome(filepath: string): string {\n if (filepath.startsWith(\"~\")) {\n return path.join(os.homedir(), filepath.slice(1));\n }\n return filepath;\n}\n\nexport async function ensureDirs() {\n await fs.ensureDir(BASE_DIR);\n await fs.ensureDir(SESSIONS_DIR);\n await fs.ensureDir(EVENTS_DIR);\n await fs.ensureDir(SHIMS_DIR);\n}\n\nexport const DEFAULT_CONFIG: AarConfig = {\n version: 1,\n bufferSeconds: 120,\n maxAttempts: 5,\n providers: {\n claude: {\n enabled: true,\n command: \"claude\",\n watchTranscripts: true,\n transcriptDirs: [\"~/.claude/projects\"],\n },\n codex: {\n enabled: true,\n command: \"codex\",\n watchTranscripts: true,\n transcriptDirs: [\"~/.codex/sessions\"],\n },\n antigravity: {\n enabled: true,\n command: \"agy\",\n experimental: true,\n watchTranscripts: false,\n transcriptDirs: [],\n },\n },\n tmux: {\n enabled: false,\n pollIntervalMs: 5000,\n },\n daemon: {\n pollIntervalMs: 5000,\n },\n};\n\nexport async function loadConfig(): Promise<AarConfig> {\n await ensureDirs();\n if (await fs.pathExists(CONFIG_FILE)) {\n try {\n const data = await fs.readJson(CONFIG_FILE);\n // 深いマージを簡易的に行う\n return {\n ...DEFAULT_CONFIG,\n ...data,\n providers: {\n claude: { ...DEFAULT_CONFIG.providers.claude, ...data.providers?.claude },\n codex: { ...DEFAULT_CONFIG.providers.codex, ...data.providers?.codex },\n antigravity: { ...DEFAULT_CONFIG.providers.antigravity, ...data.providers?.antigravity },\n },\n tmux: { ...DEFAULT_CONFIG.tmux, ...data.tmux },\n daemon: { ...DEFAULT_CONFIG.daemon, ...data.daemon },\n };\n } catch {\n return DEFAULT_CONFIG;\n }\n }\n await fs.writeJson(CONFIG_FILE, DEFAULT_CONFIG, { spaces: 2 });\n return DEFAULT_CONFIG;\n}\n\nexport async function saveConfig(config: AarConfig): Promise<void> {\n await ensureDirs();\n await fs.writeJson(CONFIG_FILE, config, { spaces: 2 });\n}\n\nexport async function createSession(\n state: Omit<SessionState, \"id\" | \"createdAt\" | \"updatedAt\"> & { id?: string }\n): Promise<SessionState> {\n await ensureDirs();\n const id = state.id || nanoid(10);\n const now = new Date().toISOString();\n const session: SessionState = {\n ...state,\n id,\n createdAt: now,\n updatedAt: now,\n };\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n await fs.writeJson(sessionPath, session, { spaces: 2 });\n return session;\n}\n\nexport async function updateSession(id: string, updates: Partial<SessionState>): Promise<SessionState> {\n await ensureDirs();\n const session = await getSession(id);\n if (!session) {\n throw new Error(`Session ${id} not found`);\n }\n const updated: SessionState = {\n ...session,\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n await fs.writeJson(sessionPath, updated, { spaces: 2 });\n return updated;\n}\n\nexport async function getSession(id: string): Promise<SessionState | undefined> {\n await ensureDirs();\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n if (!(await fs.pathExists(sessionPath))) {\n return undefined;\n }\n try {\n return await fs.readJson(sessionPath);\n } catch {\n return undefined;\n }\n}\n\nexport async function listSessions(): Promise<SessionState[]> {\n await ensureDirs();\n const files = await fs.readdir(SESSIONS_DIR);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\"));\n const sessions: SessionState[] = [];\n for (const file of jsonFiles) {\n try {\n const session = await fs.readJson(path.join(SESSIONS_DIR, file));\n sessions.push(session);\n } catch {\n // 破損ファイルは無視\n }\n }\n return sessions.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n}\n\nexport async function getLastSession(): Promise<SessionState | undefined> {\n const sessions = await listSessions();\n return sessions[0];\n}\n\nexport async function getRecoverableSessions(): Promise<SessionState[]> {\n const sessions = await listSessions();\n const recoverableStatuses: SessionStatus[] = [\"waiting_limit_reset\", \"ready_to_resume\", \"failed\", \"resuming\"];\n return sessions.filter((s) => recoverableStatuses.includes(s.status));\n}\n\nexport async function getWaitingSessions(): Promise<SessionState[]> {\n const sessions = await listSessions();\n return sessions.filter((s) => s.status === \"waiting_limit_reset\");\n}\n\nexport async function deleteSession(id: string): Promise<void> {\n await ensureDirs();\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n if (await fs.pathExists(sessionPath)) {\n await fs.remove(sessionPath);\n }\n}\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { resolveHome } from \"./session-store.js\";\n\nexport type ShellType = \"zsh\" | \"bash\" | \"fish\";\n\n/**\n * ユーザーの環境変数等から現在のシェルを自動検出する。\n */\nexport function detectShell(): ShellType {\n const shellEnv = process.env.SHELL || \"\";\n if (shellEnv.includes(\"zsh\")) {\n return \"zsh\";\n }\n if (shellEnv.includes(\"fish\")) {\n return \"fish\";\n }\n return \"bash\";\n}\n\n/**\n * 各シェルのrcファイルへのパスを取得する。\n */\nexport function getShellRcPath(shell: ShellType): string {\n if (shell === \"zsh\") {\n return resolveHome(\"~/.zshrc\");\n }\n if (shell === \"fish\") {\n return resolveHome(\"~/.config/fish/config.fish\");\n }\n return resolveHome(\"~/.bashrc\");\n}\n\nexport const ZSH_BASH_SNIPPET = `\n# agent-auto-resume\nif command -v aar >/dev/null 2>&1; then\n claude() { aar managed claude -- claude \"$@\"; }\n codex() { aar managed codex -- codex \"$@\"; }\n agy() { aar managed antigravity -- agy \"$@\"; }\nfi\n`;\n\nexport const FISH_SNIPPET = `\n# agent-auto-resume\nfunction claude\n aar managed claude -- claude $argv\nend\n\nfunction codex\n aar managed codex -- codex $argv\nend\n\nfunction agy\n aar managed antigravity -- agy $argv\nend\n`;\n\n/**\n * シェルに応じた設定スニペットを取得する。\n */\nexport function getSnippet(shell: ShellType): string {\n return shell === \"fish\" ? FISH_SNIPPET.trim() : ZSH_BASH_SNIPPET.trim();\n}\n\n/**\n * シェルのrcファイルに対して統合用関数のスニペットを追記・設定する。\n * @param shell 対象シェル。未指定の場合は自動検出する。\n * @param noModify 実際にrcファイルを変更せず、案内メッセージのみを取得する。\n */\nexport async function setupShell(shell?: ShellType, noModify = false): Promise<string> {\n const targetShell = shell || detectShell();\n const rcPath = getShellRcPath(targetShell);\n const snippet = getSnippet(targetShell);\n\n if (noModify) {\n return `Please manually append the following snippet to your shell config file (${rcPath}):\\n\\n${snippet}`;\n }\n\n await fs.ensureDir(path.dirname(rcPath));\n\n let exists = false;\n let content = \"\";\n if (await fs.pathExists(rcPath)) {\n content = await fs.readFile(rcPath, \"utf-8\");\n if (content.includes(\"agent-auto-resume\") || content.includes(\"aar managed\")) {\n exists = true;\n }\n }\n\n if (exists) {\n return `Shell integration snippet already exists in ${rcPath}. Skipping configuration.`;\n }\n\n const newContent = content ? `${content.trimEnd()}\\n\\n${snippet}\\n` : `${snippet}\\n`;\n await fs.writeFile(rcPath, newContent, \"utf-8\");\n return `Successfully updated shell configuration at ${rcPath}.\\nRestart your terminal or run: source ${rcPath}`;\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport os from \"os\";\nimport { execSync } from \"child_process\";\n\n// aarの絶対パスを取得する\nfunction getAarPath(): string {\n try {\n const whichAar = execSync(\"which aar\", { encoding: \"utf8\" }).trim();\n if (whichAar) return whichAar;\n } catch {\n // ignore\n }\n const home = os.homedir();\n const possiblePaths = [\n path.join(home, \".hermes/node/bin/aar\"),\n path.join(home, \".npm-global/bin/aar\"),\n \"/usr/local/bin/aar\",\n \"/opt/homebrew/bin/aar\",\n ];\n for (const p of possiblePaths) {\n if (fs.existsSync(p)) return p;\n }\n return \"aar\";\n}\n\n// macOS用のLaunchAgentのplist内容を生成\nfunction generatePlistContent(aarPath: string): string {\n const logDir = path.join(os.homedir(), \".agent-auto-resume\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>com.user.agent-auto-resume</string>\n <key>ProgramArguments</key>\n <array>\n <string>${aarPath}</string>\n <string>daemon</string>\n <string>start</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <false/>\n <key>StandardOutPath</key>\n <string>${path.join(logDir, \"daemon-launchd.log\")}</string>\n <key>StandardErrorPath</key>\n <string>${path.join(logDir, \"daemon-launchd.err\")}</string>\n</dict>\n</plist>\n`;\n}\n\n// Linux用のSystemdサービスの構成内容を生成\nfunction generateServiceContent(aarPath: string): string {\n return `[Unit]\nDescription=Agent Auto Resume Daemon\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=${aarPath} daemon run\nRestart=on-failure\n\n[Install]\nWantedBy=default.target\n`;\n}\n\n/**\n * ログイン時の自動起動を有効化する。\n */\nexport async function setupAutostart(): Promise<string> {\n const platform = os.platform();\n const aarPath = getAarPath();\n\n if (platform === \"darwin\") {\n const plistDir = path.join(os.homedir(), \"Library/LaunchAgents\");\n const plistPath = path.join(plistDir, \"com.user.agent-auto-resume.plist\");\n\n await fs.ensureDir(plistDir);\n const content = generatePlistContent(aarPath);\n\n // 重複エラーを避けるためにアンロード\n try {\n execSync(`launchctl unload ${plistPath}`, { stdio: \"ignore\" });\n } catch {\n // ignore\n }\n\n await fs.writeFile(plistPath, content, \"utf-8\");\n execSync(`launchctl load ${plistPath}`);\n\n return \"Successfully configured and loaded LaunchAgent for macOS. aar daemon will autostart on login.\";\n } else if (platform === \"linux\") {\n const serviceDir = path.join(os.homedir(), \".config/systemd/user\");\n const servicePath = path.join(serviceDir, \"aar.service\");\n\n await fs.ensureDir(serviceDir);\n const content = generateServiceContent(aarPath);\n\n await fs.writeFile(servicePath, content, \"utf-8\");\n\n execSync(\"systemctl --user daemon-reload\");\n execSync(\"systemctl --user enable aar\");\n execSync(\"systemctl --user start aar\");\n\n return \"Successfully configured and enabled Systemd user service for Linux. aar daemon will autostart on login.\";\n } else {\n throw new Error(`Autostart is not supported on platform: ${platform}`);\n }\n}\n\n/**\n * ログイン時の自動起動を無効化する。\n */\nexport async function removeAutostart(): Promise<string> {\n const platform = os.platform();\n\n if (platform === \"darwin\") {\n const plistPath = path.join(os.homedir(), \"Library/LaunchAgents/com.user.agent-auto-resume.plist\");\n\n if (fs.existsSync(plistPath)) {\n try {\n execSync(`launchctl unload ${plistPath}`, { stdio: \"ignore\" });\n } catch {\n // ignore\n }\n await fs.remove(plistPath);\n return \"Removed LaunchAgent plist for macOS. Autostart disabled.\";\n }\n return \"Autostart settings not found. Nothing to remove.\";\n } else if (platform === \"linux\") {\n const servicePath = path.join(os.homedir(), \".config/systemd/user/aar.service\");\n\n if (fs.existsSync(servicePath)) {\n try {\n execSync(\"systemctl --user stop aar\", { stdio: \"ignore\" });\n execSync(\"systemctl --user disable aar\", { stdio: \"ignore\" });\n } catch {\n // ignore\n }\n await fs.remove(servicePath);\n return \"Removed Systemd service for Linux. Autostart disabled.\";\n }\n return \"Autostart settings not found. Nothing to remove.\";\n } else {\n throw new Error(`Autostart is not supported on platform: ${platform}`);\n }\n}\n","import { ensureDirs, loadConfig } from \"../core/session-store.js\";\nimport { setupShell, ShellType, getSnippet } from \"../core/shell-setup.js\";\nimport { setupAutostart } from \"../core/autostart.js\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\nimport readline from \"readline\";\n\nexport interface SetupOptions {\n shell?: ShellType;\n noShellModify?: boolean;\n printShellSnippet?: boolean;\n}\n\nfunction askQuestion(query: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question(query, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\nexport async function runSetup(options: SetupOptions) {\n console.log(chalk.bold(\"Starting agent-auto-resume setup...\\n\"));\n\n await ensureDirs();\n console.log(chalk.green(\"✓ Initialized state directory at ~/.agent-auto-resume/\"));\n\n await loadConfig();\n console.log(chalk.green(\"✓ Created configuration file config.json\"));\n\n const providers = [\n { name: \"Claude Code\", cmd: \"claude\" },\n { name: \"OpenAI Codex CLI\", cmd: \"codex\" },\n { name: \"Google Antigravity CLI\", cmd: \"agy\" },\n ];\n\n console.log(\"\\nChecking provider CLI commands:\");\n for (const p of providers) {\n try {\n execSync(`which ${p.cmd}`, { stdio: \"ignore\" });\n console.log(chalk.green(` ✓ ${p.name} (${p.cmd}) is installed.`));\n } catch {\n console.log(chalk.yellow(` ⚠ ${p.name} (${p.cmd}) was not found in your PATH.`));\n }\n }\n\n if (options.printShellSnippet) {\n const shell = options.shell || \"zsh\";\n console.log(`\\n--- Shell Snippet for ${shell} ---`);\n console.log(getSnippet(shell));\n console.log(\"---------------------------------\");\n return;\n }\n\n console.log(\"\");\n const resultMessage = await setupShell(options.shell, options.noShellModify);\n console.log(resultMessage);\n\n if (options.noShellModify) {\n return;\n }\n\n console.log(\"\");\n const autostartAns = await askQuestion(chalk.cyan(\"? Do you want aar daemon to start automatically when you log in? (y/N): \"));\n if (autostartAns.toLowerCase().startsWith(\"y\")) {\n try {\n const msg = await setupAutostart();\n console.log(chalk.green(`✓ ${msg}`));\n } catch (err: any) {\n console.error(chalk.red(`✗ Failed to setup autostart: ${err?.message}`));\n }\n } else {\n console.log(chalk.gray(\"Skipped automatic startup configuration. You can start the daemon manually using 'aar daemon start'.\"));\n }\n}\n\n","import { spawn } from \"child_process\";\nimport fs from \"fs-extra\";\nimport { isDaemonRunning, readPid } from \"./daemon-ipc.js\";\nimport { LOG_FILE } from \"./logger.js\";\nimport { ensureDirs } from \"./session-store.js\";\n\n/**\n * デーモンをバックグラウンドプロセスとして起動する。\n */\nexport async function startDaemonProcess(options: { tmux?: boolean } = {}): Promise<void> {\n if (await isDaemonRunning()) {\n const pid = await readPid();\n console.log(`Daemon is already running (PID: ${pid}).`);\n return;\n }\n\n await ensureDirs();\n\n const nodeBin = process.argv[0];\n const originalArgs = process.argv.slice(1);\n \n // 'start' 引数を 'run' に置換\n const args = originalArgs.map((arg) => {\n if (arg === \"start\") return \"run\";\n return arg;\n });\n\n // 'run' サブコマンドが含まれていない場合は追加\n if (!args.includes(\"run\")) {\n const daemonIdx = args.indexOf(\"daemon\");\n if (daemonIdx !== -1) {\n args.splice(daemonIdx + 1, 0, \"run\");\n }\n }\n\n // 重複フラグなどのクリーンアップ\n // '--tmux' が重複して指定されないように調整\n const cleanArgs = args.filter((a) => a !== \"start\" && a !== \"restart\");\n if (options.tmux && !cleanArgs.includes(\"--tmux\")) {\n cleanArgs.push(\"--tmux\");\n }\n\n console.log(\"Starting agent-auto-resume daemon in background...\");\n\n const outFd = fs.openSync(LOG_FILE, \"a\");\n const errFd = fs.openSync(LOG_FILE, \"a\");\n\n const child = spawn(nodeBin, cleanArgs, {\n detached: true,\n stdio: [\"ignore\", outFd, errFd],\n env: {\n ...process.env,\n },\n });\n\n child.unref();\n\n // 起動完了を最大2秒待つ\n for (let i = 0; i < 4; i++) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (await isDaemonRunning()) {\n const pid = await readPid();\n console.log(`Daemon started successfully (PID: ${pid}). Log file: ${LOG_FILE}`);\n return;\n }\n }\n\n console.error(\"Failed to start daemon. Please check the log file for errors:\");\n console.error(LOG_FILE);\n}\n\n/**\n * デーモンプロセスを停止する。\n */\nexport async function stopDaemonProcess(): Promise<void> {\n const pid = await readPid();\n if (!pid || !(await isDaemonRunning())) {\n console.log(\"Daemon is not running.\");\n return;\n }\n\n console.log(`Stopping daemon (PID: ${pid})...`);\n try {\n process.kill(pid, \"SIGTERM\");\n \n // 停止するまでポーリングで待つ (最大5秒)\n for (let i = 0; i < 10; i++) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (!(await isDaemonRunning())) {\n console.log(\"Daemon stopped successfully.\");\n return;\n }\n }\n \n console.warn(\"Daemon did not respond to SIGTERM. Force killing...\");\n process.kill(pid, \"SIGKILL\");\n console.log(\"Daemon force killed.\");\n } catch (err: any) {\n console.error(`Failed to stop daemon: ${err.message}`);\n }\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport { BASE_DIR, ensureDirs } from \"./session-store.js\";\n\nexport const PID_FILE = path.join(BASE_DIR, \"daemon.pid\");\n\nexport async function writePid(pid: number): Promise<void> {\n await ensureDirs();\n await fs.writeFile(PID_FILE, pid.toString(), \"utf-8\");\n}\n\nexport async function readPid(): Promise<number | undefined> {\n if (!(await fs.pathExists(PID_FILE))) {\n return undefined;\n }\n try {\n const content = await fs.readFile(PID_FILE, \"utf-8\");\n const pid = parseInt(content.trim(), 10);\n return isNaN(pid) ? undefined : pid;\n } catch {\n return undefined;\n }\n}\n\nexport async function clearPid(): Promise<void> {\n if (await fs.pathExists(PID_FILE)) {\n await fs.remove(PID_FILE);\n }\n}\n\nexport async function isDaemonRunning(): Promise<boolean> {\n const pid = await readPid();\n if (!pid) {\n return false;\n }\n try {\n // pid にシグナル 0 を送って生存確認\n process.kill(pid, 0);\n return true;\n } catch (err: any) {\n if (err.code === \"ESRCH\") {\n // 存在しないプロセスなのでPIDファイルをクリーンアップ\n await clearPid();\n return false;\n }\n // EPERM の場合は権限不足だがプロセスは存在している\n return err.code === \"EPERM\";\n }\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport { BASE_DIR, ensureDirs } from \"./session-store.js\";\n\nexport const LOG_FILE = path.join(BASE_DIR, \"daemon.log\");\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nlet currentLogLevel = LogLevel.INFO;\n\nexport function setLogLevel(level: LogLevel) {\n currentLogLevel = level;\n}\n\nasync function writeToFile(message: string) {\n try {\n await ensureDirs();\n const ts = new Date().toISOString();\n // 制御文字 (chalkのカラーコードなど) を削除してログファイルに保存\n const cleanMsg = message.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, \"\");\n await fs.appendFile(LOG_FILE, `[${ts}] ${cleanMsg}\\n`, \"utf-8\");\n } catch {\n // ログ書き込み失敗は静かに無視\n }\n}\n\nfunction formatMessage(prefix: string, message: string, colorFn?: (s: string) => string): string {\n const cleanPrefix = prefix ? `[${prefix}] ` : \"\";\n const formatted = `${cleanPrefix}${message}`;\n return colorFn ? colorFn(formatted) : formatted;\n}\n\nexport const logger = {\n debug(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.DEBUG) {\n const msg = formatMessage(prefix, message, chalk.gray);\n console.log(msg);\n writeToFile(msg);\n }\n },\n\n info(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.INFO) {\n const msg = formatMessage(prefix, message, chalk.blue);\n console.log(msg);\n writeToFile(msg);\n }\n },\n\n warn(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.WARN) {\n const msg = formatMessage(prefix, message, chalk.yellow);\n console.warn(msg);\n writeToFile(msg);\n }\n },\n\n error(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.ERROR) {\n const msg = formatMessage(prefix, message, chalk.red);\n console.error(msg);\n writeToFile(msg);\n }\n },\n};\n","import chokidar from \"chokidar\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { loadConfig, resolveHome, createSession, listSessions, updateSession } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { getProvider } from \"../providers/index.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { ProviderName } from \"./types.js\";\n\nconst fileCursors = new Map<string, number>();\n\nexport async function startTranscriptWatcher(abortSignal?: AbortSignal) {\n const config = await loadConfig();\n const watchers: chokidar.FSWatcher[] = [];\n\n const providersToWatch: ProviderName[] = [\"claude\", \"codex\"];\n\n for (const providerName of providersToWatch) {\n const providerConfig = config.providers[providerName];\n if (!providerConfig || !providerConfig.enabled || !providerConfig.watchTranscripts) {\n continue;\n }\n\n const provider = getProvider(providerName);\n if (!provider.parseTranscriptEvent || !provider.getTranscriptDirs) {\n continue;\n }\n\n const dirs = providerConfig.transcriptDirs.map(resolveHome);\n\n for (const dir of dirs) {\n if (!(await fs.pathExists(dir))) {\n logger.debug(`Transcript watch directory does not exist: ${dir}, skipping`, \"aar\");\n continue;\n }\n\n logger.info(`Starting transcript watcher for ${provider.displayName} at ${dir}`, \"aar\");\n const watcher = chokidar.watch(dir, {\n persistent: true,\n ignoreInitial: false,\n });\n\n watcher.on(\"add\", (filePath) => handleFileChange(filePath, providerName));\n watcher.on(\"change\", (filePath) => handleFileChange(filePath, providerName));\n watchers.push(watcher);\n }\n }\n\n abortSignal?.addEventListener(\"abort\", () => {\n for (const w of watchers) {\n w.close();\n }\n logger.info(\"Transcript watchers stopped.\", \"aar\");\n });\n}\n\nasync function handleFileChange(filePath: string, providerName: ProviderName) {\n const ext = path.extname(filePath).toLowerCase();\n if (ext !== \".json\" && ext !== \".jsonl\" && ext !== \"\") {\n return;\n }\n\n try {\n const stat = await fs.stat(filePath);\n const startCursor = fileCursors.get(filePath) || 0;\n \n if (stat.size <= startCursor) {\n fileCursors.set(filePath, stat.size);\n return;\n }\n\n const fd = await fs.open(filePath, \"r\");\n const buffer = Buffer.alloc(stat.size - startCursor);\n await fs.read(fd, buffer, 0, buffer.length, startCursor);\n await fs.close(fd);\n\n fileCursors.set(filePath, stat.size);\n\n const content = buffer.toString(\"utf-8\");\n const lines = content.split(/\\r?\\n/);\n const provider = getProvider(providerName);\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n const event = provider.parseTranscriptEvent!(line);\n if (event && event.text) {\n const detection = detectLimit(event.text, providerName);\n if (detection.matched) {\n logger.warn(`Limit detected via transcript watcher in file ${filePath}: ${detection.reason}`, \"aar\");\n\n const sessions = await listSessions();\n const matchedSession = sessions.find(\n (s) =>\n s.status === \"running\" &&\n s.provider === providerName &&\n (event.cwd ? s.cwd === event.cwd : true)\n );\n\n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n\n if (matchedSession) {\n if (matchedSession.status !== \"waiting_limit_reset\") {\n await updateSession(matchedSession.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: event.text.slice(-1000),\n transcriptPath: filePath,\n });\n logger.info(`Updated existing session ${matchedSession.id} to waiting_limit_reset`, \"aar\");\n }\n } else {\n const config = await loadConfig();\n const newSession = await createSession({\n provider: providerName,\n cwd: event.cwd || process.cwd(),\n originalCommand: provider.defaultCommand,\n resumeStrategy: providerName === \"claude\" ? \"pty-input\" : \"command\",\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n attempts: 0,\n maxAttempts: config.maxAttempts,\n bufferSeconds: config.bufferSeconds,\n lastOutputSnippet: event.text.slice(-1000),\n managedByAar: false,\n source: \"transcript-watcher\",\n transcriptPath: filePath,\n });\n logger.info(`Created new session ${newSession.id} via transcript-watcher`, \"aar\");\n }\n }\n }\n }\n } catch (err: any) {\n logger.debug(`Error reading transcript file ${filePath}: ${err.message}`, \"aar\");\n }\n}\n","export function parseTimeString(str: string, referenceDate: Date = new Date()): Date | undefined {\n // 1. retry_after (秒数)\n // \"retry_after\": 3600, retry_after: 3600, retry after 3600 seconds など\n const retryAfterRegex = /(?:retry_after|retry after)[\"'\\s]*:?\\s*(\\d+)/i;\n const retryAfterMatch = str.match(retryAfterRegex);\n if (retryAfterMatch) {\n const seconds = parseInt(retryAfterMatch[1], 10);\n if (!isNaN(seconds)) {\n return new Date(referenceDate.getTime() + seconds * 1000);\n }\n }\n\n // 2. ISO8601\n // 2026-06-06T15:00:00+09:00, 2026-06-06T15:00:00Z など\n const isoRegex = /(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?)/i;\n const isoMatch = str.match(isoRegex);\n if (isoMatch) {\n const parsed = Date.parse(isoMatch[1]);\n if (!isNaN(parsed)) {\n return new Date(parsed);\n }\n }\n\n // 3. YYYY-MM-DD HH:mm(:ss)?\n // 2026-06-06 15:00\n const dateStrRegex = /(\\d{4})-(\\d{2})-(\\d{2})\\s+(\\d{1,2}):(\\d{2})(?::(\\d{2}))?/;\n const dateStrMatch = str.match(dateStrRegex);\n if (dateStrMatch) {\n const year = parseInt(dateStrMatch[1], 10);\n const month = parseInt(dateStrMatch[2], 10) - 1; // 0-indexed\n const day = parseInt(dateStrMatch[3], 10);\n const hour = parseInt(dateStrMatch[4], 10);\n const minute = parseInt(dateStrMatch[5], 10);\n const second = dateStrMatch[6] ? parseInt(dateStrMatch[6], 10) : 0;\n const date = new Date(year, month, day, hour, minute, second);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n\n // 4. 時刻のみの表現 (3pm, 3 PM, 15:00, 6:34 AM, resets at 3pm, try again at 6:34 AM など)\n // まず、リセット指示のキーワードに続く時刻表記を探す\n const keywordTimeRegex = /(?:reset|resets|resets_at|try again|try\\s+again\\s+at|at|resets\\s+at|will\\s+reset\\s+at)\\s+(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)?/i;\n const keywordTimeMatch = str.match(keywordTimeRegex);\n\n let hourStr = \"\";\n let minStr = \"\";\n let ampmStr = \"\";\n\n if (keywordTimeMatch) {\n hourStr = keywordTimeMatch[1];\n minStr = keywordTimeMatch[2] || \"0\";\n ampmStr = keywordTimeMatch[3] || \"\";\n } else {\n // 単体での時刻表現に完全一致するか試す\n const exactTimeRegex = /^\\s*(?:at\\s+)?(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)?\\s*$/i;\n const exactMatch = str.match(exactTimeRegex);\n if (exactMatch) {\n hourStr = exactMatch[1];\n minStr = exactMatch[2] || \"0\";\n ampmStr = exactMatch[3] || \"\";\n } else {\n // 部分一致で時刻表現を探す (例: 15:00 や 3pm, 6:34 AM)\n // \"5-hour\" や \"3600\" などの数値単体を誤検知しないよう、コロン(:)を含むか am/pm を伴うものに限定\n const partialTimeRegex = /\\b(\\d{1,2}):(\\d{2})\\s*(am|pm)?\\b|\\b(\\d{1,2})\\s*(am|pm)\\b/i;\n const partialMatch = str.match(partialTimeRegex);\n if (partialMatch) {\n if (partialMatch[1] !== undefined) {\n hourStr = partialMatch[1];\n minStr = partialMatch[2];\n ampmStr = partialMatch[3] || \"\";\n } else {\n hourStr = partialMatch[4];\n minStr = \"0\";\n ampmStr = partialMatch[5];\n }\n }\n }\n }\n\n if (hourStr) {\n let hour = parseInt(hourStr, 10);\n const minute = parseInt(minStr, 10);\n const ampm = ampmStr.toLowerCase();\n\n if (ampm === \"pm\" && hour < 12) {\n hour += 12;\n } else if (ampm === \"am\" && hour === 12) {\n hour = 0;\n }\n\n if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60) {\n const date = new Date(referenceDate);\n date.setHours(hour, minute, 0, 0);\n\n // 設定された時刻が referenceDate (現在時刻) よりも過去であれば翌日とする\n if (date.getTime() <= referenceDate.getTime()) {\n date.setDate(date.getDate() + 1);\n }\n return date;\n }\n }\n\n return undefined;\n}\n","import { AgentProvider, LimitDetection, SessionState } from \"../core/types.js\";\nimport { parseTimeString } from \"../core/time-parser.js\";\n\nexport const claudeProvider: AgentProvider = {\n name: \"claude\",\n displayName: \"Claude Code\",\n defaultCommand: [\"claude\"],\n\n detectLimit(output: string): LimitDetection {\n const lines = output.split(/\\r?\\n/);\n const patterns = [\n /5-hour limit reached/i,\n /usage limit reached/i,\n /rate limit reached/i,\n /limit will reset at/i,\n /resource_exhausted/i,\n /exhausted your capacity/i,\n /code 429/i,\n /rate_limit_error/i,\n /rate limit exceeded/i,\n /exceeded your/i,\n /session limit/i,\n /hit your session limit/i,\n ];\n\n for (const line of lines) {\n const matched = patterns.some((p) => p.test(line));\n if (matched) {\n const resetAt = parseTimeString(line);\n return {\n matched: true,\n provider: \"claude\",\n reason: line.trim(),\n resetAt,\n raw: line,\n };\n }\n }\n\n return { matched: false, provider: \"claude\" };\n },\n\n getResumeCommand(state: SessionState): string[] {\n return [\"claude\", \"--continue\"];\n },\n\n getResumeInput(state: SessionState): string {\n return \"continue\\n\";\n },\n\n getTranscriptDirs(): string[] {\n return [\"~/.claude/projects\"];\n },\n\n parseTranscriptEvent(line: string) {\n try {\n const data = JSON.parse(line);\n if (data && typeof data === \"object\") {\n // text フィールドは data.text や data.message, または data.input.text など\n let text = data.text || data.message || data.content;\n if (!text && data.input && typeof data.input === \"object\") {\n text = data.input.text;\n }\n if (!text && data.output && typeof data.output === \"object\") {\n text = data.output.text;\n }\n return {\n text: typeof text === \"string\" ? text : undefined,\n cwd: typeof data.cwd === \"string\" ? data.cwd : undefined,\n sessionId: typeof data.sessionId === \"string\" ? data.sessionId : (typeof data.uuid === \"string\" ? data.uuid : undefined),\n timestamp: typeof data.timestamp === \"string\" ? data.timestamp : (typeof data.createdAt === \"string\" ? data.createdAt : undefined),\n };\n }\n } catch {\n // JSONパースエラーは無視\n }\n return undefined;\n },\n};\n","export const CODEX_SAFE_RESUME_PROMPT = `\nContinue the previous task from where it stopped.\n\nBefore making changes:\n1. Inspect the current repository state.\n2. Run git status.\n3. Inspect git diff.\n4. Read AGENT_PROGRESS.md if it exists.\n5. Identify what was already completed and what remains.\n6. Do not overwrite user changes.\n7. Continue only the remaining work.\n8. Run relevant tests if available.\n9. Summarize what changed and what remains.\n`;\n\nexport const ANTIGRAVITY_SAFE_RESUME_PROMPT = `\nContinue the previous task from where it stopped.\n\nBefore making changes:\n1. Inspect the current workspace state.\n2. Run git status.\n3. Inspect git diff.\n4. Read AGENT_PROGRESS.md if it exists.\n5. Identify what was already completed and what remains.\n6. Do not overwrite user changes.\n7. Continue only the remaining work.\n8. Ask for confirmation before destructive operations.\n9. Run relevant tests if available.\n10. Summarize what changed and what remains.\n`;\n\nexport const CLAUDE_SAFE_RESUME_PROMPT = `\nContinue the previous task from where it stopped.\n\nBefore making changes:\n1. Inspect the current repository state.\n2. Run git status.\n3. Inspect git diff.\n4. Read AGENT_PROGRESS.md if it exists.\n5. Continue only the remaining work.\n6. Do not overwrite user changes.\n7. Summarize what changed and what remains.\n`;\n","import { AgentProvider, LimitDetection, SessionState } from \"../core/types.js\";\nimport { parseTimeString } from \"../core/time-parser.js\";\nimport { CODEX_SAFE_RESUME_PROMPT } from \"../prompts/safe-resume.js\";\n\nexport const codexProvider: AgentProvider = {\n name: \"codex\",\n displayName: \"OpenAI Codex CLI\",\n defaultCommand: [\"codex\"],\n\n detectLimit(output: string): LimitDetection {\n const lines = output.split(/\\r?\\n/);\n const patterns = [\n /usage limit reached/i,\n /rate limit reached/i,\n /try again at/i,\n /resets_at/i,\n /usage_limit_reached/i,\n ];\n\n for (const line of lines) {\n const matched = patterns.some((p) => p.test(line));\n if (matched) {\n const resetAt = parseTimeString(line);\n return {\n matched: true,\n provider: \"codex\",\n reason: line.trim(),\n resetAt,\n raw: line,\n };\n }\n }\n\n return { matched: false, provider: \"codex\" };\n },\n\n getResumeCommand(state: SessionState): string[] {\n return [\n \"codex\",\n \"exec\",\n \"resume\",\n \"--last\",\n CODEX_SAFE_RESUME_PROMPT.trim(),\n ];\n },\n\n getTranscriptDirs(): string[] {\n return [\"~/.codex/sessions\"];\n },\n\n parseTranscriptEvent(line: string) {\n try {\n const data = JSON.parse(line);\n if (data && typeof data === \"object\") {\n const text = data.text || data.message || data.content;\n return {\n text: typeof text === \"string\" ? text : undefined,\n cwd: typeof data.cwd === \"string\" ? data.cwd : undefined,\n sessionId: typeof data.sessionId === \"string\" ? data.sessionId : undefined,\n timestamp: typeof data.timestamp === \"string\" ? data.timestamp : undefined,\n };\n }\n } catch {\n // ignore\n }\n return undefined;\n },\n};\n","import { execSync } from \"child_process\";\nimport { AgentProvider, LimitDetection, SessionState } from \"../core/types.js\";\nimport { parseTimeString } from \"../core/time-parser.js\";\nimport { ANTIGRAVITY_SAFE_RESUME_PROMPT } from \"../prompts/safe-resume.js\";\n\nexport const antigravityProvider: AgentProvider = {\n name: \"antigravity\",\n displayName: \"Google Antigravity CLI\",\n defaultCommand: [\"agy\"],\n\n detectLimit(output: string): LimitDetection {\n const lines = output.split(/\\r?\\n/);\n const patterns = [\n /usage limit reached/i,\n /rate limit reached/i,\n /quota exceeded/i,\n /quota exhausted/i,\n /daily limit reached/i,\n /5-hour limit reached/i,\n /reached your Antigravity limit/i,\n /Antigravity usage limit reached/i,\n /try again at/i,\n /reset at/i,\n /resets at/i,\n /resets_at/i,\n /retry after/i,\n /retry_after/i,\n /resource_exhausted/i,\n /exhausted your capacity/i,\n /code 429/i,\n ];\n\n for (const line of lines) {\n const matched = patterns.some((p) => p.test(line));\n if (matched) {\n const resetAt = parseTimeString(line);\n return {\n matched: true,\n provider: \"antigravity\",\n reason: line.trim(),\n resetAt,\n raw: line,\n };\n }\n }\n\n return { matched: false, provider: \"antigravity\" };\n },\n\n async getResumeCommand(state: SessionState): Promise<string[]> {\n let helpOutput = \"\";\n try {\n helpOutput = execSync(\"agy --help\", {\n cwd: state.cwd,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n // agyコマンドが使えない、またはエラーの場合は helpOutput が空になる\n }\n\n if (helpOutput) {\n // 優先順位: agy resume --last -> agy continue -> agy c -> agy conversation --last -> fallback: agy\n if (helpOutput.includes(\"resume\") && helpOutput.includes(\"--last\")) {\n return [\"agy\", \"resume\", \"--last\"];\n }\n if (helpOutput.includes(\"continue\")) {\n return [\"agy\", \"continue\"];\n }\n \n const lines = helpOutput.split(\"\\n\");\n const hasC = lines.some((line) => {\n const trimmed = line.trim();\n return trimmed.startsWith(\"c \") || trimmed.startsWith(\"c\\t\");\n });\n if (hasC) {\n return [\"agy\", \"c\"];\n }\n\n if (helpOutput.includes(\"conversation\") && helpOutput.includes(\"--last\")) {\n return [\"agy\", \"conversation\", \"--last\"];\n }\n }\n\n return [\"agy\"];\n },\n\n getResumeInput(state: SessionState): string | undefined {\n if (state.resumeCommand && state.resumeCommand.length === 1 && state.resumeCommand[0] === \"agy\") {\n return ANTIGRAVITY_SAFE_RESUME_PROMPT.trim() + \"\\n\";\n }\n return undefined;\n },\n\n getTranscriptDirs(): string[] {\n return [];\n },\n};\n","import { claudeProvider } from \"./claude.js\";\nimport { codexProvider } from \"./codex.js\";\nimport { antigravityProvider } from \"./antigravity.js\";\n\nexport const providers = {\n claude: claudeProvider,\n codex: codexProvider,\n antigravity: antigravityProvider,\n} as const;\n\nexport function getProvider(name: string) {\n const normalized = name.toLowerCase();\n if (normalized === \"agy\" || normalized === \"antigravity\") {\n return antigravityProvider;\n }\n if (normalized === \"claude\") {\n return claudeProvider;\n }\n if (normalized === \"codex\") {\n return codexProvider;\n }\n\n throw new Error(`Unsupported provider: ${name}`);\n}\n","import { getProvider } from \"../providers/index.js\";\nimport { ProviderName, LimitDetection } from \"./types.js\";\n\nexport function detectLimit(output: string, providerName?: ProviderName): LimitDetection {\n if (providerName) {\n try {\n const provider = getProvider(providerName);\n return provider.detectLimit(output);\n } catch {\n // ignore and fallback to checking all\n }\n }\n\n const allProviders: ProviderName[] = [\"claude\", \"codex\", \"antigravity\"];\n for (const name of allProviders) {\n const provider = getProvider(name);\n const detection = provider.detectLimit(output);\n if (detection.matched) {\n return detection;\n }\n }\n\n return { matched: false, provider: providerName || \"claude\" };\n}\n","import { execSync } from \"child_process\";\nimport { loadConfig, createSession, listSessions, updateSession } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { ProviderName } from \"./types.js\";\nimport { getProvider } from \"../providers/index.js\";\n\nlet tmuxTimer: NodeJS.Timeout | undefined;\n\nexport async function startTmuxWatcher(abortSignal?: AbortSignal) {\n const config = await loadConfig();\n if (!config.tmux.enabled) {\n return;\n }\n\n try {\n execSync(\"tmux -V\", { stdio: \"ignore\" });\n } catch {\n logger.warn(\"tmux is enabled in config, but 'tmux' command was not found. tmux watcher is disabled.\", \"aar\");\n return;\n }\n\n logger.info(\"Starting tmux watcher (experimental)...\", \"aar\");\n\n const poll = async () => {\n if (abortSignal?.aborted) return;\n try {\n await checkTmuxPanes();\n } catch (err: any) {\n logger.debug(`Error checking tmux panes: ${err.message}`, \"aar\");\n }\n tmuxTimer = setTimeout(poll, config.tmux.pollIntervalMs || 5000);\n };\n\n poll();\n\n abortSignal?.addEventListener(\"abort\", () => {\n if (tmuxTimer) clearTimeout(tmuxTimer);\n logger.info(\"Tmux watcher stopped.\", \"aar\");\n });\n}\n\nasync function checkTmuxPanes() {\n let listOutput = \"\";\n try {\n listOutput = execSync(\"tmux list-panes -a -F '#{pane_id}|#{pane_pid}|#{pane_current_path}|#{pane_current_command}'\", {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n return;\n }\n\n const panes = listOutput.split(\"\\n\").filter(Boolean).map((line) => {\n const [paneId, panePid, paneCwd, paneCmd] = line.split(\"|\");\n return { paneId, panePid, paneCwd, paneCmd };\n });\n\n const providers: { name: ProviderName; cmdKeywords: string[] }[] = [\n { name: \"claude\", cmdKeywords: [\"claude\", \"claude-code\"] },\n { name: \"codex\", cmdKeywords: [\"codex\"] },\n { name: \"antigravity\", cmdKeywords: [\"agy\", \"antigravity\"] },\n ];\n\n for (const pane of panes) {\n const matchedProvider = providers.find((p) =>\n p.cmdKeywords.some((keyword) => pane.paneCmd.toLowerCase().includes(keyword))\n );\n\n if (!matchedProvider) {\n continue;\n }\n\n let paneOutput = \"\";\n try {\n paneOutput = execSync(`tmux capture-pane -p -t ${pane.paneId}`, {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n continue;\n }\n\n const detection = detectLimit(paneOutput, matchedProvider.name);\n if (detection.matched) {\n const sessions = await listSessions();\n let matchedSession = sessions.find((s) => s.tmuxPaneId === pane.paneId && s.status === \"waiting_limit_reset\");\n\n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n\n if (!matchedSession) {\n matchedSession = sessions.find((s) => s.tmuxPaneId === pane.paneId && s.status === \"running\");\n \n if (matchedSession) {\n await updateSession(matchedSession.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: paneOutput.slice(-1000),\n });\n logger.info(`Updated tmux session ${matchedSession.id} to waiting_limit_reset`, \"aar\");\n } else {\n const config = await loadConfig();\n const provider = getProvider(matchedProvider.name);\n const newSession = await createSession({\n provider: matchedProvider.name,\n cwd: pane.paneCwd || process.cwd(),\n originalCommand: provider.defaultCommand,\n resumeStrategy: \"pty-input\",\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n attempts: 0,\n maxAttempts: config.maxAttempts,\n bufferSeconds: config.bufferSeconds,\n lastOutputSnippet: paneOutput.slice(-1000),\n managedByAar: false,\n source: \"tmux-watcher\",\n tmuxPaneId: pane.paneId,\n });\n logger.info(`Created new session ${newSession.id} via tmux-watcher (pane: ${pane.paneId})`, \"aar\");\n }\n }\n }\n }\n}\n\n/**\n * tmux pane に対してキー入力を送信する。\n */\nexport function sendKeysToTmux(paneId: string, keys: string): boolean {\n try {\n // 改行コードなどを適切に解釈して送信\n execSync(`tmux send-keys -t ${paneId} \"${keys.replace(/\"/g, '\\\\\"')}\"`, { stdio: \"ignore\" });\n return true;\n } catch (err: any) {\n logger.error(`Failed to send keys to tmux pane ${paneId}: ${err.message}`, \"aar\");\n return false;\n }\n}\n","import { SessionState } from \"./types.js\";\n\n/**\n * セッション再開までの待機時間(ミリ秒)を計算する。\n * @param state セッション状態\n * @returns 待機時間(ミリ秒)。既に経過している場合は 0 以下の数値。\n */\nexport function getWaitMs(state: SessionState): number {\n if (!state.resetAt) {\n return 0;\n }\n const resetTime = new Date(state.resetAt).getTime();\n const bufferMs = (state.bufferSeconds ?? 120) * 1000;\n const targetTime = resetTime + bufferMs;\n const now = Date.now();\n return targetTime - now;\n}\n\n/**\n * 指定時間、ポーリングを挟みながら非同期に待機する。\n * AbortSignalが渡された場合は、途中で中断可能。\n * @param ms 待機時間(ミリ秒)\n * @param abortSignal 中断シグナル\n */\nexport async function waitMs(ms: number, abortSignal?: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n\n const start = Date.now();\n // 60秒以下でも、より細かく1秒毎にポーリングして中断を確認する\n const checkInterval = 1000;\n\n while (Date.now() - start < ms) {\n if (abortSignal?.aborted) {\n break;\n }\n const remaining = ms - (Date.now() - start);\n const sleepTime = Math.min(remaining, checkInterval);\n await new Promise((resolve) => setTimeout(resolve, sleepTime));\n }\n}\n","import pty from \"node-pty\";\nimport { SessionState } from \"./types.js\";\nimport { updateSession, getSession } from \"./session-store.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { getProvider } from \"../providers/index.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * セッションをバックグラウンド(PTY)で再開し、結果を監視する。\n * @param state セッション情報\n * @returns 再開および実行が成功した場合は true、失敗した、または再度リミットに達した場合は false\n */\nexport async function resumeSessionInBackground(state: SessionState): Promise<boolean> {\n const provider = getProvider(state.provider);\n\n const resumeCommand = await provider.getResumeCommand(state);\n const resumeInput = provider.getResumeInput ? await provider.getResumeInput(state) : undefined;\n\n logger.info(`Resuming session ${state.id} with command: ${resumeCommand.join(\" \")}`, \"aar\");\n\n await updateSession(state.id, {\n status: \"resuming\",\n resumeCommand,\n resumeInput,\n attempts: state.attempts + 1,\n });\n\n const cmd = resumeCommand[0];\n const args = resumeCommand.slice(1);\n\n let ptyProcess: pty.IPty;\n try {\n ptyProcess = pty.spawn(cmd, args, {\n name: \"xterm-color\",\n cols: 80,\n rows: 24,\n cwd: state.cwd,\n env: {\n ...process.env,\n AAR_SESSION_ID: state.id,\n },\n });\n } catch (err: any) {\n logger.error(`Failed to spawn resume command: ${err.message}`, \"aar\");\n await updateSession(state.id, { status: \"failed\" });\n return false;\n }\n\n return new Promise<boolean>((resolve) => {\n\n let limitDetected = false;\n let accumulatedOutput = \"\";\n\n // PTYへの自動プロンプト入力がある場合、プロセス起動を少し待ってから送信する\n if (resumeInput) {\n setTimeout(() => {\n try {\n ptyProcess.write(resumeInput);\n logger.info(`Sent resume input to session ${state.id}: ${JSON.stringify(resumeInput)}`, \"aar\");\n } catch (err: any) {\n logger.error(`Failed to write resume input to PTY: ${err.message}`, \"aar\");\n }\n }, 2000);\n }\n\n ptyProcess.onData(async (data: string) => {\n accumulatedOutput += data;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n logger.debug(`[PTY Output ${state.id}] ${data.trim()}`, \"aar\");\n\n if (!limitDetected) {\n const detection = detectLimit(accumulatedOutput, state.provider);\n if (detection.matched) {\n limitDetected = true;\n logger.warn(`Limit re-detected during resume for session ${state.id}`, \"aar\");\n\n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n await updateSession(state.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: accumulatedOutput.slice(-1000),\n });\n\n try {\n ptyProcess.kill();\n } catch {\n // ignore\n }\n }\n }\n });\n\n ptyProcess.onExit(async (res) => {\n const current = await getSession(state.id);\n if (!current) {\n return resolve(false);\n }\n\n if (current.status === \"resuming\") {\n if (res.exitCode === 0) {\n logger.info(`Session ${state.id} completed successfully.`, \"aar\");\n await updateSession(state.id, { status: \"completed\" });\n resolve(true);\n } else {\n logger.info(`Session ${state.id} exited with code ${res.exitCode}.`, \"aar\");\n await updateSession(state.id, { status: \"failed\" });\n resolve(false);\n }\n } else if (current.status === \"waiting_limit_reset\") {\n resolve(false);\n } else {\n resolve(false);\n }\n });\n });\n}\n","import { loadConfig, getWaitingSessions, updateSession, ensureDirs } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { writePid, clearPid, isDaemonRunning } from \"./daemon-ipc.js\";\nimport { startTranscriptWatcher } from \"./transcript-watcher.js\";\nimport { startTmuxWatcher, sendKeysToTmux } from \"./tmux-watcher.js\";\nimport { getWaitMs } from \"./scheduler.js\";\nimport { resumeSessionInBackground } from \"./process-manager.js\";\nimport { getProvider } from \"../providers/index.js\";\n\nexport interface DaemonOptions {\n tmux?: boolean;\n}\n\nexport class AarDaemon {\n private abortController: AbortController | null = null;\n private timer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n\n async start(options: DaemonOptions = {}) {\n if (await isDaemonRunning()) {\n logger.error(\"Daemon is already running.\", \"aar\");\n process.exit(1);\n }\n\n await ensureDirs();\n await writePid(process.pid);\n logger.info(`Daemon started with PID ${process.pid}`, \"aar\");\n\n this.abortController = new AbortController();\n const config = await loadConfig();\n\n if (options.tmux !== undefined) {\n config.tmux.enabled = options.tmux;\n }\n\n await startTranscriptWatcher(this.abortController.signal);\n if (config.tmux.enabled) {\n await startTmuxWatcher(this.abortController.signal);\n }\n\n const shutdown = async () => {\n logger.info(\"Daemon shutting down...\", \"aar\");\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.abortController?.abort();\n await clearPid();\n logger.info(\"Daemon stopped.\", \"aar\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n const loop = async () => {\n if (this.abortController?.signal.aborted) {\n return;\n }\n if (!this.isProcessing) {\n this.isProcessing = true;\n try {\n await this.processWaitingSessions();\n } catch (err: any) {\n logger.error(`Error in daemon loop: ${err.message}`, \"aar\");\n } finally {\n this.isProcessing = false;\n }\n }\n this.timer = setTimeout(loop, config.daemon.pollIntervalMs || 5000);\n };\n\n loop();\n }\n\n private async processWaitingSessions() {\n const waiting = await getWaitingSessions();\n\n for (const session of waiting) {\n if (!session.resetAt) {\n logger.warn(`Session ${session.id} reset time is unknown. Mark as failed.`, \"aar\");\n await updateSession(session.id, {\n status: \"failed\",\n });\n continue;\n }\n\n const waitMsLeft = getWaitMs(session);\n if (waitMsLeft <= 0) {\n logger.info(`Session ${session.id} is ready to resume (Wait completed).`, \"aar\");\n \n await updateSession(session.id, {\n status: \"ready_to_resume\",\n });\n\n if (session.attempts >= session.maxAttempts) {\n logger.warn(`Session ${session.id} exceeded max resume attempts (${session.maxAttempts}). Mark as failed.`, \"aar\");\n await updateSession(session.id, {\n status: \"failed\",\n });\n continue;\n }\n\n if (session.source === \"tmux-watcher\" && session.tmuxPaneId) {\n const provider = getProvider(session.provider);\n const resumeInput = provider.getResumeInput ? await provider.getResumeInput(session) : undefined;\n \n if (resumeInput) {\n logger.info(`Resuming tmux session ${session.id} in pane ${session.tmuxPaneId}`, \"aar\");\n await updateSession(session.id, {\n status: \"resuming\",\n attempts: session.attempts + 1,\n });\n\n const sent = sendKeysToTmux(session.tmuxPaneId, resumeInput);\n if (sent) {\n await updateSession(session.id, {\n status: \"running\",\n });\n logger.info(`Sent resume input to tmux pane successfully.`, \"aar\");\n } else {\n await updateSession(session.id, {\n status: \"failed\",\n });\n }\n } else {\n await updateSession(session.id, {\n status: \"failed\",\n });\n }\n } else {\n try {\n const success = await resumeSessionInBackground(session);\n if (success) {\n logger.info(`Session ${session.id} resumed and completed successfully.`, \"aar\");\n } else {\n logger.warn(`Session ${session.id} resume failed or hit limit again.`, \"aar\");\n }\n } catch (err: any) {\n logger.error(`Failed to resume session ${session.id}: ${err.message}`, \"aar\");\n await updateSession(session.id, {\n status: \"failed\",\n });\n }\n }\n } else {\n const secondsLeft = Math.ceil(waitMsLeft / 1000);\n logger.debug(`Session ${session.id} waiting... ${secondsLeft}s left`, \"aar\");\n }\n }\n }\n}\n","import { startDaemonProcess, stopDaemonProcess } from \"../core/daemon-client.js\";\nimport { isDaemonRunning, readPid } from \"../core/daemon-ipc.js\";\nimport { LOG_FILE } from \"../core/logger.js\";\nimport { AarDaemon } from \"../core/daemon.js\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\n\nexport async function handleDaemon(action: string, options: { tmux?: boolean }) {\n const cleanAction = action.toLowerCase();\n \n if (cleanAction === \"start\") {\n await startDaemonProcess(options);\n } else if (cleanAction === \"stop\") {\n await stopDaemonProcess();\n } else if (cleanAction === \"restart\") {\n console.log(\"Restarting daemon...\");\n await stopDaemonProcess();\n await startDaemonProcess(options);\n } else if (cleanAction === \"status\") {\n const running = await isDaemonRunning();\n if (running) {\n const pid = await readPid();\n console.log(chalk.green(`Daemon is RUNNING (PID: ${pid})`));\n } else {\n console.log(chalk.red(\"Daemon is STOPPED\"));\n }\n } else if (cleanAction === \"logs\") {\n if (await fs.pathExists(LOG_FILE)) {\n const content = await fs.readFile(LOG_FILE, \"utf-8\");\n console.log(content);\n } else {\n console.log(\"No log file found.\");\n }\n } else if (cleanAction === \"run\") {\n const daemon = new AarDaemon();\n await daemon.start(options);\n } else {\n console.error(`Unknown daemon action: ${action}`);\n process.exit(1);\n }\n}\n","import pty from \"node-pty\";\nimport { spawn, ChildProcess } from \"child_process\";\nimport { SessionState, ProviderName } from \"./types.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { createSession, updateSession, loadConfig, getSession } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { getProvider } from \"../providers/index.js\";\n\n\nexport interface PtyRunnerOptions {\n providerName: ProviderName;\n command: string;\n args: string[];\n cwd?: string;\n sessionId?: string;\n}\n\nexport async function runInPty(options: PtyRunnerOptions): Promise<void> {\n const { providerName, command, args, cwd = process.cwd(), sessionId } = options;\n\n const config = await loadConfig();\n const provider = getProvider(providerName);\n\n let session: SessionState;\n if (sessionId) {\n const existing = await getSession(sessionId);\n if (existing) {\n session = existing;\n } else {\n throw new Error(`Session ${sessionId} not found`);\n }\n } else {\n session = await createSession({\n provider: providerName,\n cwd,\n originalCommand: [command, ...args],\n resumeStrategy: providerName === \"claude\" ? \"pty-input\" : \"command\",\n status: \"running\",\n attempts: 0,\n maxAttempts: config.maxAttempts,\n bufferSeconds: config.bufferSeconds,\n managedByAar: true,\n source: \"managed-pty\",\n });\n }\n\n logger.info(`Managed session started: ${session.id}`, \"aar\");\n\n const isInteractive = !!process.stdout.isTTY;\n const isServerMode = args.some((arg) =>\n arg.includes(\"app-server\") ||\n arg.includes(\"--listen\") ||\n arg.includes(\"stdio\") ||\n arg.includes(\"mcp\")\n );\n\n if (isServerMode || !isInteractive) {\n await runInPipe(session, command, args, cwd);\n return;\n }\n\n const ptyProcess = pty.spawn(command, args, {\n name: \"xterm-color\",\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n cwd,\n env: {\n ...process.env,\n AAR_SESSION_ID: session.id,\n },\n });\n\n await updateSession(session.id, { pid: ptyProcess.pid, status: \"running\" });\n\n\n let limitDetected = false;\n let accumulatedOutput = \"\";\n\n const resizeHandler = () => {\n try {\n ptyProcess.resize(process.stdout.columns || 80, process.stdout.rows || 24);\n } catch {\n // ignore\n }\n };\n process.stdout.on(\"resize\", resizeHandler);\n\n const stdinHandler = (data: Buffer) => {\n ptyProcess.write(data.toString());\n };\n \n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n process.stdin.on(\"data\", stdinHandler);\n\n ptyProcess.onData(async (data: string) => {\n process.stdout.write(data);\n \n accumulatedOutput += data;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n if (!limitDetected) {\n const detection = detectLimit(accumulatedOutput, providerName);\n if (detection.matched) {\n limitDetected = true;\n \n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n \n logger.warn(`Usage limit detected for ${provider.displayName}!`, \"aar\");\n if (resetAtStr) {\n logger.warn(`Resets at: ${detection.resetAt?.toLocaleString()}`, \"aar\");\n } else {\n logger.warn(\"Reset time not specified. Auto-resume will fail without manual intervention or retry-now.\", \"aar\");\n }\n\n await updateSession(session.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: accumulatedOutput.slice(-1000),\n });\n\n console.log(`\\n\\n\\x1b[33m[aar] Usage limit detected. Setting session to waiting state...\\x1b[0m`);\n console.log(`\\x1b[33m[aar] Session ID: ${session.id}\\x1b[0m`);\n if (resetAtStr) {\n console.log(`\\x1b[33m[aar] Scheduled to resume after reset time + buffer seconds.\\x1b[0m`);\n } else {\n console.log(`\\x1b[31m[aar] Warning: Reset time unknown. Run 'aar retry-now --id ${session.id}' manually if needed.\\x1b[0m`);\n }\n\n try {\n ptyProcess.kill();\n } catch {\n // ignore\n }\n }\n }\n });\n\n ptyProcess.onExit(async (res) => {\n process.stdout.off(\"resize\", resizeHandler);\n process.stdin.off(\"data\", stdinHandler);\n try {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n process.stdin.pause();\n } catch {\n // ignore\n }\n\n const currentSession = await getSession(session.id);\n if (currentSession) {\n if (currentSession.status === \"running\") {\n await updateSession(session.id, {\n status: res.exitCode === 0 ? \"completed\" : \"failed\",\n pid: undefined,\n });\n } else if (currentSession.status === \"waiting_limit_reset\") {\n await updateSession(session.id, {\n pid: undefined,\n });\n }\n }\n\n process.exit(res.exitCode);\n });\n}\n\nasync function runInPipe(\n session: SessionState,\n command: string,\n args: string[],\n cwd: string\n): Promise<void> {\n let child: ChildProcess;\n child = spawn(command, args, {\n cwd,\n env: {\n ...process.env,\n AAR_SESSION_ID: session.id,\n },\n });\n\n await updateSession(session.id, { pid: child.pid, status: \"running\" });\n\n\n let limitDetected = false;\n let accumulatedOutput = \"\";\n\n if (child.stdin) {\n process.stdin.pipe(child.stdin);\n }\n\n if (child.stdout) {\n child.stdout.on(\"data\", (data: Buffer) => {\n process.stdout.write(data);\n\n const str = data.toString(\"utf-8\");\n accumulatedOutput += str;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n checkLimit(str);\n });\n }\n\n if (child.stderr) {\n child.stderr.on(\"data\", (data: Buffer) => {\n process.stderr.write(data);\n\n const str = data.toString(\"utf-8\");\n accumulatedOutput += str;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n checkLimit(str);\n });\n }\n\n async function checkLimit(str: string) {\n if (!limitDetected) {\n const detection = detectLimit(accumulatedOutput, session.provider);\n if (detection.matched) {\n limitDetected = true;\n \n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n \n logger.warn(`Usage limit detected for ${session.provider}!`, \"aar\");\n\n await updateSession(session.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: accumulatedOutput.slice(-1000),\n });\n\n try {\n child.kill();\n } catch {\n // ignore\n }\n }\n }\n }\n\n return new Promise<void>((resolve) => {\n child.on(\"exit\", async (code) => {\n const currentSession = await getSession(session.id);\n if (currentSession) {\n if (currentSession.status === \"running\") {\n await updateSession(session.id, {\n status: code === 0 ? \"completed\" : \"failed\",\n pid: undefined,\n });\n } else if (currentSession.status === \"waiting_limit_reset\") {\n await updateSession(session.id, {\n pid: undefined,\n });\n }\n }\n process.exit(code || 0);\n });\n });\n}\n","import { runInPty } from \"../core/pty-runner.js\";\nimport { ProviderName } from \"../core/types.js\";\nimport { getProvider } from \"../providers/index.js\";\n\nexport async function runManaged(providerNameStr: string, args: string[]) {\n let providerName: ProviderName;\n try {\n const prov = getProvider(providerNameStr);\n providerName = prov.name;\n } catch (err: any) {\n console.error(err.message);\n process.exit(1);\n }\n\n if (args.length === 0) {\n console.error(\"No command specified. Usage: aar managed <provider> -- <command...>\");\n process.exit(1);\n }\n\n const command = args[0];\n const cmdArgs = args.slice(1);\n\n await runInPty({\n providerName,\n command,\n args: cmdArgs,\n cwd: process.cwd(),\n });\n}\n","import { runManaged } from \"./managed.js\";\n\nexport async function runGeneric(options: { provider?: string }, args: string[]) {\n if (!options.provider) {\n console.error(\"Provider must be specified via --provider <provider>\");\n process.exit(1);\n }\n await runManaged(options.provider, args);\n}\n","import { isDaemonRunning, readPid } from \"../core/daemon-ipc.js\";\nimport { getWaitingSessions } from \"../core/session-store.js\";\nimport { getWaitMs } from \"../core/scheduler.js\";\nimport chalk from \"chalk\";\n\nexport async function runStatus(options: { json?: boolean }) {\n const daemonRunning = await isDaemonRunning();\n const daemonPid = await readPid();\n const waitingSessions = await getWaitingSessions();\n\n const statusData = {\n daemon: {\n running: daemonRunning,\n pid: daemonPid,\n },\n waitingSessions: waitingSessions.map((s) => {\n const waitMs = getWaitMs(s);\n const nextResume = s.resetAt\n ? new Date(new Date(s.resetAt).getTime() + (s.bufferSeconds ?? 120) * 1000)\n : null;\n return {\n id: s.id,\n provider: s.provider,\n cwd: s.cwd,\n attempts: s.attempts,\n resetAt: s.resetAt,\n nextResumeAt: nextResume ? nextResume.toISOString() : null,\n secondsLeft: waitMs > 0 ? Math.ceil(waitMs / 1000) : 0,\n };\n }),\n };\n\n if (options.json) {\n console.log(JSON.stringify(statusData, null, 2));\n return;\n }\n\n console.log(chalk.bold(\"--- agent-auto-resume status ---\"));\n if (daemonRunning) {\n console.log(`Daemon Status: ${chalk.green(\"RUNNING\")} (PID: ${daemonPid})`);\n } else {\n console.log(`Daemon Status: ${chalk.red(\"STOPPED\")}`);\n }\n\n console.log(`\\nWaiting Sessions (${waitingSessions.length}):`);\n if (waitingSessions.length === 0) {\n console.log(\" No waiting sessions.\");\n } else {\n for (const s of statusData.waitingSessions) {\n console.log(`\\n Session ID: ${chalk.cyan(s.id)} [${s.provider}]`);\n console.log(` CWD: ${s.cwd}`);\n console.log(` Attempts: ${s.attempts}`);\n if (s.resetAt) {\n console.log(` Limit reset time: ${new Date(s.resetAt).toLocaleString()}`);\n console.log(` Auto-resume scheduled: ${s.nextResumeAt ? new Date(s.nextResumeAt).toLocaleString() : \"Unknown\"}`);\n console.log(` Time remaining: ${s.secondsLeft > 0 ? `${s.secondsLeft}s` : \"Ready to resume\"}`);\n } else {\n console.log(` ${chalk.yellow(\"Warning: Reset time unknown. Auto-resume will not happen automatically.\")}`);\n }\n }\n }\n}\n","import { listSessions } from \"../core/session-store.js\";\nimport chalk from \"chalk\";\n\nexport async function runSessions(options: { json?: boolean }) {\n const sessions = await listSessions();\n\n if (options.json) {\n console.log(JSON.stringify(sessions, null, 2));\n return;\n }\n\n console.log(chalk.bold(`--- agent-auto-resume sessions (${sessions.length}) ---`));\n if (sessions.length === 0) {\n console.log(\"No sessions found.\");\n return;\n }\n\n for (const s of sessions) {\n const statusColor =\n s.status === \"completed\"\n ? chalk.green\n : s.status === \"waiting_limit_reset\"\n ? chalk.yellow\n : s.status === \"failed\"\n ? chalk.red\n : s.status === \"running\"\n ? chalk.blue\n : chalk.gray;\n\n console.log(`\\nSession ID: ${chalk.cyan(s.id)} [${s.provider}]`);\n console.log(` Status: ${statusColor(s.status)}`);\n console.log(` CWD: ${s.cwd}`);\n console.log(` Created: ${new Date(s.createdAt).toLocaleString()}`);\n console.log(` Command: ${s.originalCommand.join(\" \")}`);\n if (s.resetAt) {\n console.log(` Reset time: ${new Date(s.resetAt).toLocaleString()}`);\n }\n }\n}\n","import { getSession, getLastSession, getRecoverableSessions, updateSession } from \"../core/session-store.js\";\nimport { resumeSessionInBackground } from \"../core/process-manager.js\";\nimport chalk from \"chalk\";\n\nexport async function runRecover(options: { last?: boolean; id?: string }) {\n let session;\n\n if (options.id) {\n session = await getSession(options.id);\n if (!session) {\n console.error(chalk.red(`Error: Session with ID ${options.id} not found.`));\n process.exit(1);\n }\n } else if (options.last) {\n session = await getLastSession();\n if (!session) {\n console.error(chalk.red(\"Error: No sessions found.\"));\n process.exit(1);\n }\n } else {\n const recoverable = await getRecoverableSessions();\n if (recoverable.length === 0) {\n console.log(\"No recoverable sessions found.\");\n return;\n }\n console.log(chalk.bold(\"Recoverable sessions:\"));\n for (const r of recoverable) {\n console.log(` - ID: ${chalk.cyan(r.id)} [${r.provider}] Status: ${r.status} (${r.originalCommand.join(\" \")})`);\n }\n console.log(\"\\nUse 'aar recover --id <session-id>' or 'aar recover --last' to recover.\");\n return;\n }\n\n const recoverableStatuses = [\"waiting_limit_reset\", \"ready_to_resume\", \"failed\", \"resuming\", \"cancelled\"];\n if (!recoverableStatuses.includes(session.status)) {\n console.warn(chalk.yellow(`Warning: Session ${session.id} status is '${session.status}', which might not need recovery.`));\n }\n\n console.log(`Attempting to recover session ${chalk.cyan(session.id)}...`);\n await updateSession(session.id, {\n source: \"manual-recover\",\n });\n\n const success = await resumeSessionInBackground(session);\n if (success) {\n console.log(chalk.green(`✓ Session ${session.id} recovered and completed successfully.`));\n } else {\n console.log(chalk.red(`✗ Recovery failed or session hit limit again. Status is currently saved.`));\n }\n}\n","import { getSession, getLastSession, updateSession } from \"../core/session-store.js\";\nimport { getWaitMs } from \"../core/scheduler.js\";\nimport { resumeSessionInBackground } from \"../core/process-manager.js\";\nimport chalk from \"chalk\";\n\nexport async function runRetryNow(options: { id?: string; last?: boolean; force?: boolean }) {\n let session;\n\n if (options.id) {\n session = await getSession(options.id);\n if (!session) {\n console.error(chalk.red(`Error: Session with ID ${options.id} not found.`));\n process.exit(1);\n }\n } else if (options.last) {\n session = await getLastSession();\n if (!session) {\n console.error(chalk.red(\"Error: No sessions found.\"));\n process.exit(1);\n }\n } else {\n console.error(chalk.red(\"Error: Must specify either --id <session-id> or --last.\"));\n process.exit(1);\n }\n\n const waitMs = getWaitMs(session);\n if (waitMs > 0 && !options.force) {\n const secondsLeft = Math.ceil(waitMs / 1000);\n console.log(chalk.yellow(`Warning: Limit reset time has not yet passed for session ${session.id}.`));\n console.log(`Time remaining: ${secondsLeft} seconds.`);\n console.log(\"Run with '--force' to retry immediately (not recommended).\");\n return;\n }\n\n console.log(`Starting immediate retry for session ${chalk.cyan(session.id)}...`);\n await updateSession(session.id, {\n status: \"ready_to_resume\",\n });\n\n const success = await resumeSessionInBackground(session);\n if (success) {\n console.log(chalk.green(`✓ Session ${session.id} resumed and completed successfully.`));\n } else {\n console.log(chalk.red(`✗ Retry failed or hit limit again.`));\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport os from \"os\";\nimport { execSync } from \"child_process\";\n\n// ホームディレクトリ解決用の補助関数\nfunction resolveHome(p: string): string {\n if (p.startsWith(\"~\")) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\n// aarの絶対パスを取得する\nfunction getAarPath(): string {\n try {\n const whichAar = execSync(\"which aar\", { encoding: \"utf8\" }).trim();\n if (whichAar) return whichAar;\n } catch {\n // ignore\n }\n // フォールバック(典型的なグローバルインストール先)\n const home = os.homedir();\n const possiblePaths = [\n path.join(home, \".hermes/node/bin/aar\"),\n path.join(home, \".npm-global/bin/aar\"),\n \"/usr/local/bin/aar\",\n \"/opt/homebrew/bin/aar\",\n ];\n for (const p of possiblePaths) {\n if (fs.existsSync(p)) return p;\n }\n return \"aar\"; // 最悪フォールバック\n}\n\ninterface IntegrationTarget {\n name: string;\n originalPath: string;\n backupPath: string;\n provider: string;\n getWrapperContent: (aarPath: string) => string;\n}\n\nconst targets: Record<string, IntegrationTarget[]> = {\n codex: [\n {\n name: \"Codex Mac App\",\n originalPath: \"/Applications/Codex.app/Contents/Resources/codex\",\n backupPath: \"/Applications/Codex.app/Contents/Resources/codex.orig\",\n provider: \"codex\",\n getWrapperContent: (aarPath) => `#!/bin/bash\n# original internal binary: /Applications/Codex.app/Contents/Resources/codex.orig\n\nif [ -x \"${aarPath}\" ]; then\n exec \"${aarPath}\" managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig \"$@\"\nelif command -v aar >/dev/null 2>&1; then\n exec aar managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig \"$@\"\nelse\n exec /Applications/Codex.app/Contents/Resources/codex.orig \"$@\"\nfi\n`,\n },\n ],\n antigravity: [\n {\n name: \"Antigravity Mac App Server\",\n originalPath: \"/Applications/Antigravity.app/Contents/Resources/bin/language_server\",\n backupPath: \"/Applications/Antigravity.app/Contents/Resources/bin/language_server.orig\",\n provider: \"antigravity\",\n getWrapperContent: (aarPath) => `#!/bin/bash\n# original internal binary: /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig\n\nif [ -x \"${aarPath}\" ]; then\n exec \"${aarPath}\" managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig \"$@\"\nelif command -v aar >/dev/null 2>&1; then\n exec aar managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig \"$@\"\nelse\n exec /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig \"$@\"\nfi\n`,\n },\n {\n name: \"Antigravity CLI (agy)\",\n originalPath: \"~/.local/bin/agy\",\n backupPath: \"~/.local/bin/agy.orig\",\n provider: \"antigravity\",\n getWrapperContent: (aarPath) => `#!/bin/bash\n# original system binary: \\$HOME/.local/bin/agy.orig\n\nif [ -x \"${aarPath}\" ]; then\n exec \"${aarPath}\" managed antigravity -- \"\\$HOME/.local/bin/agy.orig\" \"$@\"\nelif command -v aar >/dev/null 2>&1; then\n exec aar managed antigravity -- \"\\$HOME/.local/bin/agy.orig\" \"$@\"\nelse\n exec \"\\$HOME/.local/bin/agy.orig\" \"$@\"\nfi\n`,\n },\n ],\n};\n\nexport async function runIntegrate(appName: string) {\n const aarPath = getAarPath();\n const keys = appName === \"all\" ? Object.keys(targets) : [appName];\n\n for (const key of keys) {\n const appTargets = targets[key];\n if (!appTargets) {\n console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);\n process.exit(1);\n }\n\n console.log(`Setting up integration for ${key}...`);\n for (const t of appTargets) {\n const orig = resolveHome(t.originalPath);\n const backup = resolveHome(t.backupPath);\n\n if (!fs.existsSync(orig) && !fs.existsSync(backup)) {\n console.warn(` [Skip] ${t.name} not found at ${orig}`);\n continue;\n }\n\n try {\n // 1. すでに退避済みの場合はスキップ、または退避\n if (!fs.existsSync(backup)) {\n await fs.move(orig, backup);\n console.log(` [Backuped] ${orig} -> ${backup}`);\n }\n\n // 2. ラッパースクリプトの書き出し\n const content = t.getWrapperContent(aarPath);\n await fs.writeFile(orig, content, \"utf-8\");\n await fs.chmod(orig, 0o755);\n console.log(` [Integrated] Created wrapper at ${orig}`);\n } catch (err: any) {\n console.error(` [Error] Failed to integrate ${t.name}: ${err?.message}`);\n }\n }\n }\n console.log(\"Integration setup completed.\");\n}\n\nexport async function runUnintegrate(appName: string) {\n const keys = appName === \"all\" ? Object.keys(targets) : [appName];\n\n for (const key of keys) {\n const appTargets = targets[key];\n if (!appTargets) {\n console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);\n process.exit(1);\n }\n\n console.log(`Reverting integration for ${key}...`);\n for (const t of appTargets) {\n const orig = resolveHome(t.originalPath);\n const backup = resolveHome(t.backupPath);\n\n if (!fs.existsSync(backup)) {\n console.warn(` [Skip] Backup for ${t.name} not found at ${backup}`);\n continue;\n }\n\n try {\n // 1. ラッパーを削除(あれば)\n if (fs.existsSync(orig)) {\n await fs.remove(orig);\n }\n // 2. バックアップを元の位置に復元\n await fs.move(backup, orig);\n console.log(` [Restored] Reverted ${backup} -> ${orig}`);\n } catch (err: any) {\n console.error(` [Error] Failed to unintegrate ${t.name}: ${err?.message}`);\n }\n }\n }\n console.log(\"Unintegration completed.\");\n}\n"],"mappings":"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","names":["path","fs","fs","path","fs","path","os","execSync","fs","path","fs","path","fs","path","fs","chalk","path","fs","chalk","fs","path","fs","execSync","execSync","fs","path","execSync","execSync","fs","chalk","pty","spawn","pty","spawn","chalk","chalk","chalk","chalk","fs","path","os","execSync","resolveHome","getAarPath"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-auto-resume",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Daemon-based auto-resume for Claude Code, Codex CLI, and Antigravity CLI after provider-declared usage limits reset.",
5
5
  "type": "module",
6
6
  "bin": {