gencow 0.1.96 → 0.1.98

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/bin/gencow.mjs CHANGED
@@ -1480,9 +1480,16 @@ ${hasPrompt ? `
1480
1480
  const config = loadConfig();
1481
1481
  log(`\n${BOLD}${CYAN}Gencow DB Generate${RESET}\n`);
1482
1482
  info("Generating migration files from schema.ts...");
1483
- runInServer("pnpm db:generate", buildEnv(config));
1484
- success("Migration files generated in migrations/");
1485
- log(` ${DIM}Run 'gencow db:migrate' to apply, or let the server apply on startup${RESET}\n`);
1483
+ if (isMonorepo()) {
1484
+ runInServer("pnpm db:generate", buildEnv(config));
1485
+ } else {
1486
+ // Standalone: npx drizzle-kit generate (프롬프트 패스스루)
1487
+ execSync("npx drizzle-kit generate", {
1488
+ cwd: process.cwd(),
1489
+ stdio: "inherit",
1490
+ });
1491
+ }
1492
+ success("Migration files generated in gencow/migrations/");
1486
1493
  },
1487
1494
 
1488
1495
  // ── db:migrate ───────────────────────────────────────
@@ -3516,6 +3523,7 @@ process.exit(0);
3516
3523
  let followFailures = 0;
3517
3524
  let followTimer = null;
3518
3525
  let followWs = null;
3526
+ let followOpenedAt = 0; // 안정 연결 판정용 (open 시각)
3519
3527
 
3520
3528
  async function connectFollowStream() {
3521
3529
  const wsUrl = `ws://localhost:${port}/ws`;
@@ -3531,7 +3539,8 @@ process.exit(0);
3531
3539
  }
3532
3540
 
3533
3541
  followWs.on("open", () => {
3534
- followFailures = 0; // 성공 실패 카운터 리셋
3542
+ // 카운터 리셋은 close 이벤트에서 안정 연결 판정 후 수행
3543
+ followOpenedAt = Date.now();
3535
3544
  success("Connected — streaming logs...\n");
3536
3545
  followWs.send(JSON.stringify({ type: "log:subscribe" }));
3537
3546
  });
@@ -3560,6 +3569,11 @@ process.exit(0);
3560
3569
  });
3561
3570
 
3562
3571
  followWs.on("close", () => {
3572
+ // 5초 이상 유지된 안정 연결이면 카운터 리셋 (정상 운영 중 일시 끊김)
3573
+ const wasStable = (Date.now() - followOpenedAt) > 5000;
3574
+ if (wasStable) {
3575
+ followFailures = 0;
3576
+ }
3563
3577
  followFailures++;
3564
3578
  if (followFailures > FOLLOW_MAX_FAILURES) {
3565
3579
  error(`연결 불가 — 앱 상태를 확인하세요.`);
@@ -3981,6 +3995,7 @@ process.exit(0);
3981
3995
  // ── WebSocket 실시간 로그 스트리밍 ─────────────────
3982
3996
  let logWs = null;
3983
3997
  let reconnectTimer = null;
3998
+ let logWsOpenedAt = 0; // 안정 연결 판정용 (open 시각)
3984
3999
 
3985
4000
  async function connectLogStream() {
3986
4001
  const { WebSocket: WS } = await import("ws");
@@ -3995,7 +4010,8 @@ process.exit(0);
3995
4010
  }
3996
4011
 
3997
4012
  logWs.on("open", () => {
3998
- reconnectFailures = 0; // 연결 성공 실패 카운터 리셋
4013
+ // 카운터 리셋은 close 이벤트에서 안정 연결 판정 수행
4014
+ logWsOpenedAt = Date.now();
3999
4015
  log(`${DIM}${new Date().toLocaleTimeString("en-US", { hour12: false })}${RESET} ${GREEN}[log]${RESET} 로그 스트리밍 연결됨`);
4000
4016
  logWs.send(JSON.stringify({ type: "log:subscribe" }));
4001
4017
  });
@@ -4013,6 +4029,11 @@ process.exit(0);
4013
4029
  });
4014
4030
 
4015
4031
  logWs.on("close", () => {
4032
+ // 5초 이상 유지된 안정 연결이면 카운터 리셋 (정상 운영 중 일시 끊김)
4033
+ const wasStable = (Date.now() - logWsOpenedAt) > 5000;
4034
+ if (wasStable) {
4035
+ reconnectFailures = 0;
4036
+ }
4016
4037
  reconnectFailures++;
4017
4038
  if (reconnectFailures > MAX_RECONNECT_FAILURES) {
4018
4039
  warn(`[log] 로그 스트리밍 ${MAX_RECONNECT_FAILURES}회 연속 실패. 재연결 중단.`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gencow",
3
- "version": "0.1.96",
3
+ "version": "0.1.98",
4
4
  "description": "Gencow — AI Backend Engine",
5
5
  "type": "module",
6
6
  "bin": {
package/server/index.js CHANGED
@@ -82589,6 +82589,9 @@ async function main() {
82589
82589
  const hasStatic = !!appRow.staticDeployedAt;
82590
82590
  const upgradeHeader = (c.req.header("upgrade") || "").toLowerCase();
82591
82591
  if (upgradeHeader === "websocket" && bunServer) {
82592
+ if (!hasBackend) {
82593
+ return c.json({ error: "WebSocket not available \u2014 this app has no backend process" }, 426);
82594
+ }
82592
82595
  const upgraded = bunServer.upgrade(c.req.raw, {
82593
82596
  data: { proxyPort: appPort, proxyPath: pathname }
82594
82597
  });