agent-auto-resume 0.1.2 → 0.1.4

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
@@ -1282,6 +1282,7 @@ async function handleDaemon(action, options) {
1282
1282
 
1283
1283
  // src/core/pty-runner.ts
1284
1284
  import pty2 from "node-pty";
1285
+ import { spawn as spawn2 } from "child_process";
1285
1286
  async function runInPty(options) {
1286
1287
  const { providerName, command, args, cwd = process.cwd(), sessionId } = options;
1287
1288
  const config = await loadConfig();
@@ -1309,6 +1310,14 @@ async function runInPty(options) {
1309
1310
  });
1310
1311
  }
1311
1312
  logger.info(`Managed session started: ${session.id}`, "aar");
1313
+ const isInteractive = !!process.stdout.isTTY;
1314
+ const isServerMode = args.some(
1315
+ (arg) => arg.includes("app-server") || arg.includes("--listen") || arg.includes("stdio") || arg.includes("mcp")
1316
+ );
1317
+ if (isServerMode || !isInteractive) {
1318
+ await runInPipe(session, command, args, cwd);
1319
+ return;
1320
+ }
1312
1321
  const ptyProcess = pty2.spawn(command, args, {
1313
1322
  name: "xterm-color",
1314
1323
  cols: process.stdout.columns || 80,
@@ -1402,6 +1411,82 @@ async function runInPty(options) {
1402
1411
  process.exit(res.exitCode);
1403
1412
  });
1404
1413
  }
1414
+ async function runInPipe(session, command, args, cwd) {
1415
+ let child;
1416
+ child = spawn2(command, args, {
1417
+ cwd,
1418
+ env: {
1419
+ ...process.env,
1420
+ AAR_SESSION_ID: session.id
1421
+ }
1422
+ });
1423
+ await updateSession(session.id, { pid: child.pid, status: "running" });
1424
+ let limitDetected = false;
1425
+ let accumulatedOutput = "";
1426
+ if (child.stdin) {
1427
+ process.stdin.pipe(child.stdin);
1428
+ }
1429
+ if (child.stdout) {
1430
+ child.stdout.on("data", (data) => {
1431
+ process.stdout.write(data);
1432
+ const str = data.toString("utf-8");
1433
+ accumulatedOutput += str;
1434
+ if (accumulatedOutput.length > 8192) {
1435
+ accumulatedOutput = accumulatedOutput.slice(-4096);
1436
+ }
1437
+ checkLimit(str);
1438
+ });
1439
+ }
1440
+ if (child.stderr) {
1441
+ child.stderr.on("data", (data) => {
1442
+ process.stderr.write(data);
1443
+ const str = data.toString("utf-8");
1444
+ accumulatedOutput += str;
1445
+ if (accumulatedOutput.length > 8192) {
1446
+ accumulatedOutput = accumulatedOutput.slice(-4096);
1447
+ }
1448
+ checkLimit(str);
1449
+ });
1450
+ }
1451
+ async function checkLimit(str) {
1452
+ if (!limitDetected) {
1453
+ const detection = detectLimit(accumulatedOutput, session.provider);
1454
+ if (detection.matched) {
1455
+ limitDetected = true;
1456
+ const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : void 0;
1457
+ logger.warn(`Usage limit detected for ${session.provider}!`, "aar");
1458
+ await updateSession(session.id, {
1459
+ status: "waiting_limit_reset",
1460
+ lastLimitDetectedAt: (/* @__PURE__ */ new Date()).toISOString(),
1461
+ resetAt: resetAtStr,
1462
+ lastOutputSnippet: accumulatedOutput.slice(-1e3)
1463
+ });
1464
+ try {
1465
+ child.kill();
1466
+ } catch {
1467
+ }
1468
+ }
1469
+ }
1470
+ }
1471
+ return new Promise((resolve) => {
1472
+ child.on("exit", async (code) => {
1473
+ const currentSession = await getSession(session.id);
1474
+ if (currentSession) {
1475
+ if (currentSession.status === "running") {
1476
+ await updateSession(session.id, {
1477
+ status: code === 0 ? "completed" : "failed",
1478
+ pid: void 0
1479
+ });
1480
+ } else if (currentSession.status === "waiting_limit_reset") {
1481
+ await updateSession(session.id, {
1482
+ pid: void 0
1483
+ });
1484
+ }
1485
+ }
1486
+ process.exit(code || 0);
1487
+ });
1488
+ });
1489
+ }
1405
1490
 
1406
1491
  // src/commands/managed.ts
1407
1492
  async function runManaged(providerNameStr, args) {
@@ -1604,6 +1689,155 @@ async function runRetryNow(options) {
1604
1689
  }
1605
1690
  }
1606
1691
 
1692
+ // src/commands/integrate.ts
1693
+ import fs8 from "fs-extra";
1694
+ import path6 from "path";
1695
+ import os2 from "os";
1696
+ import { execSync as execSync4 } from "child_process";
1697
+ function resolveHome2(p) {
1698
+ if (p.startsWith("~")) {
1699
+ return path6.join(os2.homedir(), p.slice(1));
1700
+ }
1701
+ return p;
1702
+ }
1703
+ function getAarPath() {
1704
+ try {
1705
+ const whichAar = execSync4("which aar", { encoding: "utf8" }).trim();
1706
+ if (whichAar) return whichAar;
1707
+ } catch {
1708
+ }
1709
+ const home = os2.homedir();
1710
+ const possiblePaths = [
1711
+ path6.join(home, ".hermes/node/bin/aar"),
1712
+ path6.join(home, ".npm-global/bin/aar"),
1713
+ "/usr/local/bin/aar",
1714
+ "/opt/homebrew/bin/aar"
1715
+ ];
1716
+ for (const p of possiblePaths) {
1717
+ if (fs8.existsSync(p)) return p;
1718
+ }
1719
+ return "aar";
1720
+ }
1721
+ var targets = {
1722
+ codex: [
1723
+ {
1724
+ name: "Codex Mac App",
1725
+ originalPath: "/Applications/Codex.app/Contents/Resources/codex",
1726
+ backupPath: "/Applications/Codex.app/Contents/Resources/codex.orig",
1727
+ provider: "codex",
1728
+ getWrapperContent: (aarPath) => `#!/bin/bash
1729
+ # original internal binary: /Applications/Codex.app/Contents/Resources/codex.orig
1730
+
1731
+ if [ -x "${aarPath}" ]; then
1732
+ exec "${aarPath}" managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig "$@"
1733
+ elif command -v aar >/dev/null 2>&1; then
1734
+ exec aar managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig "$@"
1735
+ else
1736
+ exec /Applications/Codex.app/Contents/Resources/codex.orig "$@"
1737
+ fi
1738
+ `
1739
+ }
1740
+ ],
1741
+ antigravity: [
1742
+ {
1743
+ name: "Antigravity Mac App Server",
1744
+ originalPath: "/Applications/Antigravity.app/Contents/Resources/bin/language_server",
1745
+ backupPath: "/Applications/Antigravity.app/Contents/Resources/bin/language_server.orig",
1746
+ provider: "antigravity",
1747
+ getWrapperContent: (aarPath) => `#!/bin/bash
1748
+ # original internal binary: /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig
1749
+
1750
+ if [ -x "${aarPath}" ]; then
1751
+ exec "${aarPath}" managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig "$@"
1752
+ elif command -v aar >/dev/null 2>&1; then
1753
+ exec aar managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig "$@"
1754
+ else
1755
+ exec /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig "$@"
1756
+ fi
1757
+ `
1758
+ },
1759
+ {
1760
+ name: "Antigravity CLI (agy)",
1761
+ originalPath: "~/.local/bin/agy",
1762
+ backupPath: "~/.local/bin/agy.orig",
1763
+ provider: "antigravity",
1764
+ getWrapperContent: (aarPath) => `#!/bin/bash
1765
+ # original system binary: $HOME/.local/bin/agy.orig
1766
+
1767
+ if [ -x "${aarPath}" ]; then
1768
+ exec "${aarPath}" managed antigravity -- "$HOME/.local/bin/agy.orig" "$@"
1769
+ elif command -v aar >/dev/null 2>&1; then
1770
+ exec aar managed antigravity -- "$HOME/.local/bin/agy.orig" "$@"
1771
+ else
1772
+ exec "$HOME/.local/bin/agy.orig" "$@"
1773
+ fi
1774
+ `
1775
+ }
1776
+ ]
1777
+ };
1778
+ async function runIntegrate(appName) {
1779
+ const aarPath = getAarPath();
1780
+ const keys = appName === "all" ? Object.keys(targets) : [appName];
1781
+ for (const key of keys) {
1782
+ const appTargets = targets[key];
1783
+ if (!appTargets) {
1784
+ console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);
1785
+ process.exit(1);
1786
+ }
1787
+ console.log(`Setting up integration for ${key}...`);
1788
+ for (const t of appTargets) {
1789
+ const orig = resolveHome2(t.originalPath);
1790
+ const backup = resolveHome2(t.backupPath);
1791
+ if (!fs8.existsSync(orig) && !fs8.existsSync(backup)) {
1792
+ console.warn(` [Skip] ${t.name} not found at ${orig}`);
1793
+ continue;
1794
+ }
1795
+ try {
1796
+ if (!fs8.existsSync(backup)) {
1797
+ await fs8.move(orig, backup);
1798
+ console.log(` [Backuped] ${orig} -> ${backup}`);
1799
+ }
1800
+ const content = t.getWrapperContent(aarPath);
1801
+ await fs8.writeFile(orig, content, "utf-8");
1802
+ await fs8.chmod(orig, 493);
1803
+ console.log(` [Integrated] Created wrapper at ${orig}`);
1804
+ } catch (err) {
1805
+ console.error(` [Error] Failed to integrate ${t.name}: ${err?.message}`);
1806
+ }
1807
+ }
1808
+ }
1809
+ console.log("Integration setup completed.");
1810
+ }
1811
+ async function runUnintegrate(appName) {
1812
+ const keys = appName === "all" ? Object.keys(targets) : [appName];
1813
+ for (const key of keys) {
1814
+ const appTargets = targets[key];
1815
+ if (!appTargets) {
1816
+ console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);
1817
+ process.exit(1);
1818
+ }
1819
+ console.log(`Reverting integration for ${key}...`);
1820
+ for (const t of appTargets) {
1821
+ const orig = resolveHome2(t.originalPath);
1822
+ const backup = resolveHome2(t.backupPath);
1823
+ if (!fs8.existsSync(backup)) {
1824
+ console.warn(` [Skip] Backup for ${t.name} not found at ${backup}`);
1825
+ continue;
1826
+ }
1827
+ try {
1828
+ if (fs8.existsSync(orig)) {
1829
+ await fs8.remove(orig);
1830
+ }
1831
+ await fs8.move(backup, orig);
1832
+ console.log(` [Restored] Reverted ${backup} -> ${orig}`);
1833
+ } catch (err) {
1834
+ console.error(` [Error] Failed to unintegrate ${t.name}: ${err?.message}`);
1835
+ }
1836
+ }
1837
+ }
1838
+ console.log("Unintegration completed.");
1839
+ }
1840
+
1607
1841
  // src/cli.ts
1608
1842
  var program = new Command();
1609
1843
  program.name("aar").description("Daemon-based auto-resume CLI tool for Claude Code, Codex, and Antigravity").version("0.1.0");
