agent-auto-resume 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -168,6 +168,19 @@ aar retry-now --force
168
168
  ```
169
169
  Immediately resumes a session, bypassing the waiting time. If the reset time hasn't passed, it will warn you unless `--force` is provided (not recommended).
170
170
 
171
+ ### integrate
172
+ ```bash
173
+ aar integrate <codex|antigravity|all>
174
+ ```
175
+ Wraps the internal binary of Mac desktop applications (Codex App / Antigravity App) with `aar`.
176
+ This allows the background daemon to automatically monitor and auto-resume API limits encountered within these desktop GUI environments.
177
+
178
+ ### unintegrate
179
+ ```bash
180
+ aar unintegrate <codex|antigravity|all>
181
+ ```
182
+ Restores the original desktop application binaries to their default state.
183
+
171
184
  ---
172
185
 
173
186
  ## Safety & Security Design
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()) {
@@ -675,7 +796,7 @@ var codexProvider = {
675
796
  };
676
797
 
677
798
  // src/providers/antigravity.ts
678
- import { execSync as execSync2 } from "child_process";
799
+ import { execSync as execSync3 } from "child_process";
679
800
  var antigravityProvider = {
680
801
  name: "antigravity",
681
802
  displayName: "Google Antigravity CLI",
@@ -716,7 +837,7 @@ var antigravityProvider = {
716
837
  async getResumeCommand(state) {
717
838
  let helpOutput = "";
718
839
  try {
719
- helpOutput = execSync2("agy --help", {
840
+ helpOutput = execSync3("agy --help", {
720
841
  cwd: state.cwd,
721
842
  encoding: "utf-8",
722
843
  stdio: ["ignore", "pipe", "ignore"]
@@ -807,7 +928,7 @@ async function startTranscriptWatcher(abortSignal) {
807
928
  }
808
929
  const dirs = providerConfig.transcriptDirs.map(resolveHome);
809
930
  for (const dir of dirs) {
810
- if (!await fs6.pathExists(dir)) {
931
+ if (!await fs7.pathExists(dir)) {
811
932
  logger.debug(`Transcript watch directory does not exist: ${dir}, skipping`, "aar");
812
933
  continue;
813
934
  }
@@ -829,21 +950,21 @@ async function startTranscriptWatcher(abortSignal) {
829
950
  });
830
951
  }
831
952
  async function handleFileChange(filePath, providerName) {
832
- const ext = path5.extname(filePath).toLowerCase();
953
+ const ext = path6.extname(filePath).toLowerCase();
833
954
  if (ext !== ".json" && ext !== ".jsonl" && ext !== "") {
834
955
  return;
835
956
  }
836
957
  try {
837
- const stat = await fs6.stat(filePath);
958
+ const stat = await fs7.stat(filePath);
838
959
  const startCursor = fileCursors.get(filePath) || 0;
839
960
  if (stat.size <= startCursor) {
840
961
  fileCursors.set(filePath, stat.size);
841
962
  return;
842
963
  }
843
- const fd = await fs6.open(filePath, "r");
964
+ const fd = await fs7.open(filePath, "r");
844
965
  const buffer = Buffer.alloc(stat.size - startCursor);
845
- await fs6.read(fd, buffer, 0, buffer.length, startCursor);
846
- await fs6.close(fd);
966
+ await fs7.read(fd, buffer, 0, buffer.length, startCursor);
967
+ await fs7.close(fd);
847
968
  fileCursors.set(filePath, stat.size);
848
969
  const content = buffer.toString("utf-8");
849
970
  const lines = content.split(/\r?\n/);
@@ -900,7 +1021,7 @@ async function handleFileChange(filePath, providerName) {
900
1021
  }
901
1022
 
902
1023
  // src/core/tmux-watcher.ts
903
- import { execSync as execSync3 } from "child_process";
1024
+ import { execSync as execSync4 } from "child_process";
904
1025
  var tmuxTimer;
905
1026
  async function startTmuxWatcher(abortSignal) {
906
1027
  const config = await loadConfig();
@@ -908,7 +1029,7 @@ async function startTmuxWatcher(abortSignal) {
908
1029
  return;
909
1030
  }
910
1031
  try {
911
- execSync3("tmux -V", { stdio: "ignore" });
1032
+ execSync4("tmux -V", { stdio: "ignore" });
912
1033
  } catch {
913
1034
  logger.warn("tmux is enabled in config, but 'tmux' command was not found. tmux watcher is disabled.", "aar");
914
1035
  return;
@@ -932,7 +1053,7 @@ async function startTmuxWatcher(abortSignal) {
932
1053
  async function checkTmuxPanes() {
933
1054
  let listOutput = "";
934
1055
  try {
935
- listOutput = execSync3("tmux list-panes -a -F '#{pane_id}|#{pane_pid}|#{pane_current_path}|#{pane_current_command}'", {
1056
+ listOutput = execSync4("tmux list-panes -a -F '#{pane_id}|#{pane_pid}|#{pane_current_path}|#{pane_current_command}'", {
936
1057
  encoding: "utf-8",
937
1058
  stdio: ["ignore", "pipe", "ignore"]
938
1059
  });
@@ -957,7 +1078,7 @@ async function checkTmuxPanes() {
957
1078
  }
958
1079
  let paneOutput = "";
959
1080
  try {
960
- paneOutput = execSync3(`tmux capture-pane -p -t ${pane.paneId}`, {
1081
+ paneOutput = execSync4(`tmux capture-pane -p -t ${pane.paneId}`, {
961
1082
  encoding: "utf-8",
962
1083
  stdio: ["ignore", "pipe", "ignore"]
963
1084
  });
@@ -1006,7 +1127,7 @@ async function checkTmuxPanes() {
1006
1127
  }
1007
1128
  function sendKeysToTmux(paneId, keys) {
1008
1129
  try {
1009
- execSync3(`tmux send-keys -t ${paneId} "${keys.replace(/"/g, '\\"')}"`, { stdio: "ignore" });
1130
+ execSync4(`tmux send-keys -t ${paneId} "${keys.replace(/"/g, '\\"')}"`, { stdio: "ignore" });
1010
1131
  return true;
1011
1132
  } catch (err) {
1012
1133
  logger.error(`Failed to send keys to tmux pane ${paneId}: ${err.message}`, "aar");
@@ -1244,7 +1365,7 @@ var AarDaemon = class {
1244
1365
  };
1245
1366
 
1246
1367
  // src/commands/daemon.ts
1247
- import fs7 from "fs-extra";
1368
+ import fs8 from "fs-extra";
1248
1369
  import chalk3 from "chalk";
1249
1370
  async function handleDaemon(action, options) {
1250
1371
  const cleanAction = action.toLowerCase();
@@ -1265,8 +1386,8 @@ async function handleDaemon(action, options) {
1265
1386
  console.log(chalk3.red("Daemon is STOPPED"));
1266
1387
  }
1267
1388
  } else if (cleanAction === "logs") {
1268
- if (await fs7.pathExists(LOG_FILE)) {
1269
- const content = await fs7.readFile(LOG_FILE, "utf-8");
1389
+ if (await fs8.pathExists(LOG_FILE)) {
1390
+ const content = await fs8.readFile(LOG_FILE, "utf-8");
1270
1391
  console.log(content);
1271
1392
  } else {
1272
1393
  console.log("No log file found.");
@@ -1689,6 +1810,155 @@ async function runRetryNow(options) {
1689
1810
  }
1690
1811
  }
1691
1812
 
1813
+ // src/commands/integrate.ts
1814
+ import fs9 from "fs-extra";
1815
+ import path7 from "path";
1816
+ import os3 from "os";
1817
+ import { execSync as execSync5 } from "child_process";
1818
+ function resolveHome2(p) {
1819
+ if (p.startsWith("~")) {
1820
+ return path7.join(os3.homedir(), p.slice(1));
1821
+ }
1822
+ return p;
1823
+ }
1824
+ function getAarPath2() {
1825
+ try {
1826
+ const whichAar = execSync5("which aar", { encoding: "utf8" }).trim();
1827
+ if (whichAar) return whichAar;
1828
+ } catch {
1829
+ }
1830
+ const home = os3.homedir();
1831
+ const possiblePaths = [
1832
+ path7.join(home, ".hermes/node/bin/aar"),
1833
+ path7.join(home, ".npm-global/bin/aar"),
1834
+ "/usr/local/bin/aar",
1835
+ "/opt/homebrew/bin/aar"
1836
+ ];
1837
+ for (const p of possiblePaths) {
1838
+ if (fs9.existsSync(p)) return p;
1839
+ }
1840
+ return "aar";
1841
+ }
1842
+ var targets = {
1843
+ codex: [
1844
+ {
1845
+ name: "Codex Mac App",
1846
+ originalPath: "/Applications/Codex.app/Contents/Resources/codex",
1847
+ backupPath: "/Applications/Codex.app/Contents/Resources/codex.orig",
1848
+ provider: "codex",
1849
+ getWrapperContent: (aarPath) => `#!/bin/bash
1850
+ # original internal binary: /Applications/Codex.app/Contents/Resources/codex.orig
1851
+
1852
+ if [ -x "${aarPath}" ]; then
1853
+ exec "${aarPath}" managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig "$@"
1854
+ elif command -v aar >/dev/null 2>&1; then
1855
+ exec aar managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig "$@"
1856
+ else
1857
+ exec /Applications/Codex.app/Contents/Resources/codex.orig "$@"
1858
+ fi
1859
+ `
1860
+ }
1861
+ ],
1862
+ antigravity: [
1863
+ {
1864
+ name: "Antigravity Mac App Server",
1865
+ originalPath: "/Applications/Antigravity.app/Contents/Resources/bin/language_server",
1866
+ backupPath: "/Applications/Antigravity.app/Contents/Resources/bin/language_server.orig",
1867
+ provider: "antigravity",
1868
+ getWrapperContent: (aarPath) => `#!/bin/bash
1869
+ # original internal binary: /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig
1870
+
1871
+ if [ -x "${aarPath}" ]; then
1872
+ exec "${aarPath}" managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig "$@"
1873
+ elif command -v aar >/dev/null 2>&1; then
1874
+ exec aar managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig "$@"
1875
+ else
1876
+ exec /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig "$@"
1877
+ fi
1878
+ `
1879
+ },
1880
+ {
1881
+ name: "Antigravity CLI (agy)",
1882
+ originalPath: "~/.local/bin/agy",
1883
+ backupPath: "~/.local/bin/agy.orig",
1884
+ provider: "antigravity",
1885
+ getWrapperContent: (aarPath) => `#!/bin/bash
1886
+ # original system binary: $HOME/.local/bin/agy.orig
1887
+
1888
+ if [ -x "${aarPath}" ]; then
1889
+ exec "${aarPath}" managed antigravity -- "$HOME/.local/bin/agy.orig" "$@"
1890
+ elif command -v aar >/dev/null 2>&1; then
1891
+ exec aar managed antigravity -- "$HOME/.local/bin/agy.orig" "$@"
1892
+ else
1893
+ exec "$HOME/.local/bin/agy.orig" "$@"
1894
+ fi
1895
+ `
1896
+ }
1897
+ ]
1898
+ };
1899
+ async function runIntegrate(appName) {
1900
+ const aarPath = getAarPath2();
1901
+ const keys = appName === "all" ? Object.keys(targets) : [appName];
1902
+ for (const key of keys) {
1903
+ const appTargets = targets[key];
1904
+ if (!appTargets) {
1905
+ console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);
1906
+ process.exit(1);
1907
+ }
1908
+ console.log(`Setting up integration for ${key}...`);
1909
+ for (const t of appTargets) {
1910
+ const orig = resolveHome2(t.originalPath);
1911
+ const backup = resolveHome2(t.backupPath);
1912
+ if (!fs9.existsSync(orig) && !fs9.existsSync(backup)) {
1913
+ console.warn(` [Skip] ${t.name} not found at ${orig}`);
1914
+ continue;
1915
+ }
1916
+ try {
1917
+ if (!fs9.existsSync(backup)) {
1918
+ await fs9.move(orig, backup);
1919
+ console.log(` [Backuped] ${orig} -> ${backup}`);
1920
+ }
1921
+ const content = t.getWrapperContent(aarPath);
1922
+ await fs9.writeFile(orig, content, "utf-8");
1923
+ await fs9.chmod(orig, 493);
1924
+ console.log(` [Integrated] Created wrapper at ${orig}`);
1925
+ } catch (err) {
1926
+ console.error(` [Error] Failed to integrate ${t.name}: ${err?.message}`);
1927
+ }
1928
+ }
1929
+ }
1930
+ console.log("Integration setup completed.");
1931
+ }
1932
+ async function runUnintegrate(appName) {
1933
+ const keys = appName === "all" ? Object.keys(targets) : [appName];
1934
+ for (const key of keys) {
1935
+ const appTargets = targets[key];
1936
+ if (!appTargets) {
1937
+ console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);
1938
+ process.exit(1);
1939
+ }
1940
+ console.log(`Reverting integration for ${key}...`);
1941
+ for (const t of appTargets) {
1942
+ const orig = resolveHome2(t.originalPath);
1943
+ const backup = resolveHome2(t.backupPath);
1944
+ if (!fs9.existsSync(backup)) {
1945
+ console.warn(` [Skip] Backup for ${t.name} not found at ${backup}`);
1946
+ continue;
1947
+ }
1948
+ try {
1949
+ if (fs9.existsSync(orig)) {
1950
+ await fs9.remove(orig);
1951
+ }
1952
+ await fs9.move(backup, orig);
1953
+ console.log(` [Restored] Reverted ${backup} -> ${orig}`);
1954
+ } catch (err) {
1955
+ console.error(` [Error] Failed to unintegrate ${t.name}: ${err?.message}`);
1956
+ }
1957
+ }
1958
+ }
1959
+ console.log("Unintegration completed.");
1960
+ }
1961
+
1692
1962
  // src/cli.ts
1693
1963
  var program = new Command();
1694
1964
  program.name("aar").description("Daemon-based auto-resume CLI tool for Claude Code, Codex, and Antigravity").version("0.1.0");
@@ -1702,6 +1972,8 @@ program.command("status").description("Show daemon status, waiting sessions, and
1702
1972
  program.command("sessions").description("List all saved sessions and their statuses").option("--json", "Format output as JSON").action(runSessions);
1703
1973
  program.command("recover").description("Manually recover waiting, failed, or cancelled sessions").option("--last", "Recover the most recent session").option("--id <session-id>", "Recover session by ID").action(runRecover);
1704
1974
  program.command("retry-now").description("Retry waiting sessions immediately").option("--id <session-id>", "Session ID to retry").option("--last", "Retry the most recent waiting session").option("--force", "Force retry even if reset time has not passed").action(runRetryNow);
1975
+ program.command("integrate <app>").description("Integrate desktop application binary with aar (app: codex, antigravity, all)").action(runIntegrate);
1976
+ program.command("unintegrate <app>").description("Restore original application binary and remove wrapper (app: codex, antigravity, all)").action(runUnintegrate);
1705
1977
  program.command("claude").description("One-shot wrapper to run Claude Code in managed mode").allowUnknownOption().action(() => {
1706
1978
  const idx = process.argv.indexOf("claude");
1707
1979
  const forwardedArgs = process.argv.slice(idx + 1);
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"],"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\";\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\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"],"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"]}
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 ];\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","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.3",
3
+ "version": "0.1.5",
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": {