@@ -1617,6 +1851,8 @@ program.command("status").description("Show daemon status, waiting sessions, and
1617
1851
  program.command("sessions").description("List all saved sessions and their statuses").option("--json", "Format output as JSON").action(runSessions);
1618
1852
  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);
1619
1853
  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);
1854
+ program.command("integrate <app>").description("Integrate desktop application binary with aar (app: codex, antigravity, all)").action(runIntegrate);
1855
+ program.command("unintegrate <app>").description("Restore original application binary and remove wrapper (app: codex, antigravity, all)").action(runUnintegrate);
1620
1856
  program.command("claude").description("One-shot wrapper to run Claude Code in managed mode").allowUnknownOption().action(() => {
1621
1857
  const idx = process.argv.indexOf("claude");
1622
1858
  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 { 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\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 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 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","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","pty","chalk","chalk","chalk","chalk"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/core/session-store.ts","../src/core/shell-setup.ts","../src/commands/setup.ts","../src/core/daemon-client.ts","../src/core/daemon-ipc.ts","../src/core/logger.ts","../src/core/transcript-watcher.ts","../src/core/time-parser.ts","../src/providers/claude.ts","../src/prompts/safe-resume.ts","../src/providers/codex.ts","../src/providers/antigravity.ts","../src/providers/index.ts","../src/core/detector.ts","../src/core/tmux-watcher.ts","../src/core/scheduler.ts","../src/core/process-manager.ts","../src/core/daemon.ts","../src/commands/daemon.ts","../src/core/pty-runner.ts","../src/commands/managed.ts","../src/commands/run.ts","../src/commands/status.ts","../src/commands/sessions.ts","../src/commands/recover.ts","../src/commands/retry-now.ts","../src/commands/integrate.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { runSetup } from \"./commands/setup.js\";\nimport { handleDaemon } from \"./commands/daemon.js\";\nimport { runManaged } from \"./commands/managed.js\";\nimport { runGeneric } from \"./commands/run.js\";\nimport { runStatus } from \"./commands/status.js\";\nimport { runSessions } from \"./commands/sessions.js\";\nimport { runRecover } from \"./commands/recover.js\";\nimport { runRetryNow } from \"./commands/retry-now.js\";\nimport { runIntegrate, runUnintegrate } from \"./commands/integrate.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"aar\")\n .description(\"Daemon-based auto-resume CLI tool for Claude Code, Codex, and Antigravity\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"setup\")\n .description(\"Setup state directories, configuration, and shell integration\")\n .option(\"--shell <type>\", \"Specify shell type (zsh, bash, fish)\")\n .option(\"--no-shell-modify\", \"Do not modify shell configuration files automatically\")\n .option(\"--print-shell-snippet\", \"Only print the shell snippet to stdout\")\n .action(runSetup);\n\nprogram\n .command(\"daemon <action>\")\n .description(\"Manage the agent-auto-resume daemon (actions: start, stop, restart, status, logs, run)\")\n .option(\"--tmux\", \"Enable experimental tmux watcher\")\n .action((action, options) => handleDaemon(action, options));\n\nprogram\n .command(\"managed <provider>\")\n .description(\"Run a CLI tool in managed mode under PTY\")\n .argument(\"[command...]\", \"Command to execute (e.g. claude, codex, agy)\")\n .action((provider, args) => runManaged(provider, args));\n\nprogram\n .command(\"run\")\n .description(\"Generic run command to wrap any agent CLI under a provider\")\n .option(\"--provider <provider>\", \"Specify provider (claude, codex, antigravity)\")\n .argument(\"[command...]\", \"Command to execute\")\n .action((args, options) => {\n // '--' の後の引数は args として渡される\n runGeneric(options, args);\n });\n\nprogram\n .command(\"status\")\n .description(\"Show daemon status, waiting sessions, and next resume schedules\")\n .option(\"--json\", \"Format output as JSON\")\n .action(runStatus);\n\nprogram\n .command(\"sessions\")\n .description(\"List all saved sessions and their statuses\")\n .option(\"--json\", \"Format output as JSON\")\n .action(runSessions);\n\nprogram\n .command(\"recover\")\n .description(\"Manually recover waiting, failed, or cancelled sessions\")\n .option(\"--last\", \"Recover the most recent session\")\n .option(\"--id <session-id>\", \"Recover session by ID\")\n .action(runRecover);\n\nprogram\n .command(\"retry-now\")\n .description(\"Retry waiting sessions immediately\")\n .option(\"--id <session-id>\", \"Session ID to retry\")\n .option(\"--last\", \"Retry the most recent waiting session\")\n .option(\"--force\", \"Force retry even if reset time has not passed\")\n .action(runRetryNow);\n\nprogram\n .command(\"integrate <app>\")\n .description(\"Integrate desktop application binary with aar (app: codex, antigravity, all)\")\n .action(runIntegrate);\n\nprogram\n .command(\"unintegrate <app>\")\n .description(\"Restore original application binary and remove wrapper (app: codex, antigravity, all)\")\n .action(runUnintegrate);\n\n\n// One-shot wrapper commands\n// これらはサブコマンド以下のすべてのオプションや引数をラップして managed mode に渡します。\nprogram\n .command(\"claude\")\n .description(\"One-shot wrapper to run Claude Code in managed mode\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"claude\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"claude\", [\"claude\", ...forwardedArgs]);\n });\n\nprogram\n .command(\"codex\")\n .description(\"One-shot wrapper to run Codex CLI in managed mode\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"codex\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"codex\", [\"codex\", ...forwardedArgs]);\n });\n\nprogram\n .command(\"antigravity\")\n .description(\"One-shot wrapper to run Antigravity CLI in managed mode\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"antigravity\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"antigravity\", [\"agy\", ...forwardedArgs]);\n });\n\nprogram\n .command(\"agy\")\n .description(\"Alias for antigravity command\")\n .allowUnknownOption()\n .action(() => {\n const idx = process.argv.indexOf(\"agy\");\n const forwardedArgs = process.argv.slice(idx + 1);\n runManaged(\"antigravity\", [\"agy\", ...forwardedArgs]);\n });\n\nprogram.parse(process.argv);\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { nanoid } from \"nanoid\";\nimport { SessionState, SessionStatus, AarConfig } from \"./types.js\";\n\nconst DEFAULT_BASE_DIR = path.join(os.homedir(), \".agent-auto-resume\");\nexport const BASE_DIR = process.env.AAR_BASE_DIR || DEFAULT_BASE_DIR;\nexport const SESSIONS_DIR = path.join(BASE_DIR, \"sessions\");\nexport const EVENTS_DIR = path.join(BASE_DIR, \"events\");\nexport const SHIMS_DIR = path.join(BASE_DIR, \"shims\");\nexport const CONFIG_FILE = path.join(BASE_DIR, \"config.json\");\n\nexport function resolveHome(filepath: string): string {\n if (filepath.startsWith(\"~\")) {\n return path.join(os.homedir(), filepath.slice(1));\n }\n return filepath;\n}\n\nexport async function ensureDirs() {\n await fs.ensureDir(BASE_DIR);\n await fs.ensureDir(SESSIONS_DIR);\n await fs.ensureDir(EVENTS_DIR);\n await fs.ensureDir(SHIMS_DIR);\n}\n\nexport const DEFAULT_CONFIG: AarConfig = {\n version: 1,\n bufferSeconds: 120,\n maxAttempts: 5,\n providers: {\n claude: {\n enabled: true,\n command: \"claude\",\n watchTranscripts: true,\n transcriptDirs: [\"~/.claude/projects\"],\n },\n codex: {\n enabled: true,\n command: \"codex\",\n watchTranscripts: true,\n transcriptDirs: [\"~/.codex/sessions\"],\n },\n antigravity: {\n enabled: true,\n command: \"agy\",\n experimental: true,\n watchTranscripts: false,\n transcriptDirs: [],\n },\n },\n tmux: {\n enabled: false,\n pollIntervalMs: 5000,\n },\n daemon: {\n pollIntervalMs: 5000,\n },\n};\n\nexport async function loadConfig(): Promise<AarConfig> {\n await ensureDirs();\n if (await fs.pathExists(CONFIG_FILE)) {\n try {\n const data = await fs.readJson(CONFIG_FILE);\n // 深いマージを簡易的に行う\n return {\n ...DEFAULT_CONFIG,\n ...data,\n providers: {\n claude: { ...DEFAULT_CONFIG.providers.claude, ...data.providers?.claude },\n codex: { ...DEFAULT_CONFIG.providers.codex, ...data.providers?.codex },\n antigravity: { ...DEFAULT_CONFIG.providers.antigravity, ...data.providers?.antigravity },\n },\n tmux: { ...DEFAULT_CONFIG.tmux, ...data.tmux },\n daemon: { ...DEFAULT_CONFIG.daemon, ...data.daemon },\n };\n } catch {\n return DEFAULT_CONFIG;\n }\n }\n await fs.writeJson(CONFIG_FILE, DEFAULT_CONFIG, { spaces: 2 });\n return DEFAULT_CONFIG;\n}\n\nexport async function saveConfig(config: AarConfig): Promise<void> {\n await ensureDirs();\n await fs.writeJson(CONFIG_FILE, config, { spaces: 2 });\n}\n\nexport async function createSession(\n state: Omit<SessionState, \"id\" | \"createdAt\" | \"updatedAt\"> & { id?: string }\n): Promise<SessionState> {\n await ensureDirs();\n const id = state.id || nanoid(10);\n const now = new Date().toISOString();\n const session: SessionState = {\n ...state,\n id,\n createdAt: now,\n updatedAt: now,\n };\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n await fs.writeJson(sessionPath, session, { spaces: 2 });\n return session;\n}\n\nexport async function updateSession(id: string, updates: Partial<SessionState>): Promise<SessionState> {\n await ensureDirs();\n const session = await getSession(id);\n if (!session) {\n throw new Error(`Session ${id} not found`);\n }\n const updated: SessionState = {\n ...session,\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n await fs.writeJson(sessionPath, updated, { spaces: 2 });\n return updated;\n}\n\nexport async function getSession(id: string): Promise<SessionState | undefined> {\n await ensureDirs();\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n if (!(await fs.pathExists(sessionPath))) {\n return undefined;\n }\n try {\n return await fs.readJson(sessionPath);\n } catch {\n return undefined;\n }\n}\n\nexport async function listSessions(): Promise<SessionState[]> {\n await ensureDirs();\n const files = await fs.readdir(SESSIONS_DIR);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\"));\n const sessions: SessionState[] = [];\n for (const file of jsonFiles) {\n try {\n const session = await fs.readJson(path.join(SESSIONS_DIR, file));\n sessions.push(session);\n } catch {\n // 破損ファイルは無視\n }\n }\n return sessions.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n}\n\nexport async function getLastSession(): Promise<SessionState | undefined> {\n const sessions = await listSessions();\n return sessions[0];\n}\n\nexport async function getRecoverableSessions(): Promise<SessionState[]> {\n const sessions = await listSessions();\n const recoverableStatuses: SessionStatus[] = [\"waiting_limit_reset\", \"ready_to_resume\", \"failed\", \"resuming\"];\n return sessions.filter((s) => recoverableStatuses.includes(s.status));\n}\n\nexport async function getWaitingSessions(): Promise<SessionState[]> {\n const sessions = await listSessions();\n return sessions.filter((s) => s.status === \"waiting_limit_reset\");\n}\n\nexport async function deleteSession(id: string): Promise<void> {\n await ensureDirs();\n const sessionPath = path.join(SESSIONS_DIR, `${id}.json`);\n if (await fs.pathExists(sessionPath)) {\n await fs.remove(sessionPath);\n }\n}\n","import os from \"os\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { resolveHome } from \"./session-store.js\";\n\nexport type ShellType = \"zsh\" | \"bash\" | \"fish\";\n\n/**\n * ユーザーの環境変数等から現在のシェルを自動検出する。\n */\nexport function detectShell(): ShellType {\n const shellEnv = process.env.SHELL || \"\";\n if (shellEnv.includes(\"zsh\")) {\n return \"zsh\";\n }\n if (shellEnv.includes(\"fish\")) {\n return \"fish\";\n }\n return \"bash\";\n}\n\n/**\n * 各シェルのrcファイルへのパスを取得する。\n */\nexport function getShellRcPath(shell: ShellType): string {\n if (shell === \"zsh\") {\n return resolveHome(\"~/.zshrc\");\n }\n if (shell === \"fish\") {\n return resolveHome(\"~/.config/fish/config.fish\");\n }\n return resolveHome(\"~/.bashrc\");\n}\n\nexport const ZSH_BASH_SNIPPET = `\n# agent-auto-resume\nif command -v aar >/dev/null 2>&1; then\n claude() { aar managed claude -- claude \"$@\"; }\n codex() { aar managed codex -- codex \"$@\"; }\n agy() { aar managed antigravity -- agy \"$@\"; }\nfi\n`;\n\nexport const FISH_SNIPPET = `\n# agent-auto-resume\nfunction claude\n aar managed claude -- claude $argv\nend\n\nfunction codex\n aar managed codex -- codex $argv\nend\n\nfunction agy\n aar managed antigravity -- agy $argv\nend\n`;\n\n/**\n * シェルに応じた設定スニペットを取得する。\n */\nexport function getSnippet(shell: ShellType): string {\n return shell === \"fish\" ? FISH_SNIPPET.trim() : ZSH_BASH_SNIPPET.trim();\n}\n\n/**\n * シェルのrcファイルに対して統合用関数のスニペットを追記・設定する。\n * @param shell 対象シェル。未指定の場合は自動検出する。\n * @param noModify 実際にrcファイルを変更せず、案内メッセージのみを取得する。\n */\nexport async function setupShell(shell?: ShellType, noModify = false): Promise<string> {\n const targetShell = shell || detectShell();\n const rcPath = getShellRcPath(targetShell);\n const snippet = getSnippet(targetShell);\n\n if (noModify) {\n return `Please manually append the following snippet to your shell config file (${rcPath}):\\n\\n${snippet}`;\n }\n\n await fs.ensureDir(path.dirname(rcPath));\n\n let exists = false;\n let content = \"\";\n if (await fs.pathExists(rcPath)) {\n content = await fs.readFile(rcPath, \"utf-8\");\n if (content.includes(\"agent-auto-resume\") || content.includes(\"aar managed\")) {\n exists = true;\n }\n }\n\n if (exists) {\n return `Shell integration snippet already exists in ${rcPath}. Skipping configuration.`;\n }\n\n const newContent = content ? `${content.trimEnd()}\\n\\n${snippet}\\n` : `${snippet}\\n`;\n await fs.writeFile(rcPath, newContent, \"utf-8\");\n return `Successfully updated shell configuration at ${rcPath}.\\nRestart your terminal or run: source ${rcPath}`;\n}\n","import { ensureDirs, loadConfig } from \"../core/session-store.js\";\nimport { setupShell, ShellType, getSnippet } from \"../core/shell-setup.js\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\nexport interface SetupOptions {\n shell?: ShellType;\n noShellModify?: boolean;\n printShellSnippet?: boolean;\n}\n\nexport async function runSetup(options: SetupOptions) {\n console.log(chalk.bold(\"Starting agent-auto-resume setup...\\n\"));\n\n await ensureDirs();\n console.log(chalk.green(\"✓ Initialized state directory at ~/.agent-auto-resume/\"));\n\n await loadConfig();\n console.log(chalk.green(\"✓ Created configuration file config.json\"));\n\n const providers = [\n { name: \"Claude Code\", cmd: \"claude\" },\n { name: \"OpenAI Codex CLI\", cmd: \"codex\" },\n { name: \"Google Antigravity CLI\", cmd: \"agy\" },\n ];\n\n console.log(\"\\nChecking provider CLI commands:\");\n for (const p of providers) {\n try {\n execSync(`which ${p.cmd}`, { stdio: \"ignore\" });\n console.log(chalk.green(` ✓ ${p.name} (${p.cmd}) is installed.`));\n } catch {\n console.log(chalk.yellow(` ⚠ ${p.name} (${p.cmd}) was not found in your PATH.`));\n }\n }\n\n if (options.printShellSnippet) {\n const shell = options.shell || \"zsh\";\n console.log(`\\n--- Shell Snippet for ${shell} ---`);\n console.log(getSnippet(shell));\n console.log(\"---------------------------------\");\n return;\n }\n\n console.log(\"\");\n const resultMessage = await setupShell(options.shell, options.noShellModify);\n console.log(resultMessage);\n}\n","import { spawn } from \"child_process\";\nimport fs from \"fs-extra\";\nimport { isDaemonRunning, readPid } from \"./daemon-ipc.js\";\nimport { LOG_FILE } from \"./logger.js\";\nimport { ensureDirs } from \"./session-store.js\";\n\n/**\n * デーモンをバックグラウンドプロセスとして起動する。\n */\nexport async function startDaemonProcess(options: { tmux?: boolean } = {}): Promise<void> {\n if (await isDaemonRunning()) {\n const pid = await readPid();\n console.log(`Daemon is already running (PID: ${pid}).`);\n return;\n }\n\n await ensureDirs();\n\n const nodeBin = process.argv[0];\n const originalArgs = process.argv.slice(1);\n \n // 'start' 引数を 'run' に置換\n const args = originalArgs.map((arg) => {\n if (arg === \"start\") return \"run\";\n return arg;\n });\n\n // 'run' サブコマンドが含まれていない場合は追加\n if (!args.includes(\"run\")) {\n const daemonIdx = args.indexOf(\"daemon\");\n if (daemonIdx !== -1) {\n args.splice(daemonIdx + 1, 0, \"run\");\n }\n }\n\n // 重複フラグなどのクリーンアップ\n // '--tmux' が重複して指定されないように調整\n const cleanArgs = args.filter((a) => a !== \"start\" && a !== \"restart\");\n if (options.tmux && !cleanArgs.includes(\"--tmux\")) {\n cleanArgs.push(\"--tmux\");\n }\n\n console.log(\"Starting agent-auto-resume daemon in background...\");\n\n const outFd = fs.openSync(LOG_FILE, \"a\");\n const errFd = fs.openSync(LOG_FILE, \"a\");\n\n const child = spawn(nodeBin, cleanArgs, {\n detached: true,\n stdio: [\"ignore\", outFd, errFd],\n env: {\n ...process.env,\n },\n });\n\n child.unref();\n\n // 起動完了を最大2秒待つ\n for (let i = 0; i < 4; i++) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (await isDaemonRunning()) {\n const pid = await readPid();\n console.log(`Daemon started successfully (PID: ${pid}). Log file: ${LOG_FILE}`);\n return;\n }\n }\n\n console.error(\"Failed to start daemon. Please check the log file for errors:\");\n console.error(LOG_FILE);\n}\n\n/**\n * デーモンプロセスを停止する。\n */\nexport async function stopDaemonProcess(): Promise<void> {\n const pid = await readPid();\n if (!pid || !(await isDaemonRunning())) {\n console.log(\"Daemon is not running.\");\n return;\n }\n\n console.log(`Stopping daemon (PID: ${pid})...`);\n try {\n process.kill(pid, \"SIGTERM\");\n \n // 停止するまでポーリングで待つ (最大5秒)\n for (let i = 0; i < 10; i++) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n if (!(await isDaemonRunning())) {\n console.log(\"Daemon stopped successfully.\");\n return;\n }\n }\n \n console.warn(\"Daemon did not respond to SIGTERM. Force killing...\");\n process.kill(pid, \"SIGKILL\");\n console.log(\"Daemon force killed.\");\n } catch (err: any) {\n console.error(`Failed to stop daemon: ${err.message}`);\n }\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport { BASE_DIR, ensureDirs } from \"./session-store.js\";\n\nexport const PID_FILE = path.join(BASE_DIR, \"daemon.pid\");\n\nexport async function writePid(pid: number): Promise<void> {\n await ensureDirs();\n await fs.writeFile(PID_FILE, pid.toString(), \"utf-8\");\n}\n\nexport async function readPid(): Promise<number | undefined> {\n if (!(await fs.pathExists(PID_FILE))) {\n return undefined;\n }\n try {\n const content = await fs.readFile(PID_FILE, \"utf-8\");\n const pid = parseInt(content.trim(), 10);\n return isNaN(pid) ? undefined : pid;\n } catch {\n return undefined;\n }\n}\n\nexport async function clearPid(): Promise<void> {\n if (await fs.pathExists(PID_FILE)) {\n await fs.remove(PID_FILE);\n }\n}\n\nexport async function isDaemonRunning(): Promise<boolean> {\n const pid = await readPid();\n if (!pid) {\n return false;\n }\n try {\n // pid にシグナル 0 を送って生存確認\n process.kill(pid, 0);\n return true;\n } catch (err: any) {\n if (err.code === \"ESRCH\") {\n // 存在しないプロセスなのでPIDファイルをクリーンアップ\n await clearPid();\n return false;\n }\n // EPERM の場合は権限不足だがプロセスは存在している\n return err.code === \"EPERM\";\n }\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\nimport { BASE_DIR, ensureDirs } from \"./session-store.js\";\n\nexport const LOG_FILE = path.join(BASE_DIR, \"daemon.log\");\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nlet currentLogLevel = LogLevel.INFO;\n\nexport function setLogLevel(level: LogLevel) {\n currentLogLevel = level;\n}\n\nasync function writeToFile(message: string) {\n try {\n await ensureDirs();\n const ts = new Date().toISOString();\n // 制御文字 (chalkのカラーコードなど) を削除してログファイルに保存\n const cleanMsg = message.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, \"\");\n await fs.appendFile(LOG_FILE, `[${ts}] ${cleanMsg}\\n`, \"utf-8\");\n } catch {\n // ログ書き込み失敗は静かに無視\n }\n}\n\nfunction formatMessage(prefix: string, message: string, colorFn?: (s: string) => string): string {\n const cleanPrefix = prefix ? `[${prefix}] ` : \"\";\n const formatted = `${cleanPrefix}${message}`;\n return colorFn ? colorFn(formatted) : formatted;\n}\n\nexport const logger = {\n debug(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.DEBUG) {\n const msg = formatMessage(prefix, message, chalk.gray);\n console.log(msg);\n writeToFile(msg);\n }\n },\n\n info(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.INFO) {\n const msg = formatMessage(prefix, message, chalk.blue);\n console.log(msg);\n writeToFile(msg);\n }\n },\n\n warn(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.WARN) {\n const msg = formatMessage(prefix, message, chalk.yellow);\n console.warn(msg);\n writeToFile(msg);\n }\n },\n\n error(message: string, prefix = \"aar\") {\n if (currentLogLevel <= LogLevel.ERROR) {\n const msg = formatMessage(prefix, message, chalk.red);\n console.error(msg);\n writeToFile(msg);\n }\n },\n};\n","import chokidar from \"chokidar\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { loadConfig, resolveHome, createSession, listSessions, updateSession } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { getProvider } from \"../providers/index.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { ProviderName } from \"./types.js\";\n\nconst fileCursors = new Map<string, number>();\n\nexport async function startTranscriptWatcher(abortSignal?: AbortSignal) {\n const config = await loadConfig();\n const watchers: chokidar.FSWatcher[] = [];\n\n const providersToWatch: ProviderName[] = [\"claude\", \"codex\"];\n\n for (const providerName of providersToWatch) {\n const providerConfig = config.providers[providerName];\n if (!providerConfig || !providerConfig.enabled || !providerConfig.watchTranscripts) {\n continue;\n }\n\n const provider = getProvider(providerName);\n if (!provider.parseTranscriptEvent || !provider.getTranscriptDirs) {\n continue;\n }\n\n const dirs = providerConfig.transcriptDirs.map(resolveHome);\n\n for (const dir of dirs) {\n if (!(await fs.pathExists(dir))) {\n logger.debug(`Transcript watch directory does not exist: ${dir}, skipping`, \"aar\");\n continue;\n }\n\n logger.info(`Starting transcript watcher for ${provider.displayName} at ${dir}`, \"aar\");\n const watcher = chokidar.watch(dir, {\n persistent: true,\n ignoreInitial: false,\n });\n\n watcher.on(\"add\", (filePath) => handleFileChange(filePath, providerName));\n watcher.on(\"change\", (filePath) => handleFileChange(filePath, providerName));\n watchers.push(watcher);\n }\n }\n\n abortSignal?.addEventListener(\"abort\", () => {\n for (const w of watchers) {\n w.close();\n }\n logger.info(\"Transcript watchers stopped.\", \"aar\");\n });\n}\n\nasync function handleFileChange(filePath: string, providerName: ProviderName) {\n const ext = path.extname(filePath).toLowerCase();\n if (ext !== \".json\" && ext !== \".jsonl\" && ext !== \"\") {\n return;\n }\n\n try {\n const stat = await fs.stat(filePath);\n const startCursor = fileCursors.get(filePath) || 0;\n \n if (stat.size <= startCursor) {\n fileCursors.set(filePath, stat.size);\n return;\n }\n\n const fd = await fs.open(filePath, \"r\");\n const buffer = Buffer.alloc(stat.size - startCursor);\n await fs.read(fd, buffer, 0, buffer.length, startCursor);\n await fs.close(fd);\n\n fileCursors.set(filePath, stat.size);\n\n const content = buffer.toString(\"utf-8\");\n const lines = content.split(/\\r?\\n/);\n const provider = getProvider(providerName);\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n const event = provider.parseTranscriptEvent!(line);\n if (event && event.text) {\n const detection = detectLimit(event.text, providerName);\n if (detection.matched) {\n logger.warn(`Limit detected via transcript watcher in file ${filePath}: ${detection.reason}`, \"aar\");\n\n const sessions = await listSessions();\n const matchedSession = sessions.find(\n (s) =>\n s.status === \"running\" &&\n s.provider === providerName &&\n (event.cwd ? s.cwd === event.cwd : true)\n );\n\n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n\n if (matchedSession) {\n if (matchedSession.status !== \"waiting_limit_reset\") {\n await updateSession(matchedSession.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: event.text.slice(-1000),\n transcriptPath: filePath,\n });\n logger.info(`Updated existing session ${matchedSession.id} to waiting_limit_reset`, \"aar\");\n }\n } else {\n const config = await loadConfig();\n const newSession = await createSession({\n provider: providerName,\n cwd: event.cwd || process.cwd(),\n originalCommand: provider.defaultCommand,\n resumeStrategy: providerName === \"claude\" ? \"pty-input\" : \"command\",\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n attempts: 0,\n maxAttempts: config.maxAttempts,\n bufferSeconds: config.bufferSeconds,\n lastOutputSnippet: event.text.slice(-1000),\n managedByAar: false,\n source: \"transcript-watcher\",\n transcriptPath: filePath,\n });\n logger.info(`Created new session ${newSession.id} via transcript-watcher`, \"aar\");\n }\n }\n }\n }\n } catch (err: any) {\n logger.debug(`Error reading transcript file ${filePath}: ${err.message}`, \"aar\");\n }\n}\n","export function parseTimeString(str: string, referenceDate: Date = new Date()): Date | undefined {\n // 1. retry_after (秒数)\n // \"retry_after\": 3600, retry_after: 3600, retry after 3600 seconds など\n const retryAfterRegex = /(?:retry_after|retry after)[\"'\\s]*:?\\s*(\\d+)/i;\n const retryAfterMatch = str.match(retryAfterRegex);\n if (retryAfterMatch) {\n const seconds = parseInt(retryAfterMatch[1], 10);\n if (!isNaN(seconds)) {\n return new Date(referenceDate.getTime() + seconds * 1000);\n }\n }\n\n // 2. ISO8601\n // 2026-06-06T15:00:00+09:00, 2026-06-06T15:00:00Z など\n const isoRegex = /(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:?\\d{2})?)/i;\n const isoMatch = str.match(isoRegex);\n if (isoMatch) {\n const parsed = Date.parse(isoMatch[1]);\n if (!isNaN(parsed)) {\n return new Date(parsed);\n }\n }\n\n // 3. YYYY-MM-DD HH:mm(:ss)?\n // 2026-06-06 15:00\n const dateStrRegex = /(\\d{4})-(\\d{2})-(\\d{2})\\s+(\\d{1,2}):(\\d{2})(?::(\\d{2}))?/;\n const dateStrMatch = str.match(dateStrRegex);\n if (dateStrMatch) {\n const year = parseInt(dateStrMatch[1], 10);\n const month = parseInt(dateStrMatch[2], 10) - 1; // 0-indexed\n const day = parseInt(dateStrMatch[3], 10);\n const hour = parseInt(dateStrMatch[4], 10);\n const minute = parseInt(dateStrMatch[5], 10);\n const second = dateStrMatch[6] ? parseInt(dateStrMatch[6], 10) : 0;\n const date = new Date(year, month, day, hour, minute, second);\n if (!isNaN(date.getTime())) {\n return date;\n }\n }\n\n // 4. 時刻のみの表現 (3pm, 3 PM, 15:00, 6:34 AM, resets at 3pm, try again at 6:34 AM など)\n // まず、リセット指示のキーワードに続く時刻表記を探す\n const keywordTimeRegex = /(?:reset|resets|resets_at|try again|try\\s+again\\s+at|at|resets\\s+at|will\\s+reset\\s+at)\\s+(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)?/i;\n const keywordTimeMatch = str.match(keywordTimeRegex);\n\n let hourStr = \"\";\n let minStr = \"\";\n let ampmStr = \"\";\n\n if (keywordTimeMatch) {\n hourStr = keywordTimeMatch[1];\n minStr = keywordTimeMatch[2] || \"0\";\n ampmStr = keywordTimeMatch[3] || \"\";\n } else {\n // 単体での時刻表現に完全一致するか試す\n const exactTimeRegex = /^\\s*(?:at\\s+)?(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)?\\s*$/i;\n const exactMatch = str.match(exactTimeRegex);\n if (exactMatch) {\n hourStr = exactMatch[1];\n minStr = exactMatch[2] || \"0\";\n ampmStr = exactMatch[3] || \"\";\n } else {\n // 部分一致で時刻表現を探す (例: 15:00 や 3pm, 6:34 AM)\n // \"5-hour\" や \"3600\" などの数値単体を誤検知しないよう、コロン(:)を含むか am/pm を伴うものに限定\n const partialTimeRegex = /\\b(\\d{1,2}):(\\d{2})\\s*(am|pm)?\\b|\\b(\\d{1,2})\\s*(am|pm)\\b/i;\n const partialMatch = str.match(partialTimeRegex);\n if (partialMatch) {\n if (partialMatch[1] !== undefined) {\n hourStr = partialMatch[1];\n minStr = partialMatch[2];\n ampmStr = partialMatch[3] || \"\";\n } else {\n hourStr = partialMatch[4];\n minStr = \"0\";\n ampmStr = partialMatch[5];\n }\n }\n }\n }\n\n if (hourStr) {\n let hour = parseInt(hourStr, 10);\n const minute = parseInt(minStr, 10);\n const ampm = ampmStr.toLowerCase();\n\n if (ampm === \"pm\" && hour < 12) {\n hour += 12;\n } else if (ampm === \"am\" && hour === 12) {\n hour = 0;\n }\n\n if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60) {\n const date = new Date(referenceDate);\n date.setHours(hour, minute, 0, 0);\n\n // 設定された時刻が referenceDate (現在時刻) よりも過去であれば翌日とする\n if (date.getTime() <= referenceDate.getTime()) {\n date.setDate(date.getDate() + 1);\n }\n return date;\n }\n }\n\n return undefined;\n}\n","import { AgentProvider, LimitDetection, SessionState } from \"../core/types.js\";\nimport { parseTimeString } from \"../core/time-parser.js\";\n\nexport const claudeProvider: AgentProvider = {\n name: \"claude\",\n displayName: \"Claude Code\",\n defaultCommand: [\"claude\"],\n\n detectLimit(output: string): LimitDetection {\n const lines = output.split(/\\r?\\n/);\n const patterns = [\n /5-hour limit reached/i,\n /usage limit reached/i,\n /rate limit reached/i,\n /limit will reset at/i,\n ];\n\n for (const line of lines) {\n const matched = patterns.some((p) => p.test(line));\n if (matched) {\n const resetAt = parseTimeString(line);\n return {\n matched: true,\n provider: \"claude\",\n reason: line.trim(),\n resetAt,\n raw: line,\n };\n }\n }\n\n return { matched: false, provider: \"claude\" };\n },\n\n getResumeCommand(state: SessionState): string[] {\n return [\"claude\", \"--continue\"];\n },\n\n getResumeInput(state: SessionState): string {\n return \"continue\\n\";\n },\n\n getTranscriptDirs(): string[] {\n return [\"~/.claude/projects\"];\n },\n\n parseTranscriptEvent(line: string) {\n try {\n const data = JSON.parse(line);\n if (data && typeof data === \"object\") {\n // text フィールドは data.text や data.message, または data.input.text など\n let text = data.text || data.message || data.content;\n if (!text && data.input && typeof data.input === \"object\") {\n text = data.input.text;\n }\n if (!text && data.output && typeof data.output === \"object\") {\n text = data.output.text;\n }\n return {\n text: typeof text === \"string\" ? text : undefined,\n cwd: typeof data.cwd === \"string\" ? data.cwd : undefined,\n sessionId: typeof data.sessionId === \"string\" ? data.sessionId : (typeof data.uuid === \"string\" ? data.uuid : undefined),\n timestamp: typeof data.timestamp === \"string\" ? data.timestamp : (typeof data.createdAt === \"string\" ? data.createdAt : undefined),\n };\n }\n } catch {\n // JSONパースエラーは無視\n }\n return undefined;\n },\n};\n","export const CODEX_SAFE_RESUME_PROMPT = `\nContinue the previous task from where it stopped.\n\nBefore making changes:\n1. Inspect the current repository state.\n2. Run git status.\n3. Inspect git diff.\n4. Read AGENT_PROGRESS.md if it exists.\n5. Identify what was already completed and what remains.\n6. Do not overwrite user changes.\n7. Continue only the remaining work.\n8. Run relevant tests if available.\n9. Summarize what changed and what remains.\n`;\n\nexport const ANTIGRAVITY_SAFE_RESUME_PROMPT = `\nContinue the previous task from where it stopped.\n\nBefore making changes:\n1. Inspect the current workspace state.\n2. Run git status.\n3. Inspect git diff.\n4. Read AGENT_PROGRESS.md if it exists.\n5. Identify what was already completed and what remains.\n6. Do not overwrite user changes.\n7. Continue only the remaining work.\n8. Ask for confirmation before destructive operations.\n9. Run relevant tests if available.\n10. Summarize what changed and what remains.\n`;\n\nexport const CLAUDE_SAFE_RESUME_PROMPT = `\nContinue the previous task from where it stopped.\n\nBefore making changes:\n1. Inspect the current repository state.\n2. Run git status.\n3. Inspect git diff.\n4. Read AGENT_PROGRESS.md if it exists.\n5. Continue only the remaining work.\n6. Do not overwrite user changes.\n7. Summarize what changed and what remains.\n`;\n","import { AgentProvider, LimitDetection, SessionState } from \"../core/types.js\";\nimport { parseTimeString } from \"../core/time-parser.js\";\nimport { CODEX_SAFE_RESUME_PROMPT } from \"../prompts/safe-resume.js\";\n\nexport const codexProvider: AgentProvider = {\n name: \"codex\",\n displayName: \"OpenAI Codex CLI\",\n defaultCommand: [\"codex\"],\n\n detectLimit(output: string): LimitDetection {\n const lines = output.split(/\\r?\\n/);\n const patterns = [\n /usage limit reached/i,\n /rate limit reached/i,\n /try again at/i,\n /resets_at/i,\n /usage_limit_reached/i,\n ];\n\n for (const line of lines) {\n const matched = patterns.some((p) => p.test(line));\n if (matched) {\n const resetAt = parseTimeString(line);\n return {\n matched: true,\n provider: \"codex\",\n reason: line.trim(),\n resetAt,\n raw: line,\n };\n }\n }\n\n return { matched: false, provider: \"codex\" };\n },\n\n getResumeCommand(state: SessionState): string[] {\n return [\n \"codex\",\n \"exec\",\n \"resume\",\n \"--last\",\n CODEX_SAFE_RESUME_PROMPT.trim(),\n ];\n },\n\n getTranscriptDirs(): string[] {\n return [\"~/.codex/sessions\"];\n },\n\n parseTranscriptEvent(line: string) {\n try {\n const data = JSON.parse(line);\n if (data && typeof data === \"object\") {\n const text = data.text || data.message || data.content;\n return {\n text: typeof text === \"string\" ? text : undefined,\n cwd: typeof data.cwd === \"string\" ? data.cwd : undefined,\n sessionId: typeof data.sessionId === \"string\" ? data.sessionId : undefined,\n timestamp: typeof data.timestamp === \"string\" ? data.timestamp : undefined,\n };\n }\n } catch {\n // ignore\n }\n return undefined;\n },\n};\n","import { execSync } from \"child_process\";\nimport { AgentProvider, LimitDetection, SessionState } from \"../core/types.js\";\nimport { parseTimeString } from \"../core/time-parser.js\";\nimport { ANTIGRAVITY_SAFE_RESUME_PROMPT } from \"../prompts/safe-resume.js\";\n\nexport const antigravityProvider: AgentProvider = {\n name: \"antigravity\",\n displayName: \"Google Antigravity CLI\",\n defaultCommand: [\"agy\"],\n\n detectLimit(output: string): LimitDetection {\n const lines = output.split(/\\r?\\n/);\n const patterns = [\n /usage limit reached/i,\n /rate limit reached/i,\n /quota exceeded/i,\n /quota exhausted/i,\n /daily limit reached/i,\n /5-hour limit reached/i,\n /reached your Antigravity limit/i,\n /Antigravity usage limit reached/i,\n /try again at/i,\n /reset at/i,\n /resets at/i,\n /resets_at/i,\n /retry after/i,\n /retry_after/i,\n ];\n\n for (const line of lines) {\n const matched = patterns.some((p) => p.test(line));\n if (matched) {\n const resetAt = parseTimeString(line);\n return {\n matched: true,\n provider: \"antigravity\",\n reason: line.trim(),\n resetAt,\n raw: line,\n };\n }\n }\n\n return { matched: false, provider: \"antigravity\" };\n },\n\n async getResumeCommand(state: SessionState): Promise<string[]> {\n let helpOutput = \"\";\n try {\n helpOutput = execSync(\"agy --help\", {\n cwd: state.cwd,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n // agyコマンドが使えない、またはエラーの場合は helpOutput が空になる\n }\n\n if (helpOutput) {\n // 優先順位: agy resume --last -> agy continue -> agy c -> agy conversation --last -> fallback: agy\n if (helpOutput.includes(\"resume\") && helpOutput.includes(\"--last\")) {\n return [\"agy\", \"resume\", \"--last\"];\n }\n if (helpOutput.includes(\"continue\")) {\n return [\"agy\", \"continue\"];\n }\n \n const lines = helpOutput.split(\"\\n\");\n const hasC = lines.some((line) => {\n const trimmed = line.trim();\n return trimmed.startsWith(\"c \") || trimmed.startsWith(\"c\\t\");\n });\n if (hasC) {\n return [\"agy\", \"c\"];\n }\n\n if (helpOutput.includes(\"conversation\") && helpOutput.includes(\"--last\")) {\n return [\"agy\", \"conversation\", \"--last\"];\n }\n }\n\n return [\"agy\"];\n },\n\n getResumeInput(state: SessionState): string | undefined {\n if (state.resumeCommand && state.resumeCommand.length === 1 && state.resumeCommand[0] === \"agy\") {\n return ANTIGRAVITY_SAFE_RESUME_PROMPT.trim() + \"\\n\";\n }\n return undefined;\n },\n\n getTranscriptDirs(): string[] {\n return [];\n },\n};\n","import { claudeProvider } from \"./claude.js\";\nimport { codexProvider } from \"./codex.js\";\nimport { antigravityProvider } from \"./antigravity.js\";\n\nexport const providers = {\n claude: claudeProvider,\n codex: codexProvider,\n antigravity: antigravityProvider,\n} as const;\n\nexport function getProvider(name: string) {\n const normalized = name.toLowerCase();\n if (normalized === \"agy\" || normalized === \"antigravity\") {\n return antigravityProvider;\n }\n if (normalized === \"claude\") {\n return claudeProvider;\n }\n if (normalized === \"codex\") {\n return codexProvider;\n }\n\n throw new Error(`Unsupported provider: ${name}`);\n}\n","import { getProvider } from \"../providers/index.js\";\nimport { ProviderName, LimitDetection } from \"./types.js\";\n\nexport function detectLimit(output: string, providerName?: ProviderName): LimitDetection {\n if (providerName) {\n try {\n const provider = getProvider(providerName);\n return provider.detectLimit(output);\n } catch {\n // ignore and fallback to checking all\n }\n }\n\n const allProviders: ProviderName[] = [\"claude\", \"codex\", \"antigravity\"];\n for (const name of allProviders) {\n const provider = getProvider(name);\n const detection = provider.detectLimit(output);\n if (detection.matched) {\n return detection;\n }\n }\n\n return { matched: false, provider: providerName || \"claude\" };\n}\n","import { execSync } from \"child_process\";\nimport { loadConfig, createSession, listSessions, updateSession } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { ProviderName } from \"./types.js\";\nimport { getProvider } from \"../providers/index.js\";\n\nlet tmuxTimer: NodeJS.Timeout | undefined;\n\nexport async function startTmuxWatcher(abortSignal?: AbortSignal) {\n const config = await loadConfig();\n if (!config.tmux.enabled) {\n return;\n }\n\n try {\n execSync(\"tmux -V\", { stdio: \"ignore\" });\n } catch {\n logger.warn(\"tmux is enabled in config, but 'tmux' command was not found. tmux watcher is disabled.\", \"aar\");\n return;\n }\n\n logger.info(\"Starting tmux watcher (experimental)...\", \"aar\");\n\n const poll = async () => {\n if (abortSignal?.aborted) return;\n try {\n await checkTmuxPanes();\n } catch (err: any) {\n logger.debug(`Error checking tmux panes: ${err.message}`, \"aar\");\n }\n tmuxTimer = setTimeout(poll, config.tmux.pollIntervalMs || 5000);\n };\n\n poll();\n\n abortSignal?.addEventListener(\"abort\", () => {\n if (tmuxTimer) clearTimeout(tmuxTimer);\n logger.info(\"Tmux watcher stopped.\", \"aar\");\n });\n}\n\nasync function checkTmuxPanes() {\n let listOutput = \"\";\n try {\n listOutput = execSync(\"tmux list-panes -a -F '#{pane_id}|#{pane_pid}|#{pane_current_path}|#{pane_current_command}'\", {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n return;\n }\n\n const panes = listOutput.split(\"\\n\").filter(Boolean).map((line) => {\n const [paneId, panePid, paneCwd, paneCmd] = line.split(\"|\");\n return { paneId, panePid, paneCwd, paneCmd };\n });\n\n const providers: { name: ProviderName; cmdKeywords: string[] }[] = [\n { name: \"claude\", cmdKeywords: [\"claude\", \"claude-code\"] },\n { name: \"codex\", cmdKeywords: [\"codex\"] },\n { name: \"antigravity\", cmdKeywords: [\"agy\", \"antigravity\"] },\n ];\n\n for (const pane of panes) {\n const matchedProvider = providers.find((p) =>\n p.cmdKeywords.some((keyword) => pane.paneCmd.toLowerCase().includes(keyword))\n );\n\n if (!matchedProvider) {\n continue;\n }\n\n let paneOutput = \"\";\n try {\n paneOutput = execSync(`tmux capture-pane -p -t ${pane.paneId}`, {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n } catch {\n continue;\n }\n\n const detection = detectLimit(paneOutput, matchedProvider.name);\n if (detection.matched) {\n const sessions = await listSessions();\n let matchedSession = sessions.find((s) => s.tmuxPaneId === pane.paneId && s.status === \"waiting_limit_reset\");\n\n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n\n if (!matchedSession) {\n matchedSession = sessions.find((s) => s.tmuxPaneId === pane.paneId && s.status === \"running\");\n \n if (matchedSession) {\n await updateSession(matchedSession.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: paneOutput.slice(-1000),\n });\n logger.info(`Updated tmux session ${matchedSession.id} to waiting_limit_reset`, \"aar\");\n } else {\n const config = await loadConfig();\n const provider = getProvider(matchedProvider.name);\n const newSession = await createSession({\n provider: matchedProvider.name,\n cwd: pane.paneCwd || process.cwd(),\n originalCommand: provider.defaultCommand,\n resumeStrategy: \"pty-input\",\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n attempts: 0,\n maxAttempts: config.maxAttempts,\n bufferSeconds: config.bufferSeconds,\n lastOutputSnippet: paneOutput.slice(-1000),\n managedByAar: false,\n source: \"tmux-watcher\",\n tmuxPaneId: pane.paneId,\n });\n logger.info(`Created new session ${newSession.id} via tmux-watcher (pane: ${pane.paneId})`, \"aar\");\n }\n }\n }\n }\n}\n\n/**\n * tmux pane に対してキー入力を送信する。\n */\nexport function sendKeysToTmux(paneId: string, keys: string): boolean {\n try {\n // 改行コードなどを適切に解釈して送信\n execSync(`tmux send-keys -t ${paneId} \"${keys.replace(/\"/g, '\\\\\"')}\"`, { stdio: \"ignore\" });\n return true;\n } catch (err: any) {\n logger.error(`Failed to send keys to tmux pane ${paneId}: ${err.message}`, \"aar\");\n return false;\n }\n}\n","import { SessionState } from \"./types.js\";\n\n/**\n * セッション再開までの待機時間(ミリ秒)を計算する。\n * @param state セッション状態\n * @returns 待機時間(ミリ秒)。既に経過している場合は 0 以下の数値。\n */\nexport function getWaitMs(state: SessionState): number {\n if (!state.resetAt) {\n return 0;\n }\n const resetTime = new Date(state.resetAt).getTime();\n const bufferMs = (state.bufferSeconds ?? 120) * 1000;\n const targetTime = resetTime + bufferMs;\n const now = Date.now();\n return targetTime - now;\n}\n\n/**\n * 指定時間、ポーリングを挟みながら非同期に待機する。\n * AbortSignalが渡された場合は、途中で中断可能。\n * @param ms 待機時間(ミリ秒)\n * @param abortSignal 中断シグナル\n */\nexport async function waitMs(ms: number, abortSignal?: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n\n const start = Date.now();\n // 60秒以下でも、より細かく1秒毎にポーリングして中断を確認する\n const checkInterval = 1000;\n\n while (Date.now() - start < ms) {\n if (abortSignal?.aborted) {\n break;\n }\n const remaining = ms - (Date.now() - start);\n const sleepTime = Math.min(remaining, checkInterval);\n await new Promise((resolve) => setTimeout(resolve, sleepTime));\n }\n}\n","import pty from \"node-pty\";\nimport { SessionState } from \"./types.js\";\nimport { updateSession, getSession } from \"./session-store.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { getProvider } from \"../providers/index.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * セッションをバックグラウンド(PTY)で再開し、結果を監視する。\n * @param state セッション情報\n * @returns 再開および実行が成功した場合は true、失敗した、または再度リミットに達した場合は false\n */\nexport async function resumeSessionInBackground(state: SessionState): Promise<boolean> {\n const provider = getProvider(state.provider);\n\n const resumeCommand = await provider.getResumeCommand(state);\n const resumeInput = provider.getResumeInput ? await provider.getResumeInput(state) : undefined;\n\n logger.info(`Resuming session ${state.id} with command: ${resumeCommand.join(\" \")}`, \"aar\");\n\n await updateSession(state.id, {\n status: \"resuming\",\n resumeCommand,\n resumeInput,\n attempts: state.attempts + 1,\n });\n\n const cmd = resumeCommand[0];\n const args = resumeCommand.slice(1);\n\n let ptyProcess: pty.IPty;\n try {\n ptyProcess = pty.spawn(cmd, args, {\n name: \"xterm-color\",\n cols: 80,\n rows: 24,\n cwd: state.cwd,\n env: {\n ...process.env,\n AAR_SESSION_ID: state.id,\n },\n });\n } catch (err: any) {\n logger.error(`Failed to spawn resume command: ${err.message}`, \"aar\");\n await updateSession(state.id, { status: \"failed\" });\n return false;\n }\n\n return new Promise<boolean>((resolve) => {\n\n let limitDetected = false;\n let accumulatedOutput = \"\";\n\n // PTYへの自動プロンプト入力がある場合、プロセス起動を少し待ってから送信する\n if (resumeInput) {\n setTimeout(() => {\n try {\n ptyProcess.write(resumeInput);\n logger.info(`Sent resume input to session ${state.id}: ${JSON.stringify(resumeInput)}`, \"aar\");\n } catch (err: any) {\n logger.error(`Failed to write resume input to PTY: ${err.message}`, \"aar\");\n }\n }, 2000);\n }\n\n ptyProcess.onData(async (data: string) => {\n accumulatedOutput += data;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n logger.debug(`[PTY Output ${state.id}] ${data.trim()}`, \"aar\");\n\n if (!limitDetected) {\n const detection = detectLimit(accumulatedOutput, state.provider);\n if (detection.matched) {\n limitDetected = true;\n logger.warn(`Limit re-detected during resume for session ${state.id}`, \"aar\");\n\n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n await updateSession(state.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: accumulatedOutput.slice(-1000),\n });\n\n try {\n ptyProcess.kill();\n } catch {\n // ignore\n }\n }\n }\n });\n\n ptyProcess.onExit(async (res) => {\n const current = await getSession(state.id);\n if (!current) {\n return resolve(false);\n }\n\n if (current.status === \"resuming\") {\n if (res.exitCode === 0) {\n logger.info(`Session ${state.id} completed successfully.`, \"aar\");\n await updateSession(state.id, { status: \"completed\" });\n resolve(true);\n } else {\n logger.info(`Session ${state.id} exited with code ${res.exitCode}.`, \"aar\");\n await updateSession(state.id, { status: \"failed\" });\n resolve(false);\n }\n } else if (current.status === \"waiting_limit_reset\") {\n resolve(false);\n } else {\n resolve(false);\n }\n });\n });\n}\n","import { loadConfig, getWaitingSessions, updateSession, ensureDirs } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { writePid, clearPid, isDaemonRunning } from \"./daemon-ipc.js\";\nimport { startTranscriptWatcher } from \"./transcript-watcher.js\";\nimport { startTmuxWatcher, sendKeysToTmux } from \"./tmux-watcher.js\";\nimport { getWaitMs } from \"./scheduler.js\";\nimport { resumeSessionInBackground } from \"./process-manager.js\";\nimport { getProvider } from \"../providers/index.js\";\n\nexport interface DaemonOptions {\n tmux?: boolean;\n}\n\nexport class AarDaemon {\n private abortController: AbortController | null = null;\n private timer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n\n async start(options: DaemonOptions = {}) {\n if (await isDaemonRunning()) {\n logger.error(\"Daemon is already running.\", \"aar\");\n process.exit(1);\n }\n\n await ensureDirs();\n await writePid(process.pid);\n logger.info(`Daemon started with PID ${process.pid}`, \"aar\");\n\n this.abortController = new AbortController();\n const config = await loadConfig();\n\n if (options.tmux !== undefined) {\n config.tmux.enabled = options.tmux;\n }\n\n await startTranscriptWatcher(this.abortController.signal);\n if (config.tmux.enabled) {\n await startTmuxWatcher(this.abortController.signal);\n }\n\n const shutdown = async () => {\n logger.info(\"Daemon shutting down...\", \"aar\");\n if (this.timer) {\n clearTimeout(this.timer);\n }\n this.abortController?.abort();\n await clearPid();\n logger.info(\"Daemon stopped.\", \"aar\");\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n const loop = async () => {\n if (this.abortController?.signal.aborted) {\n return;\n }\n if (!this.isProcessing) {\n this.isProcessing = true;\n try {\n await this.processWaitingSessions();\n } catch (err: any) {\n logger.error(`Error in daemon loop: ${err.message}`, \"aar\");\n } finally {\n this.isProcessing = false;\n }\n }\n this.timer = setTimeout(loop, config.daemon.pollIntervalMs || 5000);\n };\n\n loop();\n }\n\n private async processWaitingSessions() {\n const waiting = await getWaitingSessions();\n\n for (const session of waiting) {\n if (!session.resetAt) {\n logger.warn(`Session ${session.id} reset time is unknown. Mark as failed.`, \"aar\");\n await updateSession(session.id, {\n status: \"failed\",\n });\n continue;\n }\n\n const waitMsLeft = getWaitMs(session);\n if (waitMsLeft <= 0) {\n logger.info(`Session ${session.id} is ready to resume (Wait completed).`, \"aar\");\n \n await updateSession(session.id, {\n status: \"ready_to_resume\",\n });\n\n if (session.attempts >= session.maxAttempts) {\n logger.warn(`Session ${session.id} exceeded max resume attempts (${session.maxAttempts}). Mark as failed.`, \"aar\");\n await updateSession(session.id, {\n status: \"failed\",\n });\n continue;\n }\n\n if (session.source === \"tmux-watcher\" && session.tmuxPaneId) {\n const provider = getProvider(session.provider);\n const resumeInput = provider.getResumeInput ? await provider.getResumeInput(session) : undefined;\n \n if (resumeInput) {\n logger.info(`Resuming tmux session ${session.id} in pane ${session.tmuxPaneId}`, \"aar\");\n await updateSession(session.id, {\n status: \"resuming\",\n attempts: session.attempts + 1,\n });\n\n const sent = sendKeysToTmux(session.tmuxPaneId, resumeInput);\n if (sent) {\n await updateSession(session.id, {\n status: \"running\",\n });\n logger.info(`Sent resume input to tmux pane successfully.`, \"aar\");\n } else {\n await updateSession(session.id, {\n status: \"failed\",\n });\n }\n } else {\n await updateSession(session.id, {\n status: \"failed\",\n });\n }\n } else {\n try {\n const success = await resumeSessionInBackground(session);\n if (success) {\n logger.info(`Session ${session.id} resumed and completed successfully.`, \"aar\");\n } else {\n logger.warn(`Session ${session.id} resume failed or hit limit again.`, \"aar\");\n }\n } catch (err: any) {\n logger.error(`Failed to resume session ${session.id}: ${err.message}`, \"aar\");\n await updateSession(session.id, {\n status: \"failed\",\n });\n }\n }\n } else {\n const secondsLeft = Math.ceil(waitMsLeft / 1000);\n logger.debug(`Session ${session.id} waiting... ${secondsLeft}s left`, \"aar\");\n }\n }\n }\n}\n","import { startDaemonProcess, stopDaemonProcess } from \"../core/daemon-client.js\";\nimport { isDaemonRunning, readPid } from \"../core/daemon-ipc.js\";\nimport { LOG_FILE } from \"../core/logger.js\";\nimport { AarDaemon } from \"../core/daemon.js\";\nimport fs from \"fs-extra\";\nimport chalk from \"chalk\";\n\nexport async function handleDaemon(action: string, options: { tmux?: boolean }) {\n const cleanAction = action.toLowerCase();\n \n if (cleanAction === \"start\") {\n await startDaemonProcess(options);\n } else if (cleanAction === \"stop\") {\n await stopDaemonProcess();\n } else if (cleanAction === \"restart\") {\n console.log(\"Restarting daemon...\");\n await stopDaemonProcess();\n await startDaemonProcess(options);\n } else if (cleanAction === \"status\") {\n const running = await isDaemonRunning();\n if (running) {\n const pid = await readPid();\n console.log(chalk.green(`Daemon is RUNNING (PID: ${pid})`));\n } else {\n console.log(chalk.red(\"Daemon is STOPPED\"));\n }\n } else if (cleanAction === \"logs\") {\n if (await fs.pathExists(LOG_FILE)) {\n const content = await fs.readFile(LOG_FILE, \"utf-8\");\n console.log(content);\n } else {\n console.log(\"No log file found.\");\n }\n } else if (cleanAction === \"run\") {\n const daemon = new AarDaemon();\n await daemon.start(options);\n } else {\n console.error(`Unknown daemon action: ${action}`);\n process.exit(1);\n }\n}\n","import pty from \"node-pty\";\nimport { spawn, ChildProcess } from \"child_process\";\nimport { SessionState, ProviderName } from \"./types.js\";\nimport { detectLimit } from \"./detector.js\";\nimport { createSession, updateSession, loadConfig, getSession } from \"./session-store.js\";\nimport { logger } from \"./logger.js\";\nimport { getProvider } from \"../providers/index.js\";\n\n\nexport interface PtyRunnerOptions {\n providerName: ProviderName;\n command: string;\n args: string[];\n cwd?: string;\n sessionId?: string;\n}\n\nexport async function runInPty(options: PtyRunnerOptions): Promise<void> {\n const { providerName, command, args, cwd = process.cwd(), sessionId } = options;\n\n const config = await loadConfig();\n const provider = getProvider(providerName);\n\n let session: SessionState;\n if (sessionId) {\n const existing = await getSession(sessionId);\n if (existing) {\n session = existing;\n } else {\n throw new Error(`Session ${sessionId} not found`);\n }\n } else {\n session = await createSession({\n provider: providerName,\n cwd,\n originalCommand: [command, ...args],\n resumeStrategy: providerName === \"claude\" ? \"pty-input\" : \"command\",\n status: \"running\",\n attempts: 0,\n maxAttempts: config.maxAttempts,\n bufferSeconds: config.bufferSeconds,\n managedByAar: true,\n source: \"managed-pty\",\n });\n }\n\n logger.info(`Managed session started: ${session.id}`, \"aar\");\n\n const isInteractive = !!process.stdout.isTTY;\n const isServerMode = args.some((arg) =>\n arg.includes(\"app-server\") ||\n arg.includes(\"--listen\") ||\n arg.includes(\"stdio\") ||\n arg.includes(\"mcp\")\n );\n\n if (isServerMode || !isInteractive) {\n await runInPipe(session, command, args, cwd);\n return;\n }\n\n const ptyProcess = pty.spawn(command, args, {\n name: \"xterm-color\",\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n cwd,\n env: {\n ...process.env,\n AAR_SESSION_ID: session.id,\n },\n });\n\n await updateSession(session.id, { pid: ptyProcess.pid, status: \"running\" });\n\n\n let limitDetected = false;\n let accumulatedOutput = \"\";\n\n const resizeHandler = () => {\n try {\n ptyProcess.resize(process.stdout.columns || 80, process.stdout.rows || 24);\n } catch {\n // ignore\n }\n };\n process.stdout.on(\"resize\", resizeHandler);\n\n const stdinHandler = (data: Buffer) => {\n ptyProcess.write(data.toString());\n };\n \n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n process.stdin.on(\"data\", stdinHandler);\n\n ptyProcess.onData(async (data: string) => {\n process.stdout.write(data);\n \n accumulatedOutput += data;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n if (!limitDetected) {\n const detection = detectLimit(accumulatedOutput, providerName);\n if (detection.matched) {\n limitDetected = true;\n \n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n \n logger.warn(`Usage limit detected for ${provider.displayName}!`, \"aar\");\n if (resetAtStr) {\n logger.warn(`Resets at: ${detection.resetAt?.toLocaleString()}`, \"aar\");\n } else {\n logger.warn(\"Reset time not specified. Auto-resume will fail without manual intervention or retry-now.\", \"aar\");\n }\n\n await updateSession(session.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: accumulatedOutput.slice(-1000),\n });\n\n console.log(`\\n\\n\\x1b[33m[aar] Usage limit detected. Setting session to waiting state...\\x1b[0m`);\n console.log(`\\x1b[33m[aar] Session ID: ${session.id}\\x1b[0m`);\n if (resetAtStr) {\n console.log(`\\x1b[33m[aar] Scheduled to resume after reset time + buffer seconds.\\x1b[0m`);\n } else {\n console.log(`\\x1b[31m[aar] Warning: Reset time unknown. Run 'aar retry-now --id ${session.id}' manually if needed.\\x1b[0m`);\n }\n\n try {\n ptyProcess.kill();\n } catch {\n // ignore\n }\n }\n }\n });\n\n ptyProcess.onExit(async (res) => {\n process.stdout.off(\"resize\", resizeHandler);\n process.stdin.off(\"data\", stdinHandler);\n try {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n process.stdin.pause();\n } catch {\n // ignore\n }\n\n const currentSession = await getSession(session.id);\n if (currentSession) {\n if (currentSession.status === \"running\") {\n await updateSession(session.id, {\n status: res.exitCode === 0 ? \"completed\" : \"failed\",\n pid: undefined,\n });\n } else if (currentSession.status === \"waiting_limit_reset\") {\n await updateSession(session.id, {\n pid: undefined,\n });\n }\n }\n\n process.exit(res.exitCode);\n });\n}\n\nasync function runInPipe(\n session: SessionState,\n command: string,\n args: string[],\n cwd: string\n): Promise<void> {\n let child: ChildProcess;\n child = spawn(command, args, {\n cwd,\n env: {\n ...process.env,\n AAR_SESSION_ID: session.id,\n },\n });\n\n await updateSession(session.id, { pid: child.pid, status: \"running\" });\n\n\n let limitDetected = false;\n let accumulatedOutput = \"\";\n\n if (child.stdin) {\n process.stdin.pipe(child.stdin);\n }\n\n if (child.stdout) {\n child.stdout.on(\"data\", (data: Buffer) => {\n process.stdout.write(data);\n\n const str = data.toString(\"utf-8\");\n accumulatedOutput += str;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n checkLimit(str);\n });\n }\n\n if (child.stderr) {\n child.stderr.on(\"data\", (data: Buffer) => {\n process.stderr.write(data);\n\n const str = data.toString(\"utf-8\");\n accumulatedOutput += str;\n if (accumulatedOutput.length > 8192) {\n accumulatedOutput = accumulatedOutput.slice(-4096);\n }\n\n checkLimit(str);\n });\n }\n\n async function checkLimit(str: string) {\n if (!limitDetected) {\n const detection = detectLimit(accumulatedOutput, session.provider);\n if (detection.matched) {\n limitDetected = true;\n \n const resetAtStr = detection.resetAt ? detection.resetAt.toISOString() : undefined;\n \n logger.warn(`Usage limit detected for ${session.provider}!`, \"aar\");\n\n await updateSession(session.id, {\n status: \"waiting_limit_reset\",\n lastLimitDetectedAt: new Date().toISOString(),\n resetAt: resetAtStr,\n lastOutputSnippet: accumulatedOutput.slice(-1000),\n });\n\n try {\n child.kill();\n } catch {\n // ignore\n }\n }\n }\n }\n\n return new Promise<void>((resolve) => {\n child.on(\"exit\", async (code) => {\n const currentSession = await getSession(session.id);\n if (currentSession) {\n if (currentSession.status === \"running\") {\n await updateSession(session.id, {\n status: code === 0 ? \"completed\" : \"failed\",\n pid: undefined,\n });\n } else if (currentSession.status === \"waiting_limit_reset\") {\n await updateSession(session.id, {\n pid: undefined,\n });\n }\n }\n process.exit(code || 0);\n });\n });\n}\n","import { runInPty } from \"../core/pty-runner.js\";\nimport { ProviderName } from \"../core/types.js\";\nimport { getProvider } from \"../providers/index.js\";\n\nexport async function runManaged(providerNameStr: string, args: string[]) {\n let providerName: ProviderName;\n try {\n const prov = getProvider(providerNameStr);\n providerName = prov.name;\n } catch (err: any) {\n console.error(err.message);\n process.exit(1);\n }\n\n if (args.length === 0) {\n console.error(\"No command specified. Usage: aar managed <provider> -- <command...>\");\n process.exit(1);\n }\n\n const command = args[0];\n const cmdArgs = args.slice(1);\n\n await runInPty({\n providerName,\n command,\n args: cmdArgs,\n cwd: process.cwd(),\n });\n}\n","import { runManaged } from \"./managed.js\";\n\nexport async function runGeneric(options: { provider?: string }, args: string[]) {\n if (!options.provider) {\n console.error(\"Provider must be specified via --provider <provider>\");\n process.exit(1);\n }\n await runManaged(options.provider, args);\n}\n","import { isDaemonRunning, readPid } from \"../core/daemon-ipc.js\";\nimport { getWaitingSessions } from \"../core/session-store.js\";\nimport { getWaitMs } from \"../core/scheduler.js\";\nimport chalk from \"chalk\";\n\nexport async function runStatus(options: { json?: boolean }) {\n const daemonRunning = await isDaemonRunning();\n const daemonPid = await readPid();\n const waitingSessions = await getWaitingSessions();\n\n const statusData = {\n daemon: {\n running: daemonRunning,\n pid: daemonPid,\n },\n waitingSessions: waitingSessions.map((s) => {\n const waitMs = getWaitMs(s);\n const nextResume = s.resetAt\n ? new Date(new Date(s.resetAt).getTime() + (s.bufferSeconds ?? 120) * 1000)\n : null;\n return {\n id: s.id,\n provider: s.provider,\n cwd: s.cwd,\n attempts: s.attempts,\n resetAt: s.resetAt,\n nextResumeAt: nextResume ? nextResume.toISOString() : null,\n secondsLeft: waitMs > 0 ? Math.ceil(waitMs / 1000) : 0,\n };\n }),\n };\n\n if (options.json) {\n console.log(JSON.stringify(statusData, null, 2));\n return;\n }\n\n console.log(chalk.bold(\"--- agent-auto-resume status ---\"));\n if (daemonRunning) {\n console.log(`Daemon Status: ${chalk.green(\"RUNNING\")} (PID: ${daemonPid})`);\n } else {\n console.log(`Daemon Status: ${chalk.red(\"STOPPED\")}`);\n }\n\n console.log(`\\nWaiting Sessions (${waitingSessions.length}):`);\n if (waitingSessions.length === 0) {\n console.log(\" No waiting sessions.\");\n } else {\n for (const s of statusData.waitingSessions) {\n console.log(`\\n Session ID: ${chalk.cyan(s.id)} [${s.provider}]`);\n console.log(` CWD: ${s.cwd}`);\n console.log(` Attempts: ${s.attempts}`);\n if (s.resetAt) {\n console.log(` Limit reset time: ${new Date(s.resetAt).toLocaleString()}`);\n console.log(` Auto-resume scheduled: ${s.nextResumeAt ? new Date(s.nextResumeAt).toLocaleString() : \"Unknown\"}`);\n console.log(` Time remaining: ${s.secondsLeft > 0 ? `${s.secondsLeft}s` : \"Ready to resume\"}`);\n } else {\n console.log(` ${chalk.yellow(\"Warning: Reset time unknown. Auto-resume will not happen automatically.\")}`);\n }\n }\n }\n}\n","import { listSessions } from \"../core/session-store.js\";\nimport chalk from \"chalk\";\n\nexport async function runSessions(options: { json?: boolean }) {\n const sessions = await listSessions();\n\n if (options.json) {\n console.log(JSON.stringify(sessions, null, 2));\n return;\n }\n\n console.log(chalk.bold(`--- agent-auto-resume sessions (${sessions.length}) ---`));\n if (sessions.length === 0) {\n console.log(\"No sessions found.\");\n return;\n }\n\n for (const s of sessions) {\n const statusColor =\n s.status === \"completed\"\n ? chalk.green\n : s.status === \"waiting_limit_reset\"\n ? chalk.yellow\n : s.status === \"failed\"\n ? chalk.red\n : s.status === \"running\"\n ? chalk.blue\n : chalk.gray;\n\n console.log(`\\nSession ID: ${chalk.cyan(s.id)} [${s.provider}]`);\n console.log(` Status: ${statusColor(s.status)}`);\n console.log(` CWD: ${s.cwd}`);\n console.log(` Created: ${new Date(s.createdAt).toLocaleString()}`);\n console.log(` Command: ${s.originalCommand.join(\" \")}`);\n if (s.resetAt) {\n console.log(` Reset time: ${new Date(s.resetAt).toLocaleString()}`);\n }\n }\n}\n","import { getSession, getLastSession, getRecoverableSessions, updateSession } from \"../core/session-store.js\";\nimport { resumeSessionInBackground } from \"../core/process-manager.js\";\nimport chalk from \"chalk\";\n\nexport async function runRecover(options: { last?: boolean; id?: string }) {\n let session;\n\n if (options.id) {\n session = await getSession(options.id);\n if (!session) {\n console.error(chalk.red(`Error: Session with ID ${options.id} not found.`));\n process.exit(1);\n }\n } else if (options.last) {\n session = await getLastSession();\n if (!session) {\n console.error(chalk.red(\"Error: No sessions found.\"));\n process.exit(1);\n }\n } else {\n const recoverable = await getRecoverableSessions();\n if (recoverable.length === 0) {\n console.log(\"No recoverable sessions found.\");\n return;\n }\n console.log(chalk.bold(\"Recoverable sessions:\"));\n for (const r of recoverable) {\n console.log(` - ID: ${chalk.cyan(r.id)} [${r.provider}] Status: ${r.status} (${r.originalCommand.join(\" \")})`);\n }\n console.log(\"\\nUse 'aar recover --id <session-id>' or 'aar recover --last' to recover.\");\n return;\n }\n\n const recoverableStatuses = [\"waiting_limit_reset\", \"ready_to_resume\", \"failed\", \"resuming\", \"cancelled\"];\n if (!recoverableStatuses.includes(session.status)) {\n console.warn(chalk.yellow(`Warning: Session ${session.id} status is '${session.status}', which might not need recovery.`));\n }\n\n console.log(`Attempting to recover session ${chalk.cyan(session.id)}...`);\n await updateSession(session.id, {\n source: \"manual-recover\",\n });\n\n const success = await resumeSessionInBackground(session);\n if (success) {\n console.log(chalk.green(`✓ Session ${session.id} recovered and completed successfully.`));\n } else {\n console.log(chalk.red(`✗ Recovery failed or session hit limit again. Status is currently saved.`));\n }\n}\n","import { getSession, getLastSession, updateSession } from \"../core/session-store.js\";\nimport { getWaitMs } from \"../core/scheduler.js\";\nimport { resumeSessionInBackground } from \"../core/process-manager.js\";\nimport chalk from \"chalk\";\n\nexport async function runRetryNow(options: { id?: string; last?: boolean; force?: boolean }) {\n let session;\n\n if (options.id) {\n session = await getSession(options.id);\n if (!session) {\n console.error(chalk.red(`Error: Session with ID ${options.id} not found.`));\n process.exit(1);\n }\n } else if (options.last) {\n session = await getLastSession();\n if (!session) {\n console.error(chalk.red(\"Error: No sessions found.\"));\n process.exit(1);\n }\n } else {\n console.error(chalk.red(\"Error: Must specify either --id <session-id> or --last.\"));\n process.exit(1);\n }\n\n const waitMs = getWaitMs(session);\n if (waitMs > 0 && !options.force) {\n const secondsLeft = Math.ceil(waitMs / 1000);\n console.log(chalk.yellow(`Warning: Limit reset time has not yet passed for session ${session.id}.`));\n console.log(`Time remaining: ${secondsLeft} seconds.`);\n console.log(\"Run with '--force' to retry immediately (not recommended).\");\n return;\n }\n\n console.log(`Starting immediate retry for session ${chalk.cyan(session.id)}...`);\n await updateSession(session.id, {\n status: \"ready_to_resume\",\n });\n\n const success = await resumeSessionInBackground(session);\n if (success) {\n console.log(chalk.green(`✓ Session ${session.id} resumed and completed successfully.`));\n } else {\n console.log(chalk.red(`✗ Retry failed or hit limit again.`));\n }\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport os from \"os\";\nimport { execSync } from \"child_process\";\n\n// ホームディレクトリ解決用の補助関数\nfunction resolveHome(p: string): string {\n if (p.startsWith(\"~\")) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\n// aarの絶対パスを取得する\nfunction getAarPath(): string {\n try {\n const whichAar = execSync(\"which aar\", { encoding: \"utf8\" }).trim();\n if (whichAar) return whichAar;\n } catch {\n // ignore\n }\n // フォールバック(典型的なグローバルインストール先)\n const home = os.homedir();\n const possiblePaths = [\n path.join(home, \".hermes/node/bin/aar\"),\n path.join(home, \".npm-global/bin/aar\"),\n \"/usr/local/bin/aar\",\n \"/opt/homebrew/bin/aar\",\n ];\n for (const p of possiblePaths) {\n if (fs.existsSync(p)) return p;\n }\n return \"aar\"; // 最悪フォールバック\n}\n\ninterface IntegrationTarget {\n name: string;\n originalPath: string;\n backupPath: string;\n provider: string;\n getWrapperContent: (aarPath: string) => string;\n}\n\nconst targets: Record<string, IntegrationTarget[]> = {\n codex: [\n {\n name: \"Codex Mac App\",\n originalPath: \"/Applications/Codex.app/Contents/Resources/codex\",\n backupPath: \"/Applications/Codex.app/Contents/Resources/codex.orig\",\n provider: \"codex\",\n getWrapperContent: (aarPath) => `#!/bin/bash\n# original internal binary: /Applications/Codex.app/Contents/Resources/codex.orig\n\nif [ -x \"${aarPath}\" ]; then\n exec \"${aarPath}\" managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig \"$@\"\nelif command -v aar >/dev/null 2>&1; then\n exec aar managed codex -- /Applications/Codex.app/Contents/Resources/codex.orig \"$@\"\nelse\n exec /Applications/Codex.app/Contents/Resources/codex.orig \"$@\"\nfi\n`,\n },\n ],\n antigravity: [\n {\n name: \"Antigravity Mac App Server\",\n originalPath: \"/Applications/Antigravity.app/Contents/Resources/bin/language_server\",\n backupPath: \"/Applications/Antigravity.app/Contents/Resources/bin/language_server.orig\",\n provider: \"antigravity\",\n getWrapperContent: (aarPath) => `#!/bin/bash\n# original internal binary: /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig\n\nif [ -x \"${aarPath}\" ]; then\n exec \"${aarPath}\" managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig \"$@\"\nelif command -v aar >/dev/null 2>&1; then\n exec aar managed antigravity -- /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig \"$@\"\nelse\n exec /Applications/Antigravity.app/Contents/Resources/bin/language_server.orig \"$@\"\nfi\n`,\n },\n {\n name: \"Antigravity CLI (agy)\",\n originalPath: \"~/.local/bin/agy\",\n backupPath: \"~/.local/bin/agy.orig\",\n provider: \"antigravity\",\n getWrapperContent: (aarPath) => `#!/bin/bash\n# original system binary: \\$HOME/.local/bin/agy.orig\n\nif [ -x \"${aarPath}\" ]; then\n exec \"${aarPath}\" managed antigravity -- \"\\$HOME/.local/bin/agy.orig\" \"$@\"\nelif command -v aar >/dev/null 2>&1; then\n exec aar managed antigravity -- \"\\$HOME/.local/bin/agy.orig\" \"$@\"\nelse\n exec \"\\$HOME/.local/bin/agy.orig\" \"$@\"\nfi\n`,\n },\n ],\n};\n\nexport async function runIntegrate(appName: string) {\n const aarPath = getAarPath();\n const keys = appName === \"all\" ? Object.keys(targets) : [appName];\n\n for (const key of keys) {\n const appTargets = targets[key];\n if (!appTargets) {\n console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);\n process.exit(1);\n }\n\n console.log(`Setting up integration for ${key}...`);\n for (const t of appTargets) {\n const orig = resolveHome(t.originalPath);\n const backup = resolveHome(t.backupPath);\n\n if (!fs.existsSync(orig) && !fs.existsSync(backup)) {\n console.warn(` [Skip] ${t.name} not found at ${orig}`);\n continue;\n }\n\n try {\n // 1. すでに退避済みの場合はスキップ、または退避\n if (!fs.existsSync(backup)) {\n await fs.move(orig, backup);\n console.log(` [Backuped] ${orig} -> ${backup}`);\n }\n\n // 2. ラッパースクリプトの書き出し\n const content = t.getWrapperContent(aarPath);\n await fs.writeFile(orig, content, \"utf-8\");\n await fs.chmod(orig, 0o755);\n console.log(` [Integrated] Created wrapper at ${orig}`);\n } catch (err: any) {\n console.error(` [Error] Failed to integrate ${t.name}: ${err?.message}`);\n }\n }\n }\n console.log(\"Integration setup completed.\");\n}\n\nexport async function runUnintegrate(appName: string) {\n const keys = appName === \"all\" ? Object.keys(targets) : [appName];\n\n for (const key of keys) {\n const appTargets = targets[key];\n if (!appTargets) {\n console.error(`Unknown integration app: ${appName}. Supported: codex, antigravity, all`);\n process.exit(1);\n }\n\n console.log(`Reverting integration for ${key}...`);\n for (const t of appTargets) {\n const orig = resolveHome(t.originalPath);\n const backup = resolveHome(t.backupPath);\n\n if (!fs.existsSync(backup)) {\n console.warn(` [Skip] Backup for ${t.name} not found at ${backup}`);\n continue;\n }\n\n try {\n // 1. ラッパーを削除(あれば)\n if (fs.existsSync(orig)) {\n await fs.remove(orig);\n }\n // 2. バックアップを元の位置に復元\n await fs.move(backup, orig);\n console.log(` [Restored] Reverted ${backup} -> ${orig}`);\n } catch (err: any) {\n console.error(` [Error] Failed to unintegrate ${t.name}: ${err?.message}`);\n }\n }\n }\n console.log(\"Unintegration completed.\");\n}\n"],"mappings":"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","names":["path","fs","fs","path","fs","path","fs","path","fs","path","fs","chalk","path","fs","chalk","fs","path","fs","execSync","execSync","fs","path","execSync","execSync","fs","chalk","pty","spawn","pty","spawn","chalk","chalk","chalk","chalk","fs","path","os","execSync","resolveHome"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-auto-resume",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
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": {